linux运维知识体系

Dockerfile自定义镜像

2025/03/16
143
0

🌟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 off;"]
  • 说明
#指定基础镜像
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 off;"]

🌟生成镜像

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:80
  • 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

🌟自定义exam镜像(jar包)

  • 准备文件
    • application-prod.yml
    • entry.sh
    • xzs-3.9.0.jar

  • 编写Dockerfile
FROM java:8u111-jdk
LABEL author=zhu desc="exam backend"

ENV VER 3.9.0
ENV ENVIR prod
ENV CONF application-${ENVIR}.yml
ENV CODE xzs-${VER}.jar
ENV DIR /app/code/exam/backend/

RUN mkdir -p ${DIR}

WORKDIR ${DIR}

ADD ${CONF} .
ADD ${CODE} .
ADD entry.sh .

EXPOSE 8000

CMD ["./entry.sh"]

HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:8000
  • entry.sh
#!/bin/bash
##############################################################
# File Name:entry.sh
# Version:V1.0
# Author:zbl
# Organization:www.zhubl.xyz
# Desc:
##############################################################
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar
  • 生成镜像
docker build -t web:exam .

  • 运行镜像
docker run -d --name exam -p 8000:8000 --restart always web:exam

  • 浏览器访问

🌟从系统开始自定义war镜像

  • 准备文件
    • apache-tomcat
    • ROOT.war

  • 编写Dockerfile
FROM ubuntu:22.04
LABEL author=zhu desc="zrlog_ubuntu images"

ENV CODE_NAME=ROOT.war
ENV TOMCAT_NAME=apache-tomcat-9.0.106.tar.gz
ENV DIR=/app/tools/

RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g'   /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openjdk-11-jdk curl

RUN mkdir -p ${DIR}
ADD ${TOMCAT_NAME} ${DIR}
RUN mv ${DIR}apache-tomcat-9.0.106 ${DIR}tomcat

WORKDIR ${DIR}tomcat/
RUN rm -rf webapps/ROOT
ADD ${CODE_NAME} webapps/

EXPOSE 8080

CMD ["./bin/catalina.sh", "run"]

# 监控业务是否正常
HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl http://127.0.0.1:8080

🌟从系统开始自定义jar镜像

  • 准备文件
    • application-prod.yml
    • xzs-3.9.0.jar
    • entry.sh

  • 书写Dockerfile
FROM ubuntu:22.04
LABEL author=zhu desc="exam_ubuntu images"

ENV VER=3.9.0
ENV ENVIR=prod
ENV CONF=application-${ENVIR}.yml
ENV CODE=xzs-${VER}.jar
ENV DIR /app/code/exam/backend/

RUN sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openjdk-11-jdk curl
RUN mkdir -p ${DIR}
WORKDIR ${DIR}

ADD ${CONF} .
ADD ${CODE} .
ADD entry.sh .

EXPOSE 8000

CMD ["./entry.sh"]

HEALTHCHECK --interval=5s --timeout=20s --retries=2 CMD curl 127.0.0.1:8000
  • entry.sh
#!/bin/bash
##############################################################
# File Name:entry.sh
# Version:V1.0
# Author:zbl
# Organization:www.zhubl.xyz
# Desc:
##############################################################
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar
  • 运行Dockerfile
docker build -t web:exam .
  • 运行镜像
docker run -d --name exam -p 8000:8000 --restart always web:exam
  • 浏览器访问
http://10.0.0.81:8000