2. docker commit 制作镜像

docker commit 命令

docker commit 命令是 Docker 中一个用于将运行中的容器保存为新镜像的命令。它的主要作用是将容器的当前状态(包括文件系统变更和配置)捕获为一个新的镜像。

本小节我们讲述如何使用 docker commit 命令来制作 Docker 镜像。

一个容器通常有一个或多个只读的镜像层(如下图的 74fe38d11401 )和一个可写层(Writeable layer)组成,可写层用于容器运行时存放临时数据。

如下图所示:

使用 docker commit 制作镜像就是将当前容器的可写层(Writable Layer)转换为一个新的只读层,并基于原镜像的其他只读层生成一个新的镜像。这个转换为只读层的可写层,会作为新镜像的最上层。

制作步骤:

  1. 创建并运行一个容器。
  2. 向容器内添加应用程序和运行环境。
  3. 用 docker commit 命令将容器打包为镜像。
  4. 将镜像发布到其他 Linux 平台进行测试。

本节目标

我们将上节课用 Python 中的 http.server 模块搭建的 Web 服务器封装成 Docker 容器。

2.1 创建并运行一个容器

准备资料

  1. ubuntu:24.04 官方镜像(可以使用 sudoc docker pull ubuntu:24.04 从官方下载,也可以从百度网盘下载)。
  2. mywebsite.tar.gz 网页的压缩包(需要从百度网盘下载或手动生成-参照上节课制作)

上述资料百度网盘下载地址:

执行 docker load 命令导入 ubuntu24.04_docker_images.tar.xz 如下:

weimingze@mzstudio:~$ sudo docker load -i ubuntu24.04_docker_images.tar.xz
3abdd8a5e7a8: Loading layer [==================================================>]  80.61MB/80.61MB
Loaded image: ubuntu:24.04
weimingze@mzstudio:~$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       24.04     602eb6fb314b   2 months ago   78.1MB

我们通过 docker history 命令可以查看这个 ubuntu:24.04 由几层组成。

weimingze@mzstudio:~$ sudo docker history ubuntu:24.04
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
602eb6fb314b   2 months ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      2 months ago   /bin/sh -c #(nop) ADD file:1d7c45546e94b90e9…   78.1MB
<missing>      2 months ago   /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
<missing>      2 months ago   /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
<missing>      2 months ago   /bin/sh -c #(nop)  ARG LAUNCHPAD_BUILD_ARCH     0B
<missing>      2 months ago   /bin/sh -c #(nop)  ARG RELEASE                  0B

从上述信息可知 ubuntu:24.04 镜像一共有 6 层只读层,默认的容器主进程的执行命令是 /bin/bash

下面我们以 ubuntu:24.04 作为基础镜像创建 Python Web 服务器。

使用 docker run 命令以 ubuntu:24.04 作为基础镜像,创建并运行器一个名为 my_ubuntu 的容器。并使用 -it 选项让容器主进程 /bin/bash 和终端绑定。

weimingze@mzstudio:~$ sudo docker run -it --name my_ubuntu ubuntu:24.04
root@0d0695780c8e:/# 

如果运行失败则需要使用 sudo docker rm my_ubuntu 来删除容器后从创建并运行。