Docker极简入门系列(三):制作镜像的两种方式(容器转镜像和dockerfile)
本系列为Docker的学习笔记,内容比较精简,主要用于快速复习和随时查询。计划分六个章节内容:
- 安装、常用命令和基本概念理解
- 常用应用程序的容器部署
- 制作镜像的两种方式(容器转镜像和Dockerfile)
- 布署一个ASP.NET Core项目
- 服务编排Docker compose
镜像由文件叠加而成,且文件层可以共享复用。比如对Linux系统来说,最底层是bootfs,其上是rootfs。假设有两个镜像,都需要这两层文件,则这两个镜像可以共享复用linux操作系统的bootfs和rootfs,不需要再重新下载,这也是Docker和虚拟机的最大区别。需要补充说明的是,因为文件层是由各个镜像共享复用的,所以文件层一定是只读的。
基于以上原理,制作镜像有两种方式,一是制作一个Docker可以识别和执行的描述性文件,文件中说明镜像由哪些文件层组成、创建容器时执行一些相关命令以及其它一些描述性信息,这个文件就是Dockerfile,通过Dockerfile创建镜像,是最主要的方式;另外一种方式,是通过容器反过来生成镜像,我们知道镜像中的文件层都是只读到,但镜像容器化后,里面的文件就是可写的了,我们可以修改容器中的配置和数据,然后使用这个经过修改后的容器,生成定制化的镜像,比如我们可以制作一个更符合我们需求的定制化redis镜像。
一、容器转镜像
1、使用容器制作镜像:docker commit 容器id 镜像名称:版本号
2、将镜像打包(镜像不能传输,但压缩包可以):docker save -o 压缩文件名称.tar 镜像名称:版本号
3、加载压缩包并转成镜像:docker load -i 压缩文件名称.tar
*注:如果在容器中,有目录挂载(数据卷),则由容器生成的镜像,不会包含这些数据。如果要挂载的话,可以在创建容器时挂载目录。
二、Dockerfile
1、一个文本文件,由一条条指令组成,当使用dockerfile文件来创建镜像时,会自上而下,分步执行
2、Dockerfile的语法很简单,由指令关键词和指令内容两部分组成,如【FROM scratch】
3、常用指令如下所示,我做了一下简单分类:
(1)文件类:
- FROM:指定父镜像,如果本地没有,则会从远程拉取
- COPY:简单的复制本地文件到镜像中,不能进行解压等操作
- ADD:复制本地或远程文件到镜像中,能够自动处理URL远程文件和解压tar包
(2)设置类:
- ENV:环境变量,创建容器的时候,可以通过-e给环境变量重新赋值
- ARG:构建参数,在构建镜像的时候,可以使用的参数。先于环境变量,所以如果和环境变量重名,则会被环境变量覆盖。
- EXPOSE:设置容器运行时监听的端口,创建容器的时候,通过-p设置端口映射。只是一种声明,实际上不填EXPOSE,外界也可以操作-p映射。
- VOLUME:指定哪些目录可以挂载到数据卷,创建容器的时候,通过-v指定数据卷。只是一种声明,实际上不填VOLUME,外界也可以操作-v映射。
- WORKDIR:指定进入容器后的默认目录,一个落脚点,可以在命令过程中切换工作目录
- USER:指定构建镜像时,执行RUN、CMD、ENTRYPONT等命令的用户
(3)命令类:
- RUN:构建镜像过程中(docker build过程中),执行的linux命令,比如在一个自制的CentOS镜像中提前安装vim
- CMD:启动容器时默认执行的linux命令(docker run过程中)。最多只有一个,如果设置多个,则只执行最后一个。可以通过docker run时指定命令行参数来覆盖
- ENTRYPOINT:应该算是正宗的容器入口命令,也是在docker run时执行。如果即有ENTRYPOINT,又有CMD时,则只执行ENTRYPOINT,且CMD成为ENTRYPOINT的参数,所以可以通过在docker run时指定命令行参数来给ENTRYPOINT传递参数。也可以通过--entrypoint,在docker run时指令命令来覆盖。实际上CMD和ENTRYPOINAT通常结合在一起使用,ENTRYPOINT定义不能修改的命令参数,CMD定义可以修改的命令参数。
- 三个命令都可以使用两种格式,exec格式,如 CMD cmmand param1 param2 ;shell格式,如 CMD["command","param1","param2"] 。如果需要在docker run时,传入命令参数,则必须使用shell格式。
(4)其它:
- MAINTAINER:描述作者信息
- LABEL:以键=值的方式,设置一些描述信息,可以代替MAINTAINER的作用
- SHELL:指定执行RUN、CMD、ENTRYPOINT等命令时,使用shell
- HEALTHCHECK:指定监测当前容器的健康检测命令
- ONBUILD:当存在ONBULID关键字的镜像作为基础镜像,当执行FROM完成之后,会执行ONBUILD中的命令
三、Dockerfile案例:使用dockerfile的方式,制作一个CentOS7的镜像,要求初始目标为/work,安装vim。
#创建一个dockerfiles目录,用于存放dockerfile
mkdir docker-files
cd docker-files
#创建dockerfile文件
vim centos_dockerfile
#文件内容如下:
FROM centos:7
LABEL author="functionMC"
RUN yum install -y vim
WORKDIR /work
CMD /bin/bash
#构建镜像
docker build -f ./centos_dockerfile -t mc_centos:1 .
#参数说明:
#-f:指定dockerfile的文件路径,例子为当前目录下的centos_dockerfile
#-t:指定镜像的名称和版本号
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!