ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

dockerfile如何快速构建容器(java服务)

dockerfile如何快速构建容器(java服务)

常见的Docker容器构建方式,就是基于现有的docker的基础镜像,在此基础上添加一些容器启动的命令和程序包文件,然后使用docker build镜像生成,常见的基础镜像,可以在docker的国内镜像源地址进行下载,以下就是我们国内常见的有加速的镜像源地址(阿里云专属源 + 公共备用源,中国科学技术大学开源镜像站)
“registry-mirrors”: [
“https://docker.m.daocloud.io”,
“https://docker.1ms.run”,
“https://docker.mirrors.ustc.edu.cn”
]
这些镜像源地址,直接放在/etc/docker/daemon.json文件中(这里一定要注意json文件的格式,少了逗号会导致docker服务起不来),重启docker服务,就可以正常拉取镜像源的常规镜像,比如jdk8的镜像:eclipse-temurin:8-jdk
小贴士:最近才知道docker.service文件是放在/lib/systemd/system/目录下的,但是他的启动命令仍然是systemctl start …,和常规放在/etc/systemd/system目录下的服务效果一样,如果修改了它的相关配置文件/etc/docker/daemon.json,也需要执行systemctl daemon-reload命令来重新使配置生效,以前常用的都是/etc/systemd/system目录

构建系统镜像

构建基础的cento-7.9系统,并带有jdk1.8运行环境,构建镜像的dockerfile的格式如下:

FROM centos:centos7.9.2009# 换成阿里云归档源(CentOS 7 已 EOL,官方源已失效)RUNmv/etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup&&\curl-o/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo#RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \RUN yum clean all RUN yuminstall-yjava-1.8.0-openjdk-devel RUNln-sf/usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENVJAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk\PATH=$PATH:/usr/lib/jvm/java-1.8.0-openjdk/bin CMD["java","-version"]

然后执行构建命令命令来构建基础镜像:

dockerbuild-tcentos7.9.2009-jdk8:20261026.-f./Dockerfile

构建过程中,如果出现过连接超时的报错,不要中断,一般都是连接阿里云的网络超时了,但是我们配置了其他的镜像源地址,构建命令会执行重试的,如下图:

构建完成后的效果如图:

验证镜像的可用性,输出我们刚才在dockerfile里面定义的CMD命令(java -version)的结果,如下图所示:

构建程序运行镜像

使用刚才构建的操作系统镜像为基础镜像,继续构建java程序运行的镜像文件
编写dockerfile的常规步骤,就是先写一个From 基础镜像源,然后执行RUN关键字:创建系统内的用户、创建系统用户目录、安装必要的基础包、拷贝需要执行的文件到容器内部的目录,以下是我这边构建镜像的dockerfile内容格式

#引入刚才构建的基础镜像FROM centos7.9.2009-jdk8:20261026 RUNgroupadd-g2021cwos RUNuseradd-gcwos-u2021-s/bin/bash-mcwos RUNmkdir-p/app RUNchown-R2021:2021 /app#(基础镜像里已经替换过,不需要重复执行)RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && \# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repoRUN yuminstallfontconfig-yUSERcwos ENVHOME=/home/cwos ENV JAVA_APP_JAR /app/app.jar ENVBEST_PERFORMANCE_MAX_MEMORY=4000COPY run-java.sh /app/run-java.sh COPY cbs-ibis-5.0.3.202606171445.jar${JAVA_APP_JAR}EXPOSE9779

执行命令构建

dockerbuild'--network=host'-tcentos7.9.2009-jdk8-ibis:1.0.0.20261026.-f./Dockerfile

结果如下截图:

特别说明:build命令中直接构建的是当前目录,直接用.代替的,就是直接在Dockerfile所在的目录下构建,目录下不能存在太多不用的文件,最好只包含dockerfile文件中RUN命令需要用到的文件,我当前执行构建的目录结构如下:

之前踩过一个坑,在构建镜像的目录下文件太多,执行镜像构建命令,第一步就看到生成的镜像文件的大小18G,如果只包含dockerfile里面编写的内容,构建的容器大小为514M,如下图所示:


这个目录下的dockerfile文件内容如下,其实和上面的那个差不多

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进