idea中打包docker镜像
说明
构建和推送镜像都是需要docker环境的,这个大家可以使用同一个远程的环境,这里说的就是idea使用服务器上的docker进行镜像的构建和发布,
默认高版本的idea中默认集成了docker插件,这个插件的官方文档:https://www.jetbrains.com/help/idea/docker.html
提供多种方式连接docker,ssh方式和tcp方式,ssh方式更简单一点。似乎功能上没什么不同。
连接上docker之后,就可以在本地查看服务器上的镜像、容器、网络,本地执行部署镜像的命令(镜像在服务器),发布镜像等。
ssh方式连接docker
这个没啥好说的,配置界面填上docker服务器地址,用户名和密码即可。连接成功后操作界面如下
tcp方式连接docker
说明
docker架构中,Docker daemon( Docker守护进程)负责和客户端通讯,然后和Container交互。这里修改的是Docker daemon的配置。
需要说明的是不添加证书,单独开启tcp访问不安全,这意味着所有人都可以操作你的dcoker,所以这个主要介绍的是添加证书的方式。
部分内容来自:https://cloud.tencent.com/developer/article/2095087 、https://cloud.tencent.com/developer/article/2022355
以下操作主要是生成了CA证书,服务端证书,客户端证书。
ca和服务端相关证书
1、生成私钥
# 1、创建ca存放的目录
mkdir -p /app/docker/ca/
cd /app/docker/ca/
# 2、在当前目录下生成证书私钥文件ca-key.pem,私钥长度是4096,需要输入密码
openssl genrsa -aes256 -out ca-key.pem 4096
**2.**使用CA私钥生成自签名CA证书ca.pem。生成证书时,通过-days 365设置证书的有效期。单位为天,默认情况下为30天。输入第一步中的密码
openssl req -new -x509 -days 365 -subj '/C=CN/ST=jiangxi/L=jiujiang/O=none/OU=none/CN=www.sry1201.cn' -key ca-key.pem -sha256 -out ca.pem
生成CA证书时,需要提供一些公司信息。
- C表示国家,中国为CN。
- ST表示省。
- L表示城市
- O表示公司
- OU表示部门名字
- CN表示公司域名
**3.**生成服务器私钥server-key.pem和CSR(Certificate Signing Request)server-csr.pem。CN为DockerDaemon。
server-csr.pem是一个临时文件,生成server-cert.pem以后,可以删除。
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=www.example.com" -sha256 -new -key server-key.pem -out server.csr
4、配置白名单和秘钥,生成服务端证书
0.0.0.0表示所有ip都可以连接。(这里需要注意,虽然0.0.0.0可以匹配任意,但是仍需要配置你的外网ip(域名)和127.0.0.1,否则客户端会连接不上)
echo subjectAltName = IP:0.0.0.0,IP:123.123.123.123,IP:127.0.0.1 >> extfile.cnf
# 将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证
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
客户端相关证书
1、生成供客户端发起远程访问时使用的key.pem
openssl genrsa -out key.pem 4096
2、生成client.csr(把下面的IP换成你自己服务器外网的IP或者域名)
openssl req -subj "/CN=123.123.123.123" -new -key key.pem -out client.csr
3、创建扩展配置文件,把密钥设置为客户端身份验证用
生成cert.pem,输入前面设置的密码,生成签名证书
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
删除多余文件和设置权限
1.删除临时文件
rm -f client.csr server.csr extfile.cnf extfile-client.cnf
**2.**为了保证证书和私钥的安全,需要修改文件的访问权限。
chmod 0400 ca-key.pem key.pem server-key.pem
chmod 0444 ca.pem server-cert.pem cert.pem
**3.**重启Docker Daemon,加入ca.pem、server-cert.pem和server-key.pem。-H=0.0.0.0:2376表示Docker Daemon监听在2376端口。
查看配置文件的位置,修改配置文件docker.service
[root@k8s-master ca]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2022-10-21 18:46:28 CST; 1 months 18 days ago
Docs: https://docs.docker.com
Main PID: 3576 (dockerd)
Tasks: 29
Memory: 105.3M
CGroup: /system.slice/docker.service
└─3576 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 原文件
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 修改后
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/app/docker/ca/ca.pem --tlscert=/app/docker/ca/server-cert.pem --tlskey=/app/docker/ca/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock
# daemon的配置重新加载
systemctl daemon-reload
systemctl restart docker
客户端进行连接
10.从服务器下载客户端需要的证书
客户端证书和ca证书
ca.pem
ca-key.pem
cert.pem
key.pem
配置如图:
本地操作服务器部署镜像
如图
com.spotify
maven构建和发布镜像,不建议用了,可能是很久没更新,跟不上新版本了,反正我操作后报错,
官方文档
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<!--修改imageName节点的内容,改为私有仓库地址和端口,再加上镜像id和 TAG,我们要直接传到私服-->
<!--配置最后生成的镜像名,docker images里的,我们这边取项目名:版本-->
<imageName>${project.artifactId}</imageName>
<!--也可以通过以下方式定义image的tag信息。-->
<imageTags>
<imageTag>sry1201/${project.artifactId}:${project.version}</imageTag>
<imageTag>sry1201</imageTag>
</imageTags>
<!-- 来指明Dockerfile文件的所在目录 -->
<dockerDirectory>${project.basedir}</dockerDirectory>
<dockerHost>https://43.143.136.203:2376</dockerHost>
<dockerCertPath>D:\17736\Desktop\dcoker-ca</dockerCertPath>
<!--入口点,project.build.finalName就是project标签下的build标签下 的filename标签内容,testDocker-->
<!--相当于启动容器后,会自动执行java-jar/testDocker.jar-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--是否推送到docker私有仓库,旧版本插件要配置maven的settings文件。 小伙伴们可以自行查阅资料研究一下。 -->
<pushImage>true</pushImage>
<registryUrl>registry.hub.docker.com</registryUrl>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<!--把哪个文件上传到docker,相当于Dockerfile里的add app.jar /-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
尝试了一下,虽然报500,但是镜像在服务器上是构建成功的,不过这些个发布和移除镜像命令都不好使,无语,不用这个了
Fabric8
Fabric8主要是用来构建docker的镜像maven插件。可以参考Fabric8文档,主要是参考资料,理解其插件。
示例项目地址
构建
推送到远程仓库
push到远程仓库需要添加前缀
docker push sry1201/demot:tagname
参考下图
推送成功截图
不过还有问题,就是镜像文件似乎太大了,应该是包含了不需要的东西
关于镜像文件过大的问题
DockerFile中基于java:8和基于openjdk:8-jdk-alpine的大小有一定插件
# 基于哪个镜像
FROM java:8
这个文件夹中可以看到我们添加了那些文件到镜像中,不包含
最终的配置文件
<plugins>
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<dockerHost>https://43.143.136.203:2376</dockerHost>
<certPath>D:\17736\Desktop\dcoker-ca</certPath>
<registry>registry.hub.docker.com</registry>
<authConfig>
<!-- registry服务的认证-->
<username>sry1201</username>
<password>Sry@1201-</password>
</authConfig>
<pullRegistry>https://l6b5wweg.mirror.aliyuncs.com</pullRegistry>
<pushRegistry>registry.hub.docker.com</pushRegistry>
<images>
<image>
<!--镜像名称 必须是 命名空间/仓库名称:镜像版本号 否则无法推送到远程仓库,需要手动执行tag命令-->
<name>sry1201/${project.artifactId}-test3</name>
<!--别名:用于容器命名和在docker-compose.yml文件只能找到对应名字的配置-->
<alias>2021</alias>
<build>
<!-- dockerfile文件所在路径 -->
<contextDir>${project.basedir}</contextDir>
<tags>
<!-- <tag>latest</tag>-->
<tag>${project.version}</tag>
</tags>
</build>
</image>
</images>
</configuration>
</plugin>
</plugins>
# 基于哪个镜像
FROM java:8
# 复制文件到容器
ADD target/${project.build.finalName}.jar /app.jar
# 声明需要暴露的端口-宿主机端口
EXPOSE 30012
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
其他
这个插件和maven的打包插件到底有没有关系还是不明白。。。。。
还有就是这个打包插件可以不依赖Dockerfile,不过似乎更复杂,算了
关联信息
- 关联的主题:
- 上一篇:
- 下一篇:
- image: 20221021/1
- 转载自: