在平常的开发工作中,我们经常需要部署项目,一个项目开发完成后,使用 Docker 方式部署,那么首先得构造镜像,构造镜像最主要的就是 Dockerfile>Dockerfile 文件的编写,今天简单来总结下 Dockerfile>Dockerfile 文件的编写以及有哪些注意事项。
1:概述
Dockerfile>Dockerfile 是一种纯文本文件,文件命名就是 “Dockerfile>Dockerfile”,用来构建 Docker 镜像的文本文件,包含了一系列的指令和参数。通过 Dockerfile>Dockerfile 构建的镜像可以保证开发环境、测试环境和生产环境的镜像一致,避免了换机器不能运行的问题。通过指令可以自动构建镜像。Dockerfile>Dockerfile 可以与 Jenkins 等集成,实现自动化构建和部署。
2:构建步骤
(1):编写 Dockerfile>Dockerfile 文件,示例如下:
# 示例一
# 使用OpenJDK 17基础镜像
FROM openjdk:17RUN mkdir -p /mall/logs# 切换工作目录
WORKDIR /mall# 配置环境变量
ENV SERVER_PORT=80 \LC_ALL=C.UTF-8# 暴露应用端口
EXPOSE 80# 添加应用Jar包到容器中
ADD mall-admin.jar ./app.jar# 设置容器的启动命令,支持暴露两个端口
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]#示例二
FROM openjdk:17
ENV SERVER_PORT=8080
EXPOSE ${SERVER_PORT}
ADD mall-admin.jar ./app.jar
ENTRYPOINT java -jar app.jar
(2):docker build -t 镜像名称:tag .,如:
docker build -t mall:1.0 . 1.0为tag版本号,后面的点为以当前目录构建上下文。
3:Dockerfile>Dockerfile 常用指令
(1):FROM:指定基础镜像,Dockerfile>Dockerfile 必须以 from 开头,from openjdk后面如果写版本号,则拉取该版本作为基础镜像,如果不写版本号,则会拉拉取标签为 latest 版本作为基础镜像,即,如:
# 指定版本 镜像名称:tag
from openjdk:17# 不指定版本
from openjdk
(2):RUN:在镜像构建过程中执行命令,如新建文件夹、安装软件等,查看 linux 内核版本命令:cat /etc/os-release,如:
# 创建目录 -p 如果不存在父级目录,首先会创建父级目录,再创建子目录
RUN mkdir -p /mall/logs# 安装软件
# 安装 Redis
RUN dnf install -y redis && \# 清理 dnf 缓存以减小镜像体积dnf clean all
(3):WORKDIR:设置工作目录,为后续的RUN、COPY、ADD等指令设定工作目录
# 切换工作目录
WORKDIR /mall
(4):ENV:设置环境变量,设置端口为80,LANG=C.UTF-8 指定系统的默认语言和字符编码,是一个特殊的环境变量,它的优先级高于其他所有与语言环境相关的环境变量(如 LANG 等)。当设置了LC_ALL后,它会覆盖其他语言环境变量的设置,整个系统都使用LC_ALL设置的语言环境,如:
# 配置环境变量
ENV SERVER_PORT=80 \LANG=C.UTF-8 \LC_ALL=C.UTF-8
(5):EXPOSE:容器运行时监听的网络端口,如:
# 暴露一个端口
EXPOSE 80#暴露两个端口
EXPOSE 9001 9002
(6):ADD:添加 jar 包到 Docker 镜像中,如:将构建上下文中的 mall-admin.jar 文件复制到镜像的 /app 目录并命名为 app.jar。
ADD:将文件复制到镜像中。
mall-admin.jar:主机上的源文件(通常位于 Dockerfile>Dockerfile 所在的目录或指定路径)。
./app.jar:目标路径,表示将文件复制到镜像中的当前工作目录,并重命名为 app.jar。
# 复制源文件到镜像中并重命名
ADD mall-admin.jar ./app.jar
(7):CMD/ENTRYPOINT:指定容器启动时执行的命令。CMD:命令可以被覆盖,ENTRYPOINT:只能传递参数,命令不能被覆盖,如:
# 1. 两种参数都存在
# 容器启动时,默认会执行 ENTRYPOINT 和 CMD的命令。
# 如果运行 docker run image,实际执行的命令是 ENTRYPOINT 和 CMD 的命令。
# 如果运行 docker run image test-cmd,实际执行的命令是 ENTRYPOINT的指令 和 test-cmd(CMD 被覆盖)。
# 固定容器的启动命令,推荐使用 ENTRYPOINT
# exec 格式,推荐使用 exec 格式,即类似于json格式
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]# 定义容器启动时的默认参数,可以被 docker run 传递的参数覆盖
CMD ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]# 2. 只有 ENTRYPOINT
# 容器启动时,必须指定参数
# 如果运行 docker run image test-cmd,实际执行的命令是 ENTRYPOINT的指令 和 test-cmd。
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]# 3. 只有 CMD
# 容器启动时,默认执行 CMD 的指令
# 如果运行 docker run image test-cmd,实际执行的命令是 test-cmd(CMD 被覆盖)。
CMD ["java", \"-Dserver.port=${SERVER_PORT}", \"-jar", "app.jar"]
4:构建镜像
使用 docker build -t mall:1.0 .,构建完成后,使用 docker images 查看镜像:
以上为 Dockerfile>Dockerfile 文件的基本内容,主要是设置基础镜像、设置工作目录、设置启动命令等。编写完成后可以使用 docker build -t 测试文件是否正确,如果 Dockerfile>Dockerfile 文件有问题,则构建镜像失败。如果构建成功,则可以用 docker images 命令查看镜像。