文章目录
1. 自定义镜像
1.1 什么是自定义镜像?
自定义镜像并不是从零开始构建的,而是基于已有的“基镜像”进行修改和扩展。基镜像可以是官方提供的镜像,也可以是其他开发者创建的镜像。通过Dockerfile文件,在基镜像的基础上添加所需的软件、配置文件、环境变量等,最终生成一个符合需求的新镜像。
1.2 Dockerfile的基本结构
Dockerfile是一个文本文件,包含了一系列指令,用于定义如何构建镜像。
常用的指令如下:
- FROM:指定基镜像。
- MAINTAINER:指定镜像的维护者信息(已弃用,推荐使用LABEL)。
- RUN:在临时容器中执行命令。例如,RUN yum install -y net-tools用于安装ifconfig命令。
- ADD:将文件从主机复制到镜像中,并支持自动解压。例如,ADD myapp.tar.gz /app。
- COPY:将文件从主机复制到镜像中,但不支持自动解压。例如,COPY myapp.conf /etc/myapp/。
- ENV:设置环境变量。例如,ENV MY_ENV=value。
- USER:指定容器内运行进程的用户。例如,USER tom。
- VOLUME:定义数据卷。例如,VOLUME [“/data1”, “/data2”]。
- EXPOSE:声明容器运行时监听的端口。例如,EXPOSE 80。
- CMD:指定容器启动时默认执行的命令,指定的命令可以被docker run命令行参数覆盖。
- ENTRYPOINT:指定容器启动时默认执行的命令,指定的命令不会被覆盖,docker run命令行参数会作为ENTRYPOINT命令的参数。
1.3 构建镜像的过程
(1) 基于基镜像创建临时容器:Docker会根据Dockerfile中的FROM指令拉取基镜像,并创建一个临时容器。
(2) 执行Dockerfile中的指令:在临时容器中依次执行RUN、ADD、COPY等指令,安装软件、配置环境等。
(3) 导出新镜像:所有指令执行完毕后,Docker会将临时容器导出为一个新的镜像。
(4) 删除临时容器:最后,Docker会删除临时容器,保留新生成的镜像。
命令语法:
docker build -t 新镜像名:tag 目录 -f Dockerfile文件名
> -t:指定新镜像的名称和标签。
> 目录:指定构建上下文,即ADD或COPY指令中文件的来源目录。如果使用当前目录,可以写为.。
> -f:指定Dockerfile文件的路径。如果文件名为Dockerfile,则可以省略此选项。
1.4 示例:自定义Nginx镜像
假设我们需要构建一个自定义的Nginx镜像,步骤如下:
1.4.1 准备工作:
备份Yum仓库配置,并创建一个简单的HTML文件:
tar zcf /root/repo.tar.gz /etc/yum.repos.d/*.repo
echo 'hello nginx!' > index.html
1.4.2 编写Dockerfile文件:
FROM hub.c.163.com/library/centos
RUN rm -rf /etc/yum.repos.d/*
ADD repo.tar.gz /etc/yum.repos.d/
RUN yum install nginx -y && \
yum clean all
ADD index.html /usr/share/nginx/html/
# 通知用户,端口是80,并无决定性做用
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
1.4.3 构建镜像:
docker build -t nginx:v1 . -f dockerfile_nginx
1.4.4 运行容器:
docker run -dit --name=web1 -p 888:80 nginx:v1
1.4.5 构建完成:
当使用新镜像创建容器时,如果没有指定容器里运行的是什么,则运行的是镜像CMD指定的内容。
2. 多阶段构建
2.1 什么是多阶段构建?
多阶段构建是Docker 17.05版本引入的一项功能,允许在一个Dockerfile中使用多个FROM指令。每个FROM指令代表一个构建阶段,最终只保留最后一个阶段的镜像。这种方式可以显著减小最终镜像的大小,因为它只包含运行应用所需的文件和依赖,而不包含构建过程中产生的中间文件。
2.2 多阶段构建的优势
- 减小镜像体积:通过多阶段构建,可以避免将构建工具和中间文件打包到最终镜像中。
- 简化构建流程:可以在一个Dockerfile中完成复杂的构建过程,而不需要维护多个Dockerfile。
2.3 示例:多阶段构建带有ifconfig命令的Nginx镜像
假设我们需要构建一个包含ifconfig命令的Nginx镜像,可以使用多阶段构建来实现:
2.3.1 编写Dockerfile:
FROM centos:7 AS builder
RUN yum install net-tools -y
FROM centos:7
COPY --from=builder /sbin/ifconfig /sbin/
RUN yum install nginx -y && \
yum clean all
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2.3.2 构建镜像:
docker build -t nginx-with-ifconfig:v1 .
2.3.3 运行容器:
docker run -dit --name=web2 -p 888:80 nginx-with-ifconfig:v1
在这个例子中,第一个阶段安装了net-tools,第二个阶段从第一个阶段中复制了ifconfig命令,并安装了Nginx。最终生成的镜像只包含Nginx和ifconfig命令,而不包含net-tools的安装包。
3 总结
通过自定义Docker镜像,可以根据需求灵活地配置容器环境。多阶段构建进一步优化了镜像的构建过程,减小了镜像体积,提升了构建效率。无论是简单的镜像定制,还是复杂的多阶段构建,Docker都提供了强大的工具和灵活的选项。