Docker 构建 Springboot 应用
方式一:手动部署
1)先打包出 jar 包并上传到服务器
2)在同目录建立 Dockerfile 文件
FROM java:8 EXPOSE 8999 VOLUME /tmp ADD tduck-api.jar /tduck-api.jar RUN bash -c 'touch /tduck-api.jar' ENTRYPOINT ["java", "-jar", "/tduck-api.jar"]

3)构建镜像
docker build -t='镜像名称' .

4)创建容器
docker run -di --restart=always --name 容器名称 --network=my-network --network-alias=tduck-api-alias -e TZ=Asia/Shanghai -p 8080:8080 镜像名称
- network:非必须,要加入的网络
- network-alias:被必须,在网络中的别名
- TZ:时区

5)查看运行日志
docker logs -f --tail=100 容器名称

方式二:利用 docker-maven-plugin 自动化部署
1)搭建Docker Registry 2.0
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
2)编辑 docker 配置文件,加入 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \
vi /usr/lib/systemd/system/docker.service

3)让 Docker 支持 http 上传镜像
echo '{ "insecure-registries":["192.168.245.128:5000"] }' > /etc/docker/daemon.json
4)修改后重载配置并重启 Docker,使用 curl http://localhost:2375/version 测试一下,有返回就是成功了
systemctl daemon-reload && systemctl restart docker.service

5)开启端口,重载防火墙
firewall-cmd --zone=public --add-port=2375/tcp --permanent firewall-cmd --reload
6)再从浏览器里访问一下,正常现在就通了

7)如图找到 Docker ,配置好 URL

8)现在可以连接 Docker 查看容器了

9)添加一个 Docker Image 配置

- Image ID or name:镜像名称
- Container name:容器名称
- Bind ports:映射端口
- Run options:添加自定义参数,我添加了重启自动运行、网络配置和时区配置
- 预览:docker run -p 8999:8999 --name tduck-api -e TZ=Asia/Shanghai --restart always --network pigeon --network-alias tduck-api tduck-api
10)在 pom.xml 的 plugins 里面添加下面内容
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<baseImage>java:8</baseImage>
<imageName>${project.artifactId}</imageName>
<dockerHost>http://192.168.245.128:2375</dockerHost>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
11)打包构建
①:运行 package 会打包并上传镜像
②:运行 Docker Image 则会构建容器

12)部署完成

ps:如果这里有乱码则需要在菜单栏 Help -> Edit Custom VM Options 追加 UTF8 编码
-Dfile.encoding=utf-8
13)由于服务器需要开放2375端口,并且开放了端口没有做任何安全保护,会引起安全漏洞。被人入侵、挖矿、CPU飙升这些情况都有发生,所以后面任需要使用安全传输层协议(TLS)进行传输并使用CA认证。
- 首先创建一个临时文件夹
mkdir /tmp/docker-ca && cd /tmp/docker-ca
-
创建 CA 证书私钥,期间需要输入两次密码,生成文件为 ca-key.pem;
openssl genrsa -aes256 -out ca-key.pem 4096
- 执行以下命令,输入密码,然后依次输入国家是 CN,省例如是 Guangdong、市 Guangzhou、组织名称、组织单位、姓名或服务器名、邮件地址,可以随意填写
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
-
创建服务端私钥,生成文件为 server-key.pem
openssl genrsa -out server-key.pem 4096
- 这一步 IP 需要换成自己服务器的外网 IP 或者域名
openssl req -subj "/CN=192.168.245.128" -sha256 -new -key server-key.pem -out server.csr
- 配置白名单,多个用逗号隔开,例如: IP:192.168.245.128,IP:0.0.0.0,这里需要注意,虽然0.0.0.0可以匹配任意,但是仍然需要配置你的服务器外网 IP,如果省略会造成错误
echo subjectAltName = IP:192.168.245.128,IP:0.0.0.0 >> extfile.cnf
- 把 extendedKeyUsage = serverAuth 键值设置到extfile.cnf文件里,限制扩展只能用在服务器认证
echo extendedKeyUsage = serverAuth >> extfile.cnf
- 执行以下命令,输入之前设置的密码,然后会生成签名的证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf
- 生成例如 IDEA 客户端需要用到的密钥文件
openssl genrsa -out key.pem 4096
- 生成客户端签名请求需要用到的临时文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
- 继续设置证书扩展属性
echo extendedKeyUsage = clientAuth >> extfile.cnf
- 输入之前的密码生成认证证书,生成正式签名证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
- 删除生成的临时文件
rm -rf client.csr server.csr ca.srl extfile.cnf
- 修改证书为只读权限保证证书安全
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
- 复制服务端需要用到的证书到docker配置目录下便于识别使用
cp server-cert.pem ca.pem server-key.pem /etc/docker
-
修改docker.service文件,修改以 ExecStart开头的配置,开启TLS认证,并配置好 CA 证书、服务端证书和服务端私钥,修改成如下
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem
- 重载服务并重启 docker
systemctl daemon-reload && systemctl restart docker
- 测试一下证书是否配置成功,如果成功,会输出证书相关信息,如果有 fail,请检查证书
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=192.168.245.128:2375 version
- 将生成的
ca.pem cert.pem key.pem三个文件下载到本地文件夹 - 打开 IDEA 设置中的 docker,修改 URL 为 https,Certificates folder 选中上一步说的文件夹,出现 Connetion successful 即可

- pom.xml 中 version 升级为 1.2.2,dockerHost 改成 https,添加 dockerCertPath 配置。如果有父工程的要注意,basedir 是所在子工程的根地址
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<baseImage>java:8</baseImage>
<imageName>${project.artifactId}</imageName>
<dockerHost>https://192.168.245.128:2375</dockerHost>
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<dockerCertPath>${basedir}/docker-ca</dockerCertPath>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>

浙公网安备 33010602011771号