6.8 KiB
6.8 KiB
背景介绍
Docker 镜像制作类似于虚拟机的模板制作,即按照公司的实际业务将需要安装的软件、相关配置等基础环境配置完成,然后将虚拟机再提交为模板,最后再批量从模板批量创建新的虚拟机,这样可以极大地简化业务中相同环境的虚拟机运行环境的部署工作,Docker的镜像制作分为手动制作可自动制作(基于 DockerFile ),企业通常都是基于 DockerFile 制作镜像。
手动制作nginx镜像
[root@docker-server ~]# docker run -it ubuntu bash
root@1d8e32ab39d6:/# apt-get update & apt-get install nginx curl vim-tiny -y
root@1d8e32ab39d6:/# echo 'eagleslab nginx' > /var/www/html/index.nginx-debian.html
root@1d8e32ab39d6:/# grep daemon /etc/nginx/nginx.conf
daemon off;
# 提交为镜像
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
[root@docker-server ~]# docker commit -a "v100" -m "my nginx image v1" 0195bc1d0f7b ubuntu_nginx:v1
# 通过ubuntu_nginx:v1镜像启动容器
[root@docker-server ~]# docker run -d -p 8081:80 ubuntu_nginx:v1
[root@docker-server ~]# curl 127.0.0.1:8081
适用场景:主要作用是将配置好的一些容器复用,再生成新的镜像。 commit是合并了save、load、export、import这几个特性的一个综合性的命令,它主要做了:
- 将容器当前的读写层保存成一个新层。
- 和镜像的历史层一起合并成一个新的镜像
- 如果原本的镜像有3层,commit之后就会有4层,最新的一层为从镜像运行到commit之间对文件系统的修改。
DockerFile制作镜像
DockerFile可以说是一种可以被Docker程序解释的脚本,DockerFile是由一条条的命令组成的,每条命令对应linux下面的一条命令,Docker程序将这些DockerFile指令再翻译成真正的linux命令,其有自己的书写方式和支持的命令,Docker程序读取DockerFile并根据指令生成Docker镜像,相比手动制作镜像的方式,DockerFile更能直观地展示镜像是怎么产生的,有了写好的各种各样的DockerFIle文件,当后期某个镜像有额外的需求时,只要在之前的DockerFile添加或者修改相应的操作即可重新生成新的Docker镜像,避免了重复手动制作镜像的麻烦。
最佳实践
# Dockerfile
## 使用官方 Ubuntu 22.04 LTS 作为基础镜像
FROM ubuntu:22.04
## 设置环境变量避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive
## 安装 Nginx 并清理缓存(合并操作用于减少镜像层)
RUN apt-get update && \
apt-get install -y \
nginx \
# 安装常用工具(可选)
curl \
vim-tiny && \
# 清理APT缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/*
## 删除默认配置文件(按需保留)
RUN rm /etc/nginx/sites-enabled/default
## 暴露 HTTP 和 HTTPS 端口
EXPOSE 80 443
## 创建日志目录(确保日志可持久化)
RUN mkdir -p /var/log/nginx && \
chown -R www-data:www-data /var/log/nginx
## 添加自定义配置(示例文件需存在于构建上下文)
# COPY nginx.conf /etc/nginx/nginx.conf
# COPY sites-available/ /etc/nginx/sites-available/
## 设置健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
## 以非root用户运行(Ubuntu官方nginx包已使用www-data用户)
USER www-data
## 启动Nginx并保持前台运行
CMD ["nginx", "-g", "daemon off;"]
# 通过Dockerfile构建镜像
[root@docker-server ~]# docker build -t nginx:v1 .
优化说明
- 层合并: 将多个
RUN
指令合并以减少镜像层数 - 缓存清理: 清理APT缓存减小镜像体积
- 安全实践: 非root用户运行;只读挂载配置文件
- 可维护性: 显式声明暴露端口;健康检查配置;日志目录持久化
- 稳定性: 指定精确的ubuntu版本;禁用Nginx后台模式
指令说明
操作指令
指令 | 说明 |
---|---|
RUN |
运行指定命令 |
CMD |
启动容器时指定默认执行的命令 |
ADD |
添加内容到镜像 |
COPY |
复制内容到镜像 |
配置指令
指令 | 说明 |
---|---|
ARG |
定义创建镜像过程中使用的变量 |
FROM |
指定所创建镜像的基础镜像 |
LABEL |
为生成的镜像添加元数据标签信息 |
EXPOSE |
声明镜像内服务监听的端口 |
ENV |
指定环境变量 |
ENTRYPOINT |
指定镜像的默认入口命令 |
VOLUME |
创建一个数据卷挂载点 |
USER |
指定运行容器时的用户名或UID |
WORKDIR |
配置工作目录 |
ONBUILD |
创建子镜像时指定自动执行的操作指令 |
STOPSIGNAL |
指定退出的信号值 |
HEALTHCHECK |
配置所启动容器如何进行健康检查 |
SHELL |
指定默认shell类型 |
注意事项
# RUN
- 运行指定命令
- 每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像层
- 当命令较长时可以使用\来换行
# CMD
- 每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行
- CMD指令用来指定启动容器时默认执行的命令,支持三种格式:
CMD ["executable","param1","param2"]
CMD command param1 param2`
CMD ["param1","param2"]
# ADD
- 该命令将复制指定的src路径下内容到容器中的dest路径下
- src可以是DockerFIle所在目录的一个相对路径,也可以是一个url,还可以是一个tar
- dest可以是镜像内绝对路径,或者相对于工作目录的相对路径
# COPY
- COPY与ADD指令功能类似,当使用本地目录为源目录时,推荐使用COPY
# ARG
- 定义创建过程中使用到的变量;比如:HTTP_PROXY 、HTTPS_PROXY 、FTP_PROXY 、NO_PROXY不区分大小写。
# FROM
- 指定所创建镜像的基础镜像:为了保证镜像精简,可以选用体积较小的Alpin或Debian作为基础镜像
# EXPOSE
- 声明镜像内服务监听的端口:该指令只是起到声明作用,并不会自动完成端口映射
# ENTRYPOINT
- 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数支持两种格式:
ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2
- 此时CMD指令指定值将作为根命令的参数
- 每个DockerFile中只能有一个ENTRYPOINT,当指定多个时只有最后一个起效
# VOLUME: 创建一个数据卷挂载点
# WORKDIR
- 为后续的RUN、CMD、ENTRYPOINT指令配置工作目录:建议使用绝对路径