docker镜像制作和管理详解
一. 制作镜像
制作镜像有两种方式,基于命令 docker commit 和dockerfile。鉴于docker commit太low了。就此略过 略略略~~~
1)dockerfile介绍
DockerFile 是一种被Docker程序解释执行的脚本,由很多条命令组成。docker程序读取dockerfile 并根据指令生成docker镜像。
docker守护程序dockerfile逐一运行指令,如有必要,将每个指令的结果提交到新景祥,然后最终输出新的镜像ID。
docker守护程序将自动清理之前发送的上下文。
docker将尽可能重用中间镜像层(缓存),以显著加速docker build命令的执行过程,由using cache 控制台输出的中消息指示
类似于ansible的逻辑。各位看官老爷这有专栏 先空着,后期补上~
dockerfile 文件说明
*每一行以dockerfile的指令开头,指令不区分大小写,但惯例使用大写(专业or装逼?)
*使用#开始作为注释
每行只支持一条指令,每条指令可以携带多个参数
指令按文件顺序从上到下执行
每个指令的执行会生成一新的镜像出,为了减少分层和镜像大小,尽可以将多条指令合并成一条指令
制作镜像一般可能需要反复多次,每次执行dockerfile都按顺序执行,从头开始,已经执行过的指令已经缓存,不需要在执行,如果后续有一行新的指令没执行过,期望后的指令将会重新执行,所以为加速镜像制作,将最常变化的内容放在dockerfile的文件后面。
2) 放大招了,别错过了哈
示例:假设我们正在构建一个基于 Python 的 Web 应用,使用 Flask 框架。包含多阶段构建、环境变量、健康检查、日志配置等生产环境中常见的最佳实践
示例 Dockerfile
#第一阶段:构建阶段
FROM python:3.8-slim AS builder
#设置维护者信息
LABEL maintainer="your-email@example.com"
#设置环境变量
ENV PYTHONUNBUFFERED 1 \
APP_HOME=/app \
PATH=$APP_HOME:$PATH
#设置工作目录
WORKDIR $APP_HOME
#复制应用代码到镜像中
COPY . $APP_HOME
#安装系统依赖(如果需要)
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
#安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
#运行构建步骤(如果需要)
RUN python setup.py build
#第二阶段:运行阶段
FROM python:3.8-slim
#设置维护者信息
LABEL maintainer="your-email@example.com"
#设置环境变量
ENV PYTHONUNBUFFERED 1 \
APP_HOME=/app \
PATH=$APP_HOME:$PATH
#设置工作目录
WORKDIR $APP_HOME
#从构建阶段复制构建结果
COPY --from=builder $APP_HOME $APP_HOME
#安装运行时依赖(如果需要)
RUN apt-get update && apt-get install -y \
libpq5 \
&& rm -rf /var/lib/apt/lists/*
#创建一个数据卷(如果需要)
VOLUME $APP_HOME/data
#暴露应用端口
EXPOSE 5000
#设置健康检查
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl --fail http://localhost:5000/health || exit 1
#设置容器启动时运行的默认命令
CMD ["gunicorn", "-w", "3", "--bind", "0.0.0.0:5000", "app:app"]
#设置日志配置
#可以通过环境变量或配置文件来设置日志级别和路径
#ENV LOG_LEVEL=info
#ENV LOG_FILE=/app/logs/app.log
#创建日志目录(如果需要)
RUN mkdir -p /app/logs
详细解释
1. FROM (构建阶段)
- 作用:指定基础镜像。
- 示例:FROM python:3.8-slim AS builder
- 解释:使用官方的 Python 3.8 瘦身版镜像作为构建阶段的基础镜像,并命名为 builder。
2. LABEL
- 作用:添加元数据到镜像。
- 示例:LABEL maintainer="your-email@example.com"
- 解释:设置维护者的邮箱地址。
3. ENV
- 作用:设置环境变量。
- 示例:
dockerfile
ENV PYTHONUNBUFFERED 1 \
APP_HOME=/app \
PATH=$APP_HOME:$PATH
- 解释:设置多个环境变量,防止 Python 缓冲输出,设置应用主目录为 /app,并将应用目录添加到 PATH 中。
4. WORKDIR
- 作用:设置工作目录。
- 示例:WORKDIR $APP_HOME
- 解释:设置容器的工作目录为 /app,使用环境变量 $APP_HOME。
5. COPY
- 作用:从本地文件系统复制文件或目录到镜像中。
- 示例:COPY . $APP_HOME
- 解释:将当前目录下的所有文件复制到镜像的 /app 目录中。
6. RUN (安装系统依赖)
- 作用:在镜像中运行命令。
- 示例:
dockerfile
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
- 解释:更新包列表并安装 build-essential 和 libpq-dev,然后清理缓存文件,以减小镜像大小。
7. RUN (安装 Python 依赖)
- 作用:在镜像中运行命令。
- 示例:RUN pip install --no-cache-dir -r requirements.txt
- 解释:安装 requirements.txt 文件中列出的所有 Python 依赖,并禁用缓存以减小镜像大小。
8. RUN (运行构建步骤)
- 作用:在镜像中运行命令。
- 示例:RUN python setup.py build
- 解释:运行构建步骤,例如 python setup.py build。
9. FROM (运行阶段)
- 作用:指定基础镜像。
- 示例:FROM python:3.8-slim
- 解释:使用官方的 Python 3.8 瘦身版镜像作为运行阶段的基础镜像。
10. COPY (从构建阶段复制构建结果)
- 作用:从构建阶段复制文件或目录到运行阶段的镜像中。
- 示例:COPY --from=builder $APP_HOME $APP_HOME
- 解释:从构建阶段 builder 复制构建结果到 /app 目录。
11. RUN (安装运行时依赖)
- 作用:在镜像中运行命令。
- 示例:
dockerfile
RUN apt-get update && apt-get install -y \
libpq5 \
&& rm -rf /var/lib/apt/lists/*
- 解释:更新包列表并安装 libpq5,然后清理缓存文件,以减小镜像大小。
12. VOLUME
- 作用:创建一个挂载点,用于持久化数据。
- 示例:VOLUME $APP_HOME/data
- 解释:创建一个数据卷,挂载点为 /app/data,用于持久化数据。
13. EXPOSE
- 作用:声明容器运行时需要开放的端口。
- 示例:EXPOSE 5000
- 解释:声明容器运行时需要开放 5000 端口。
14. HEALTHCHECK
- 作用:设置健康检查。
- 示例:
dockerfile
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD curl --fail http://localhost:5000/health || exit 1
- 解释:每 30 秒检查一次健康状态,超时时间为 10 秒,失败重试 3 次。如果 http://localhost:5000/health 返回非 200 状态码,则认为容器不健康。
15. CMD
- 作用:指定容器启动时运行的默认命令。
- 示例:CMD ["gunicorn", "-w", "3", "--bind", "0.0.0.0:5000", "app:app"]
- 解释:使用 Gunicorn 启动应用,设置 3 个工作进程,绑定到 0.0.0.0:5000 端口,加载 app:app。
16. 日志配置
- 作用:设置日志配置。
- 示例:
dockerfile
可以通过环境变量或配置文件来设置日志级别和路径
ENV LOG_LEVEL=info
ENV LOG_FILE=/app/logs/app.log
- 解释:可以通过环境变量或配置文件来设置日志级别和路径。
17. 创建日志目录
- 作用:创建日志目录。
- 示例:RUN mkdir -p /app/logs
- 解释:创建 /app/logs 目录,用于存放应用日志。
其他指令以及补充
ONBUILD 触发器
子镜像只要调用父镜像就会自动触发执行的命令
USER 指定当前用户
RUN groupadd -r mysql && useradd - r -g mysql mysql
dcokerignore 忽略文件和文件夹指定模式
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off"]
/usr/sbin/nginx 启动nginx -g 用户设置nginx的全局配置参数 daemon off 让nginx在前台执行
nginx 默认是后台已启动。
构建和运行镜像
1. 构建镜像:
- 打开终端,导航到包含 Dockerfile 的目录。
- 运行以下命令构建镜像:
docker build -t my-flask-app .
2. 运行容器:
- 运行以下命令启动容器:
docker run -d -p 5000:5000 my-flask-app
其他注意事项
1. 环境变量:
- 可以通过 -e 参数在运行容器时传递环境变量:
docker run -d -p 5000:5000 -e LOG_LEVEL=info -e LOG_FILE=/app/logs/app.log my-flask-app
2. 日志管理:
- 可以使用 Docker 的日志驱动来管理日志,例如使用 json-file 或 syslog:
docker run -d -p 5000:5000 --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 my-flask-app
3. 健康检查:
- 健康检查可以确保容器在出现问题时能够及时重启,提高应用的可用性。
4. 多阶段构建:
- 多阶段构建可以显著减小最终镜像的大小,因为它只包含运行应用所需的文件和依赖,而不包含构建过程中使用的工具和中间文件。