✅Dockerfile概述
-
应用场景:通过一个Dockerfile,生成自定义镜像
-
为什么要使用Dockerfile
- 我们目前都是手动拉取镜像,手动进行配置,手动安装依赖,手动编译安装,创建用户…
- 手动配置步骤繁琐,不方便重复执行
- 书写Dockerfile把之前手动创建自定义镜像的过程,通过Dockerfile里面的指令实现,类似playbook
-
Dockerfile根据要求自动创建镜像
✅常见 Dockerfile 指令说明
指令 | 说明 |
---|---|
FROM | 指定基础镜像(比如 Python、Node.js、Ubuntu 等) |
WORKDIR | 设置工作目录(后续命令都在这个目录下执行) |
VOLUME | 告诉使用者数据卷挂载到哪个目录 |
COPY | 将本地文件复制到镜像中(不支持解压) |
ADD | 类似 COPY,但支持解压文件等高级功能(推荐优先用 COPY) |
RUN | 构建镜像时执行的命令 |
CMD | 容器启动时默认执行的命令(可以被运行时覆盖) |
ENTRYPOINT | 容器启动时执行的命令(不会轻易被覆盖) |
EXPOSE | 声明容器运行时监听的端口 |
ENV | 设置环境变量 |
ARG | 构建参数(只在构建时使用) |
✅自定义小鸟飞飞镜像
🧩准备站点代码和配置文件
server {
listen 80;
server_name bird.zhubl.xyz;
root /app/code/bird/;
location / {
index index.html;
}
location ~* \.(html|js|css)$ {
expires 1d;
}
location ~* \.(jpg|jpeg|bmp|gif|png)$ {
expires max;
}
}
📝书写Dockerfile文件
vim Dockerfile
FROM nginx:1.24
LABEL author=zhu desc="custom bird image"
RUN mkdir -p /app/code/bird/
ADD bird.tar.gz /app/code/bird/
ADD default /etc/nginx/conf.d/
EXPOSE 80 443
CMD ["nginx","g","daemon;"]
- 说明
#指定基础镜像
FROM nginx:1.24
#基本信息
LABEL author=zhu desc="custom bird image"
#对镜像进行操作,执行命令
RUN mkdir -p /app/code/bird/
#添加本地文件到镜像中
ADD bird.tar.gz /app/code/bird/
ADD default /etc/nginx/conf.d/
#告诉镜像使用者映射的端口是80 443端口
EXPOSE 80 443
#入口指令(运行容器后默认运行下面的命令)
CMD ["nginx","g","daemon;"]
🌟生成镜像
docker build -t web:bird_v3 .
. 表示Dockerfile在当前目录下
-t 表示给自定义镜像命名
☀️运行容器
docker run -d --name bird_v2 -p 80:80 -p 443:443 --restart always web:bird_v2
🌏浏览器访问
http://10.0.0.81:80
✅Dockerfile相关故障
- 1️⃣dockerfile书写问题
- 2️⃣docker run 看容器运行状态
- 3️⃣docker logs 容器名字,看logs日志
- 4️⃣docker run -itd --name 容器名字 -p 80:80 web:bird_v2 /bin/bash替换掉CMD指定的命令
- 5️⃣docker exec -it 容器名字 /bin/bash 进入容器,执行检查类命令(nginxt -t/php-fpm -t)检查配置文件
- 6️⃣执行nginx -g ‘daemon off;’ 看运行状态和提示
✅Dockerfile变量
- Dockerfile使用ENV变量
FROM nginx:1.24
LABEL author=zhu desc="custom bird image"
ENV CODE_DIR=/app/code/bird/
ENV CODE_NAME bird.tar.gz
WORKDIR ${CODE_DIR}
RUN mkdir -p ${CODE_DIR}
ADD ${CODE_NAME} ${CODE_DIR}
ADD default.conf /etc/nginx/conf.d/
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]
- 生成镜像
docker build -t web:bird_v3 .
- 进入容器时自动到工作目录
docker exec -it bird_v3 /bin/bash
✅面试题:CMD,ENTRYPOINT区别
- 1️⃣CMD或ENTRYPOINT 二选一,选择1个使用
- 2️⃣CMD和ENTRYPOINT 一起使用
CMD和ENTRYPOINT区别 | 共同点 | 区别 |
---|---|---|
CMD | 运行容器的时候默认运行CMD或ENTRYPOINT后面的命令 | 运行容器的时候如果指定了命令,则CMD的内容就会被替换 |
ENTRYPOINT | 运行容器的时候默认运行CMD或ENTRYPOINT后面的命令 | 运行容器的时候如果指定了命令,则entrypoint+指定的命令 |
自定义镜像
FROM test:1.1
CMD ls
运行容器
docker run -d test:1.1 sleep 99
CMD指定的ls命令就会被替换为sleep 99
sleep 99
自定义镜像
FROM test:1.1
ENTRYPOINT ls
运行容器
docker run -d test:1.1 sleep 99
ENTRYPOINT指定的ls命令添加sleep 99参数
ls sleep 99
- 同时使用ENTRYPOINT和CMD
- CMD写的内容作为ENTRYPOINT内容的选项(参数)
FROM nginx:1.24
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
✅自定义zrlog镜像(war包)
-
自定义镜像方案01:系统镜像+jdk+tomcat
-
自定义镜像方案02:tomcat镜像+war包
-
1️⃣编写Dockerfile文件
FROM tomcat:9.0-jdk8
LABEL auth=zhu desc='zrlog docker image'
ENV CODE_NAME ROOT.war
WORKDIR /usr/local/tomcat/webapps/
ADD ${CODE_NAME} .
EXPOSE 8080
CMD ["catalina.sh", "run"]
# 监控业务是否正常
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:8080
- 2️⃣生成zrlog镜像
docker build -t web:zrlog_v1 .
- 3️⃣运行zrlog
docker run -d --name zrlog -p 8080:8080 --restart always web:zrlog_v1
- 4️⃣浏览器访问
http://10.0.0.81:8080