内容:
1.Docker开启远程管理API
首先我们需要开启Docker的远程管理API。
- 用vim编辑器修改
docker.service
文件;
vim /usr/lib/systemd/system/docker.service
- 需要修改的部分:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
- 修改后的部分:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
- 修改配置后需要重新启动Docker服务才能生效;
systemctl daemon-reload
systemctl restart docker
- 开启防火墙打开的Docker远程管理API端口
2375
。
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
2.使用Maven构建Docker镜像
- 在应用的
pom.xml
文件中添加docker-maven-plugin
插件的依赖;
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${docker.maven.plugin.version}</version>
<executions>
<!--如果想在项目打包时构建镜像添加-->
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- Docker 远程管理地址-->
<dockerHost>${docker.host}</dockerHost>
<images>
<image>
<!--定义镜像名称-->
<name>myrepo/${project.name}:${project.version}</name>
<!--定义镜像构建行为-->
<build>
<!--定义基础镜像-->
<from>openjdk:8</from>
<args>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</args>
<!--定义哪些文件拷贝到容器中-->
<assembly>
<!--定义拷贝到容器的目录-->
<targetDir>/</targetDir>
<!--只拷贝生成的jar包-->
<descriptorRef>artifact</descriptorRef>
</assembly>
<!--定义容器启动命令-->
<entryPoint>["java", "-jar","-Dspring.profiles.active=prod","/${project.build.finalName}.jar"]</entryPoint>
<!--定义维护者-->
<maintainer>ice_dynasty</maintainer>
</build>
</image>
</images>
</configuration>
</plugin>
- 相关配置说明:
-
- executions.execution:此处配置了在maven打包应用时构建docker镜像;
- image.name:用于指定镜像名称,myrepo是仓库名称,
${project.name}
为镜像名称,${project.version}
为镜像标签名称; - dockerHost:打包后上传到的docker服务器地址;
- build.from:该应用所依赖的基础镜像,此处为
openjdk
; - entryPoint:docker容器启动时执行的命令,可以使用
-Dspring.profiles.active=prod
指定应用配置文件; - assembly:定义哪些文件拷贝到容器中;
- assembly.targetDir:定义拷贝到容器的目录;
- assembly.descriptorRef:只拷贝生成的jar包;
- maintainer:定义项目的维护者。
- 添加
application-prod.yml
配置文件,只是将之前的数据库地址的localhost
改为了db
;
注意:可以把docker中的容器看作独立的虚拟机,xxx-docker访问localhost自然会访问不到mysql,docker容器之间可以通过指定好的服务名称db进行访问,至于db这个名称可以在运行xxx-docker容器的时候指定。
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://db:3306/mydb?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
使用IDEA打包项目并构建镜像
注意:依赖的基础镜像需要先行下载,否则会出现构建镜像超时的情况,比如我本地并没有openjdk:8
的镜像,就需要先把镜像pull下来,再用maven插件进行构建。
- 执行maven的package命令:
- 构建成功:
- 镜像仓库已有该镜像:
在Docker容器中运行项目
运行mysql服务
- 使用docker命令启动:
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 如果遇到mysql容器无法启动的情况,可以先删除容器,再使用如下命令启动(该命令只是删除了mysql配置文件挂载的那行命令);
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 进入运行mysql的docker容器:
docker exec -it mysql /bin/bash
- 使用mysql命令打开客户端:
mysql -uroot -proot --default-character-set=utf8
- 修改root帐号的权限,使得任何ip都能访问:
grant all privileges on *.* to 'root'@'%';
- 创建项目数据库:
- 将项目
sql
文件拷贝到mysql容器的/
目录下:
- 将sql文件导入到数据库:
运行xxx-docker应用服务
- 使用docker命令启动(--link表示应用可以用db这个域名访问mysql服务):
- 开启
8080
端口:
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
- 进行访问测试,地址:http://localhost:8080/swagger-ui/