自定义Docker镜像与多阶段构建:从基础到进阶

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都提供了强大的工具和灵活的选项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值