前言
Dockerfile 是用来构建 Docker 镜像的文本文件,包含了一条条指令,告诉 Docker 如何一步步构建镜像。掌握 Dockerfile 是 Docker 进阶的必经之路。
这篇文章从基础概念讲起,通过实例带你理解 Dockerfile 的常用指令和构建流程。
Dockerfile 构建流程
一个完整的 Docker 镜像由以下几步构成:
- 编写 Dockerfile 文件
- 使用
docker build 命令构建镜像
- 使用
docker run 命令运行镜像
- 使用
docker push 发布镜像(推荐 DockerHub、阿里云镜像仓库)
参考 Docker 官方文档
Dockerfile 指令
Dockerfile 中每个指令都会创建一个新的镜像层。
| 指令 |
说明 |
FROM |
基础镜像,一切从这里开始 |
MAINTAINER |
镜像维护者(姓名+邮箱) |
RUN |
构建镜像时执行的命令 |
ADD |
添加文件并自动解压压缩包 |
COPY |
复制文件到镜像中(类似 ADD,但不解压) |
WORKDIR |
设置工作目录 |
VOLUME |
挂载目录 |
EXPOSE |
暴露端口号 |
CMD |
容器启动时执行的命令(仅最后一个生效,可被替代) |
ENTRYPOINT |
容器启动时执行的命令(可追加参数) |
ONBUILD |
当镜像被继承时触发的指令 |
ENV |
设置环境变量 |
注意事项
- 每个指令(关键字)必须大写
- 文件从上到下顺序执行
# 表示注释
- 每条指令都会创建并提交一个新的镜像层
实战:创建自定义 CentOS 镜像
1. 编写 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| FROM centos:7 MAINTAINER cf<kisssheep1557@163.com>
ENV MYPATH /usr/local/ WORKDIR $MYPATH
RUN yum -y install vim RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH CMD echo "-----end-----" CMD /bin/bash
|
2. 构建镜像
1 2
| docker build -f dockerfile.centos -t mycentos:0.1 .
|
3. 对比测试
官方基础镜像 centos:7 通常没有 vim 等常用命令,而通过 Dockerfile 构建的 mycentos:0.1 已经预装了这些工具。
CMD 与 ENTRYPOINT 的区别
这两个指令都用于指定容器启动时执行的命令,但行为不同:
- CMD:只有最后一个生效,可以被
docker run 的参数替代
- ENTRYPOINT:会追加参数,不会被替代
测试 CMD
1 2
| FROM centos:7 CMD ["ls","-a"]
|
1 2 3 4 5 6 7 8 9
| docker build -f mydockerfile-cmd-test -t myimage:tag .
docker run 06f2cc65ea4a
docker run 06f2cc65ea4a -l
|
测试 ENTRYPOINT
1 2
| FROM centos:7 ENTRYPOINT ["ls","-a"]
|
1 2 3 4 5 6 7 8 9
| docker build -f mydockerfile-entrypoint-test -t myimages:tag .
docker run 5184c7d459a0
docker run 5184c7d459a0 -l
|
实战:制作 Tomcat 镜像
1. 准备材料
1 2 3 4 5 6 7 8 9 10 11
| docker pull centos:7
cd /home/dockerfile
ls
|
2. 编写 Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| FROM centos:7 MAINTAINER yqy<kisssheep1557@163.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u381-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.93.tar.gz /usr/local
RUN yum install -y vim
ENV MYPATH /usr/local WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_381 ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.93 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.93 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.93/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.93/logs/catalina.out
|
3. 构建并运行
1 2 3 4 5 6 7 8 9 10 11
| docker build -t diytomcat .
docker run -d -p 9090:8080 --name diytomcat01 diytomcat:latest
docker run -d -p 3355:8080 --name yqytomcat \ -v /home/yqy/build/tomcat/test:/usr/local/apache-tomcat-8.5.93/webapps/test \ -v /home/yqy/build/tomcat/tomcatlog:/usr/local/apache-tomcat-8.5.93/logs \ diytomcat
|
访问 http://服务器IP:9090 即可看到 Tomcat 默认页面。
常见问题
❌ 构建时 yum install 失败
原因:CentOS 7 官方源已停止维护。
解决:更换为 vault 源或阿里云镜像源。
❌ CMD 命令不生效
原因:多个 CMD 指令只有最后一个生效。
解决:使用 && 连接多个命令,或使用 ENTRYPOINT。
以上就是 Dockerfile 的核心内容和实战示例。掌握这些指令,你就可以构建自己的 Docker 镜像了。