这里写自定义目录标题
- docker网络
- 1 - 创建docker网络
- 2 - 创建MYSQL容器实例
- 3 - 创建SpringBoot应用
docker网络
docker网络有三种模式:
1 - none
2 - host
3 - 桥接
本文演示以下内容:
1 - 将应用打包成镜像,并以容器的方式运行;
2 - 容器持久化mysql数据库
3 - 使应用容器可以通过固定名称连接数据库容器,而不是通过ip连接。
基本思路就是:
1 - 创建一个docker内部网络发布应用和数据库
2 - 通过docker的端口映射将服务暴露给外部
1 - 创建docker网络
docker network create --driver bridge --subnet 192.168.45.0/24 --gateway 192.168.45.1 app_net
参数解释:
–driver 网络模式,默认就是桥接
–subnet 子网
–gateway 网管,默认子网第一个IP
此时就创建了一个名为app_net的网络,我们的应用和数据库会发布到这个网络。
2 - 创建MYSQL容器实例
1 - docker pull mysql #拉取最新镜像
2 - docker run -d
–name mysql_8
–net mynet
-v /docker/volume/mysql:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
mysql #启动实例
参数解释:
-d 以后台方式运行
–name 容器名称。
–net 容器运行在哪个网络下。不指定就是docker0网络,该网络有弊端,比如只能通过ip连接容器,而不能通过容器名称(相当于DNS域名)连接容器,所以生产环境一般不用该网络
-v 数据卷挂载。将本地/docker/volume/mysql:/var/lib/mysql文件夹挂在到容器中/var/lib/mysql文件夹下,/var/lib/mysql中存放的是数据库数据
-e 设置容器环境变量。MYSQL_ROOT_PASSWORD是root用户登录数据库使用的密码
此时,我们可以查看数据库在mynet网络下的IP地址
docker inspect mynet
此时,ping 192.168.45.2可以ping通,但是ping mysql_8是ping不通的,所以用容器名表示域名只能用在容器之间,而不能用在宿主机与容器之间。要想宿主机能够识别mysql_8,可以在hosts中配置
192.168.45.2 mysql_8
此时,在宿主机,通过mysql -hmysql_8 -uroot -p123456就可以登录容器中的数据库;或者进入容器之后再登录mysql
2.1 - 进入容器
docker exec -it mysql_8 /bin/bash
2.2 - 在容器中登录数据库
mysql -uroot -p123456
3 - 创建数据库和表
CREATE TABLE student (
SNO VARCHAR(3) NOT NULL ,
SNAME VARCHAR(9) NOT NULL ,
SSEX CHAR(2) NOT NULL
);
INSERT INTO student VALUES ('001', 'KangKang', 'M ');
INSERT INTO student VALUES ('002', 'Mike', 'M ');
INSERT INTO student VALUES ('003', 'Jane', 'F ');
3 - 创建SpringBoot应用
应用是通过ID查找学生,jar包名称叫app_mysql.jar
server:
port: 9090
tomcat:
uri-encoding: UTF-8
context-path: /web
spring:
datasource:
url: jdbc:mysql://mysql_8:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database: MYSQL
show-sql: true
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.springboot.bean
logging:
level:
com:
springboot:
mapper:
debug
<select id="selectStudentInfo" parameterType="string" resultType="com.springboot.bean.Student">
select * from student where sno = #{id}
</select>
public class Student implements Serializable{
private String sno;
private String sname;
private String ssex;
//getter and setter
}
打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.springboot.Application</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
编写Dockerfile文件,文件名字就叫Dockerfile,不能改。
FROM java:8
#将app_mysql.jar复制为/home/docker_mysql.jar
ADD docker_mysql.jar /home/docker_mysql.jar
#要和server.port一致
EXPOSE 9090
#容器启动后,内部执行该命令,启动jar包
CMD ["java","-jar","/home/docker_mysql.jar"]
将app_mysql.jar上传到服务器,与Dockerfile放到同一文件夹下,该文件夹下不要有其他文件。在所在文件夹下打包镜像
docker build -t myapp . #注意最后的点
此时执行docker images会看到自己刚刚制作的镜像,。
启动镜像
docker run -d \
--name myapp_container \
--net mynet \
-p 9090:9090 \
myapp
验证
curl localhost:9090/web/student?id=001