通过docker镜像发布服务已经是很多厂商的共识,本文并不阐述docker的优势,而是介绍发布docker镜像时可以优化的部分
提高镜像制作效率
每个公司都有一些规范,要求系统运行的环境版本、配置等,这些既是规范又是每个工程的共性,如果放任工程师各自为战就会导致规范不能落地,还会引来调测复杂度及他人接手的门槛,而通过制作统一的基础镜像来实现规范落地就简单而有效的解决了上面的管理难题。
制作基础镜像只需要下面两个步骤:
- 编写pom文件,这样可以像一般工程一样管理基础镜像制作
<profiles>
<profile>
<id>七牛生产环境</id>
<properties>
<docker.registry.url>reg.qiniu.com</docker.registry.url>
<docker.repostory>reg.qiniu.com</docker.repostory>
<docker.registry.name>test</docker.registry.name>
<docker.serviceid>docker-qiniu</docker.serviceid>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>push-image</id>
<phase>install</phase>
<goals>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<serverId>${docker.serviceid}</serverId>
<registryUrl>${docker.registry.url}</registryUrl>
<imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
<imageTags>
<!--docker的tag为项目版本号、latest-->
<imageTag>latest</imageTag>
</imageTags>
<dockerDirectory>${basedir}/docker</dockerDirectory>
</configuration>
</plugin>
</plugins>
</build>
- 编写Dockerfile文件
该文件必须放到docker目录下
FROM openjdk:8-jre-alpine
MAINTAINER [crazyicelee] [147534565@qq.com]
RUN echo https://mirrors.aliyun.com/alpine/v3.9/main > /etc/apk/repositories
RUN ["apk","update"]
RUN ["apk","add","curl","bash","tree","tzdata"]
RUN ["apk","add","ttf-dejavu","fontconfig"]
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD ["fonts/chinese.tar","/usr/share/fonts/."]
CMD ["java", "-version"]
如果需要引入汉字库,也可以将字库压缩包放到fonts目录中,当然也可以通过多次基础镜像包依赖来扩充你的基础镜像。
编译&推送到远程镜像仓库
- 拉去你的镜像要依赖的基础镜像
docker pull openjdk:8-jre-alpine
docker images
- mvn编译该镜像工程,生成本地镜像
mvn package
- 推送镜像到公司镜像仓库
mvn install
其他工程就可以基于你制作的镜像去构建各自项目的镜像了