Docker整合CA认证

一、 Idea 集成 docker 实现镜像打包一键部署
1 Docker 开启远程访问
将文件内的 ExecStart 注释。 新增如上行。
#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
2 IDEA 安装 Docker 插件
打开 Idea ,从 File->Settings->Plugins->Install JetBrains plugin 进入插件安装界面,
在搜索框中输入 docker ,可以看到 Docker integration ,点击右边的 Install 按钮进行安装。
安装后重启 Idea
3 IDEA 配置 docker
配置 docker ,连接到远程 docker 服务。
File->Settings->Build,Execution,Deployment->Docker 打开配置界面
# 修改该 Docker 服务文件
vi / lib / systemd / system / docker.service
# 修改 ExecStart 这行
ExecStart =/ usr / bin / dockerd - H tcp :// 0.0.0.0 : 2375 - H unix :/// var / run / docker.sock
# 重新加载配置文件
systemctl daemon-reload
# 重启服务
systemctl restart docker.service
# 查看端口是否开启
netstat - nlpt # 如果找不到 netstat 命令,可进行安装。 yum install net-tools
# 直接 curl 看是否生效
curl http :// 127.0.0.1 : 2375 / info 连接成功后,在 IDEA 工具中即可 操作 Docker
4 docker-maven-plugin
传统过程中,打包、部署、等。
而在持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效
率,同时能够快速动态扩容,快速回滚,着实很方便。 docker-maven-plugin 插件就是为了帮助我们在 Maven 工程
中,通过 简单的配置,自动生成镜像并推送到仓库 中。
pom.xml
<properties>
<docker.image.prefix> guoweixin </docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-maven-plugin </artifactId>
<version> 1.0.0 </version> Dockerfile
如上用 docker-maven 插件 自动生成如下文件:
</plugin>
<plugin>
<groupId> com.spotify </groupId>
<artifactId> docker-maven-plugin </artifactId>
<version> 1.0.0 </version>
<configuration>
<!-- 镜像名称 guoweixin/exam-->
<imageName> ${docker.image.prefix}/${project.artifactId} </imageName>
<!-- 指定标签 -->
<imageTags>
<imageTag> latest </imageTag>
</imageTags>
<!-- 基础镜像 jdk 1.8-->
<baseImage> java </baseImage>
<!-- 制作者提供本人信息 -->
<maintainer> guoweixin guoweixin@aliyun.com </maintainer>
<!-- 切换到 /ROOT 目录 -->
<workdir> /ROOT </workdir>
<cmd> ["java", "-version"] </cmd>
<entryPoint> ["java", "-jar", "${project.build.finalName}.jar"] </entryPoint>
<!-- 指定 Dockerfile 路径
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
-->
<!-- 指定远程 docker api 地址 -->
<dockerHost> http://192.168.20.135:2375 </dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath> /ROOT </targetPath>
<!-- 用于指定需要复制的根目录, ${project.build.directory} 表示 target 目录 -->
<directory> ${project.build.directory} </directory>
<!-- 用于指定需要复制的文件。 ${project.build.finalName}.jar 指的是打包后的 jar
包文件。 -->
<include> ${project.build.finalName}.jar </include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build> 5 、执行命令
对项目进行 打包。并构建镜像 到 Docker 上。
6 IDEA 操作 Docker
7 、扩展配置
绑定 Docker 命令到 Maven 各个阶段
我们可以绑定 Docker 命令到 Maven 各个阶段,
我们可以把 Docker 分为 build tag push ,然后分别绑定 Maven package deploy 阶段,
我们只需要执行 mvn deploy 就可以完成整个 build tag push 操作了,当我们执行 mvn build 就只完成
build tag 操作。
FROM java
MAINTAINER guoweixin guoweixin@aliyun.com
WORKDIR /ROOT
ADD /ROOT/qfnj-0.0.1-SNAPSHOT.jar /ROOT/
ENTRYPOINT ["java", "-jar", "qfnj-0.0.1-SNAPSHOT.jar"]
CMD ["java", "-version"]
mvn clean package docker:build
<executions>
<!-- 当执行 mvn package 时,执行: mvn clean package docker:build -->
<execution>
<id> build-image </id>
<phase> package </phase>
<goals>
<goal> build </goal>
</goals>
</execution>
<!-- 当执行 mvn package 时,会对镜像进行 标签设定 -->
<execution>
<id> tag-image </id>
<phase> package </phase>
<goals>
<goal> tag </goal>
</goals>
<configuration>
<image> ${docker.image.prefix}/${project.artifactId}:latest </image>
<newName> docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}
</newName> 完整 pom.xml 如下:
</configuration>
</execution>
<execution>
<id> push-image </id>
<phase> deploy </phase>
<goals>
<goal> push </goal>
</goals>
<configuration>
<imageName> docker.io/${docker.image.prefix}/${project.artifactId}:${project.version}
</imageName>
</configuration>
</execution>
</executions>
<properties>
<java.version> 1.8 </java.version>
<!-- 镜像 前缀姓名 -->
<docker.image.prefix> guoweixin </docker.image.prefix>
</properties>
<dependencies>
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-web </artifactId>
</dependency>
.....................
</dependencies>
<build>
<plugins>
<plugin>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-maven-plugin </artifactId>
</plugin>
<plugin>
<groupId> com.spotify </groupId>
<artifactId> docker-maven-plugin </artifactId>
<version> 1.0.0 </version>
<configuration>
<!-- 镜像名称 guoweixin/exam-->
<imageName> ${docker.image.prefix}/${project.artifactId} </imageName>
<!-- 指定标签 -->
<imageTags>
<imageTag> latest </imageTag>
</imageTags>
<!-- 基础镜像 jdk 1.8-->
<baseImage> java </baseImage> 总结:
当我们执行 mvn package 时,执行 build tag 操作,
当执行 mvn deploy 时,执行 build tag push 操作。
如果我们想跳过 docker 某个过程时,只需要:
<!-- 制作者提供本人信息 -->
<maintainer> guoweixin guoweixin@aliyun.com </maintainer>
<!-- 切换到 /ROOT 目录 -->
<workdir> /ROOT </workdir>
<cmd> ["java", "-version"] </cmd>
<entryPoint> ["java", "-jar", "${project.build.finalName}.jar"] </entryPoint>
<!-- 指定 Dockerfile 路径
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
-->
<!-- 指定远程 docker api 地址
此处未加 CA 加密认证。
-->
<dockerHost> http://192.168.20.135:2375 </dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath> /ROOT </targetPath>
<!-- 用于指定需要复制的根目录, ${project.build.directory} 表示 target 目录 -->
<directory> ${project.build.directory} </directory>
<!-- 用于指定需要复制的文件。 ${project.build.finalName}.jar 指的是打包后的 jar
包文件。 -->
<include> ${project.build.finalName}.jar </include>
</resource>
</resources>
</configuration>
<!-- 当执行 mvn package 时,执行: mvn clean package docker:build -->
<executions>
<execution>
<id> build-image </id>
<phase> package </phase>
<goals>
<goal> build </goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> - DskipDockerBuild 跳过 build 镜像
- DskipDockerTag 跳过 tag 镜像
- DskipDockerPush 跳过 push 镜像
- DskipDocker 跳过整个阶段
例如:我们想执行 package 时,跳过 tag 过程,那么就需要 mvn package - DskipDockerTag
二、 Idea 整合 Docker CA 加密认证
前面提到的配置是允许所有人都可以访问的,因为 docker 默认是 root 权限的,把 2375 端口暴露在外面,意味着别人随
时都可以提取到你服务器的 root 权限,是很容易被黑客黑的,因此 ,docker 官方推荐使用加密的 tcp 连接,以 Https 的方
式与客户端建立连接
官方示例 Demo
https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl
Docker 认证命令配置
1 创建 ca 文件夹,存放 CA 私钥和公钥
mkdir -p /usr/local/ca
cd /usr/local/ca
2 生成 CA 私钥和公钥
Docker 守护进程的主机上,生成 CA 私钥和公钥 :
openssl genrsa -aes256 -out ca-key.pem 4096
3 依次输入密码、国家、省、市、组织名称、邮箱等 :
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
现在已经有了 CA ,接下来创建一个服务器密钥和证书签名请求 (CSR) 。确保 公用名 与你用来连接到 Docker 的主
机名匹配
4 生成 server-key.pem:
openssl genrsa -out server-key.pem 4096
5 CA 来签署公钥 :
由于 TLS 连接可以通过 IP 地址和 DNS 名称进行,所以在创建证书时需要指定 IP 地址。例如,允许使用 10.10.10.20
127.0.0.1 进行连接 :
$Host 换成你自己服务器外网的 IP 或者域名
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
比如
openssl req -subj "/CN=192.168.20.135" -sha256 -new -key server-key.pem -out server.csr
openssl req -subj "/CN=www.javaqf.com" -sha256 -new -key server-key.pem -out server.csr 本地是局域网:
openssl req -subj "/CN=192.168.20.135" -sha256 -new -key server-key.pem -out server.csr
6 配置白名单 :
1 允许指定 ip 可以连接到服务器的 docker ,可以配置 ip ,用逗号分隔开。
2 因为已经是 ssl 连接,所以我推荐配置 0.0.0.0, 也就是所有 ip 都可以连接 ( 但只有拥有证书的才可以连接成功 ) ,这
样配置好之后公司其他人也可以使用。
如果填写的是 ip 地址 命令如下 echo subjectAltName = IP:$HOST,IP:0.0.0.0 >> extfile.cnf
如果填写的是域名 命令如下 echo subjectAltName = DNS:$HOST,IP:0.0.0.0 >> extfile.cnf
上面的 $Host 依旧是你服务器外网的 IP 或者域名,请自行替换。
echo subjectAltName = IP:192.168.20.135,IP:0.0.0.0 >> extfile.cnf
7 执行命令
Docker 守护程序密钥的扩展使用属性设置为仅用于服务器身份验证 :
echo extendedKeyUsage = serverAuth >> extfile.cnf
8 生成签名证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf 9 生成客户端的 key.pem
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
10 要使密钥适合客户端身份验证
创建扩展配置文件 :
echo extendedKeyUsage = clientAuth >> extfile.cnf
echo extendedKeyUsage = clientAuth > extfile-client.cnf
11 现在,生成签名证书 :
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf
生成 cert.pem, 需要输入前面设置的密码,
12 删除不需要的文件,两个证书签名请求
生成 cert.pem server-cert 之后。您可以安全地删除两个证书签名请求和扩展配置文件 : rm -v client.csr server.csr extfile.cnf extfile-client.cnf
13 可修改权限
要保护您的密钥免受意外损坏,请删除其写入权限。要使它们只能被您读取,更改文件模式
chmod -v 0400 ca-key.pem key.pem server-key.pem
证书可以是对外可读的,删除写入权限以防止意外损坏
chmod -v 0444 ca.pem server-cert.pem cert.pem
14 归集服务器证书
cp server-*.pem /etc/docker/
cp ca.pem /etc/docker/
15 修改 Docker 配置
使 Docker 守护程序仅接受来自提供 CA 信任的证书的客户端的连接
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd
替换为:
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/usr/local/ca/ca.pem --
tlscert=/usr/local/ca/server-cert.pem --tlskey=/usr/local/ca/server-key.pem -H tcp://0.0.0.0:2375 -
H unix:///var/run/docker.sock
16 重新加载 daemon 并重启 docker
systemctl daemon-reload
systemctl restart docker
17 开放 2375 端口
/sbin/iptables -I INPUT -p tcp --dport 2375 -j ACCEPT 18 重启 Docker
systemctl restart docker
IDEA 操作 Docker
1 保存相关客户端的 pem 文件到本地
2 IDEA CA 配置 POM.xml
<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.15</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.apimalls</groupId>
	<artifactId>demo-boot</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo-boot</name>
	<description>demo-boot</description>
	<properties>
		<java.version>1.8</java.version>
		<!-- 镜像 前缀姓名 -->
		<docker.image.prefix>apimalls</docker.image.prefix>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<version>1.0.0</version>
				<configuration>
					<!-- 镜像名称 apimalls/exam-->
					<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
					<!-- 指定标签 -->
					<imageTags>
						<imageTag>latest</imageTag>
					</imageTags>
					<!-- 基础镜像 jdk 1.8-->
					<baseImage>java</baseImage>
					<!-- 制作者提供本人信息 -->
					<maintainer>junlaichen@qq.com</maintainer>
					<!-- 切换到 /ROOT 目录 -->
					<workdir>/ROOT</workdir>
					<cmd>["java", "-version"]</cmd>
					<entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>
					<!-- 指定 Dockerfile 路径
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                    -->
					<!-- 指定远程 docker api 地址
                    此处未加 CA 加密认证。
                    -->
					<dockerHost>https://192.168.181.135:2375</dockerHost>
					<!--CA证书地址-->
					<dockerCertPath>D:\software\docker\ca192168.181.135</dockerCertPath>
					<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
					<resources>
						<resource>
							<targetPath>/ROOT</targetPath>
							<!-- 用于指定需要复制的根目录, ${project.build.directory} 表示 target 目录 -->
							<directory>${project.build.directory}</directory>
							<!-- 用于指定需要复制的文件。 ${project.build.finalName}.jar 指的是打包后的 jar
                            包文件。 -->
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
				<!-- 当执行 mvn package 时,执行: mvn clean package docker:build -->
				<executions>
					<execution>
						<id>build-image</id>
						<phase>package</phase>
						<goals>
							<goal>build</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值