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:指定镜像的名称和版本号

posted @   functionMC  阅读(2125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示