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的格式如下:

bash 复制代码
FROM centos:centos7.9.2009
# 换成阿里云归档源(CentOS 7 已 EOL,官方源已失效)
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.repo
#RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* \
RUN yum clean all
RUN yum install -y java-1.8.0-openjdk-devel
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk \
    PATH=$PATH:/usr/lib/jvm/java-1.8.0-openjdk/bin
CMD ["java", "-version"]

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

bash 复制代码
docker build -t centos7.9.2009-jdk8:20261026 . -f ./Dockerfile

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

构建完成后的效果如图:

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

构建程序运行镜像

使用刚才构建的操作系统镜像为基础镜像,继续构建java程序运行的镜像文件

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

bash 复制代码
#引入刚才构建的基础镜像
FROM centos7.9.2009-jdk8:20261026
RUN groupadd -g 2021 cwos
RUN useradd -g cwos -u 2021 -s /bin/bash -m cwos
RUN mkdir -p /app
RUN chown -R 2021: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.repo
RUN yum install fontconfig -y
USER cwos
ENV HOME=/home/cwos
ENV JAVA_APP_JAR /app/app.jar
ENV BEST_PERFORMANCE_MAX_MEMORY=4000
COPY run-java.sh /app/run-java.sh
COPY cbs-ibis-5.0.3.202606171445.jar ${JAVA_APP_JAR}
EXPOSE 9779

执行命令构建

bash 复制代码
docker build '--network=host' -t centos7.9.2009-jdk8-ibis:1.0.0.20261026 . -f ./Dockerfile

结果如下截图:

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

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

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

相关推荐
code2cat1 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
北京中科新远科技1 小时前
高速交换机端口预算怎么做?下行、上联、拆分和冗余计算框架
开发语言·php
xiaoye-duck1 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
后台模板学习2 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one2 小时前
算法--构造
java·数据结构·算法
SL_staff2 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
AI源码2 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
旖旎夜光3 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
SL_staff3 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈