docker - 基于commit方法的镜像制作

参考资料

官方指南
知乎

制作自己的Docker镜像

制作自己的Docker镜像主要有如下两种方式:

  • 在运行一个已有镜像后,我们进入对应容器,进行了相关的操作(安装、配置等),想要保存相关的操作记录,则可以通过 docker commit 将容器保存为一个新的镜像.
  • 构建一个DockerFile(记录了镜像创建步骤),然后使用docker build创建一个新的镜像。

本文主要介绍通过commit进行镜像的创建,也就是我们基于一个已有镜像启动一个容器,然后再容器中进行相应的环境配置、软件安装,完成相关工作后,重新将容器打包成一个镜像。
DockerFile的创建可以参考另外一篇文章。

使用docker commit 命令来扩展镜像

docker commit的方案相对比较简单,而且在镜像创建过程中,允许通过交互式shell来进行容器的调试;但是仍然推荐使用DockerFile进行镜像的管理;docker commit 不会打包容器上挂载卷的数据;正在提交的容器和其进程将在提交镜像时暂停(关闭 –pause false)。

  1. 既然以容器为单位,所以首先我们需要获得一个运行状态的容器

    1
    2
    # 通过docker run 命令启动容器
    docker run -it -v /etc:/etc_test python:latest /bin/bash
  2. 进入容器,对容器内的环境(软件、文件、环境、用户等)进行更改。实际和正常使用容器的过程一样

    1
    2
    3
    4
    5
    docker run -it  -v /etc:/etc_test ae9660359c2a  /bin/bash
    root@1fb4f27a9174:/# pip install pandas
    Collecting pandas
    Downloading pandas-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.3 MB)
    ━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0.3/12.3 MB 72.4 kB/s eta 0:02:46
  • docker commit 提交修改的镜像
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] # 从容器创建一个新的镜像。
    -a :提交的镜像作者;
    -c :使用Dockerfile指令来创建镜像,更改dockerFile的元数据;
    -m :提交时的说明文字;
    -p :在commit时,将容器暂停。

    eg: docker commit -m "this is a test" --author='Ben' bbcad8aaf6f1 test:v1

    $ docker ps

    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    c3f279d17e0a ubuntu:22.04 /bin/bash 7 days ago Up 25 hours desperate_dubinsky
    197387f1b436 ubuntu:22.04 /bin/bash 7 days ago Up 25 hours focused_hamilton

    docker inspect -f "{{ .Config.Env }}" c3f279d17e0a
    [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

    # 更改DockerFile的 "ENV" 指令,制定DEBUG的参数为true
    docker commit --change "ENV DEBUG=true" c3f279d17e0a svendowideit/testimage:version3
    f5283438590d

    docker inspect -f "{{ .Config.Env }}" f5283438590d
    [HOME=/ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DEBUG=true]

使用 docker commit 完成登记以后,新的镜像就创建完成了。

可以看到,通过在容器中进行操作,然后commit保存镜像的方法非常便捷,尤其是针对镜像环境/软件依赖没有明确的情况下,可以灵活的进行环境的调整和测试。而且不需要额外的去熟悉学习DockerFile的相关命令和特性,对刚接触Docker的人来说相对友好。

但是另一个方面,每一个运行的容器中的所有操作统一保存到镜像,一方面难免会存在一些冗余操作,另一方面,不如dockerFile方便进行共享。

-------------本文结束感谢您的阅读-------------