Dockerfile编写
1. Dockerfile 编写
Dockerfile 是一个文本文件,包含了构建 Docker 镜像的所有指令。
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
2. 编写 Dockerfile 前的准备
在编写Dockerfile前要做到以下这些准备:
安装并配置 Docker(如何已经配置则跳过)
可以通过以下命令去检查
docker version docker info明确构建目标
- 选择基础镜像:决定是使用官方镜像(如
ubuntu:latest、alpine:latest)还是自定义基础镜像。- 确定应用环境:是否需要安装特定软件,运行特定任务,如Python,Java,Nginx等。
- 定义运行方式:容器是长期运行的(如Web服务)还是一次性执行的(如编译任务)。
创建工作目录
建议在一个独立的目录中编写
Dockerfile,并将相关依赖文件(如源码、配置文件等)放入该目录。mkdir mydocker cd mydocker
3. Dockerfile 指令详解
Dockerfile 是由一系列指令组成的,每条指令用于构建镜像的一部分。以下是所有重要指令的详细介绍:
3.1 FROM:指定基础镜像⭐
FROM ubuntu:22.04
- 每个Dcokerfile必须有
FROM指令,它定义了镜像的基础层。 - 可以是官方镜像、私有镜像或自定义镜像
3.2 LABEL:添加元数据
LABEL maintainer="你的名字 <你的邮箱>"
- 添加一些描述信息,如作者、版本等。
3.3 WORKDIR:设置工作目录 ⭐
WORKDIR /usr/src/app
- 之后的
RUN、COPY、CMD等指令都会在此目录下执行。
3.4 RUN:执行命令
RUN apt-get update && apt-get install -y nginx
RUN用于执行 shell 命令,如安装软件、修改文件等。- 每条
RUN指令都会创建一个新的镜像层。 &&用于连接多条命令,减少镜像层数,提高构建效率。
3.5 COPY 和 ADD:复制文件
COPY myapp /usr/src/app
COPY用于从宿主机复制文件到容器中。ADD和COPY类似,但支持解压.tar.gz文件,并可使用 URL 远程下载文件(不推荐)。
ADD myapp.tar.gz /usr/src/app/
3.6 ENV:设置环境变量
ENV NODE_ENV=production
- 定义环境变量,容器运行时可以使用
echo $NODE_ENV访问
3.7 EXPOSE:声明端口
EXPOSE 80
- 声明容器对外开放的端口(但不会自动映射)
- 需要在
docker run时使用-p选项映射端口,如-p 8080:80
3.8 CMD 和 ENTRYPOINT:指定容器启动命令
cmd:指定默认运行的命令,可以被docker run参数覆盖ENTRYPOINT:始终执行的命令,不能被docker run轻易覆盖
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["nginx", "-g", "daemon off;"]
区别:
cmd可被docker run覆盖,如docker run myimage bash会忽略CMDENTRYPOINT通常用于确保某个命令始终执行,如ENTRYPOINT ["python"]可让docker run myimage app.py直接运行python app.py。
3.9 VOLUME:定义数据卷
VOLUME /var/lib/mysql
- 声明挂载的目录,可用于数据持久化
- 容器内部修改的
VOLUME目录不会随容器删除而丢失数据
3.10 ARG:定义构建时变量
ARG VERSION=latest
RUN echo "Building version: $VERSION"
ARG只在 构建阶段 使用,与docker built --built-arg结合使用- 不会保留在最终镜像中,适用于编译参数、临时变量等
3.11 USER:切换用户
USER nonroot
- 以指定用户运行容器,默认是
root,可以提高安全性
3.12 SHELL:修改默认 shell
SHELL ["/bin/bash", "-c"]
- 默认情况下,Linux使用
sh,可以修改为bash
3.13 HEALTHCHECK:健康检查
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl -f http://localhost || exit 1
- 定期检查容器是否正常运行,如30秒检查一次
- 如果
CMD返回非0,Docker 会标记容器为unhealthy
3.14 ONBUILD:用于继承镜像
ONBUILD COPY . /app
- 只有当该镜像被 作为基础镜像 使用时,
ONBUILD指令才会生效。
3.15 示例 ---> tomcat_zrlog
-
创建相关文件的文件夹
mkdir -p /app/code/tomcat && touch Dockerfile mv zrlog.war /app/code/tomcat -
编写Dockerfile
FROM tomcat:9.0-jdk8 LABEL maintainer="soft water" RUN rm -rf /usr/local/tomcat/webapps/* COPY zrlog.war /usr/local/tomcat/webapps/ EXPOSE 8080 CMD ["catalina.sh", "run"] -
构建镜像
docker build -t zrlog . -
查看构建的镜像
docker images REPOSITORY TAG IMAGE ID CREATED SIZE zrlog latest f01409634d49 20 seconds ago 296MB -
查看是否有与想要映射的服务端口冲突的服务
ss -lntup | grep 80 -
启动服务
docker run -d --name zrlog -p 80:8080 zrlog:latest -
浏览器访问
10.0.0.81:80/zrlog

关于学习Dockerfile的编写方法以及规则
浙公网安备 33010602011771号