本篇文章主要涉及两方面
- 如何通过ssl加密方式连接docker
- 如何在父子maven中,分别对子Maven进行一键打包和部署
一、IDEA远程连接Docker(SSL加密方式)
-
新建文件夹,存放证书
mkdir /data/docker-ca cd /data/docker-ca
-
创建key,设置密码并确认
openssl genrsa -aes256 -out ca-key.pem 4096
-
创建一个1000天(随意天数)的CA机构证书,分别填写国家,省份,城市,组织,邮箱等信息(可乱填)
openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -out ca.pem
例如
Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:SuZhou Locality Name (eg, city) [Default City]:SuZhou Organization Name (eg, company) [Default Company Ltd]:xzit Organizational Unit Name (eg, section) []:xzit Common Name (eg, your name or your server's hostname) []:xxx Email Address []:xxx@xx.com
-
生成server-key.pem
openssl genrsa -out server-key.pem 4096
-
生成服务端证书签名,绑定ip或域名
以下命令中$HOST为外网ip或域名
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
例如(以下方式二选一)
# 有域名 openssl req -subj "/CN=www.xxx.com" -sha256 -new -key server-key.pem -out server.csr # 有ip openssl req -subj "/CN=192.168.0.1" -sha256 -new -key server-key.pem -out server.csr
-
配置白名单
IP:0.0.0.0 为白名单ip,因为已经设置了ssl,这里可以设置允许所有人访问。也可以设置指定ip
echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf
例如(以下方式二选一)
# 有域名 echo subjectAltName = DNS:www.xxx.com,IP:0.0.0.0 >> extfile.cnf # 有ip echo subjectAltName = IP:192.168.0.1,IP:0.0.0.0 >> extfile.cnf
-
生成ca-key
echo extendedKeyUsage = serverAuth >> extfile.cnf
-
输入之前的密码,生成ca-key(这里设置过期时间为1000天)
openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
-
生成客户端所需的key.pem
openssl genrsa -out key.pem 4096
-
执行命令
openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo extendedKeyUsage = clientAuth >> extfile.cnf
-
生成cert.pem,需要输入前面设置的密码(这里设置过期时间为1000天)
openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf
-
修改docker配置
-
编辑docker.service
vim /usr/lib/systemd/system/docker.service
-
将 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock修改为:
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/data/docker-ca/ca.pem --tlscert=/data/docker-ca/server-cert.pem --tlskey=/data/docker-ca/server-key.pem -H tcp://0.0.0.0:2376 -H fd:// --containerd=/run/containerd/containerd.sock
注意证书的存放位置,即–tlscacert、–tlscert、–tlskey的值
这里设置了连接docker的访问端口:2376
-
-
重启docker
systemctl daemon-reload systemctl restart docker
-
打开服务器的端口:2376
-
将ce.pem、cert.pem、key.pem三个文件拷贝到本地
-
打开idea,下载docker,并配置
-
查看
二、配置项目文件
-
配置父Maven中的pom.xml文件,增加如下内容
... <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.12.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <!--将插件绑定在某个phase执行--> <executions> <execution> <id>build-image</id> <!--将插件绑定在package这个phase上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build--> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!--指定生成的镜像名,choas为项目前缀,可自定义--> <imageName>choas/${project.artifactId}</imageName> <imageTags>latest</imageTags> <!-- 指定 Dockerfile 路径--> <dockerDirectory>${project.basedir}</dockerDirectory> <!--指定远程 docker api地址--> <dockerHost>https://192.168.0.1:2376</dockerHost> <!--指定pem证书文件路径地址 --> <dockerCertPath>${project.basedir}/pem</dockerCertPath> </configuration> </plugin> </plugins> </build>
-
配置父Maven中的pom.xml文件,增加如下内容
<build> <!-- 最后打包的项目名 --> <finalName>gateway</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> </plugin> </plugins> </build>
-
将存储ce.pem、cert.pem、key.pem三个文件的文件夹,拷贝一份到对应子项目的根目录中,与父Maven中的标签值对应
-
在根目录中(不是根目录会报错)创建Dockerfile文件(没有后缀),与父Maven中的标签值对应
例如
# 项目所依赖的jdk镜像 FROM java:8 # 将maven构建好的jar添加到镜像中(子项目中的finalName标签对应) 第二个参数为别名 ADD target/gateway.jar gateway.jar EXPOSE 8899 ENTRYPOINT ["java","-jar","gateway.jar"]
大多父子maven项目会有一个公共项目,此时打包子项目会找不到对应公共荐的jar包
-
将父项目中的标签注释掉
-
点击maven,选择父maven,然后clear,最后install
-
将父项目中的标签取消注释,然后对子项目打包就没有问题了
-
-
部署镜像
-
配置信息
-
点击run即可运行