Loading

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>
posted @ 2022-02-14 13:34  多久会在  阅读(160)  评论(0)    收藏  举报