参考资料
制作自己的Docker镜像
制作自己的Docker镜像主要有如下两种方式:
- 在运行一个已有镜像后,我们进入对应容器,进行了相关的操作(安装、配置等),想要保存相关的操作记录,则可以通过 docker commit 将容器保存为一个新的镜像.
- 构建一个DockerFile(记录了镜像创建步骤),然后使用docker build创建一个新的镜像。
本文主要介绍通过commit进行镜像的创建,也就是我们基于一个已有镜像启动一个容器,然后再容器中进行相应的环境配置、软件安装,完成相关工作后,重新将容器打包成一个镜像。
DockerFile的创建可以参考另外一篇文章。
使用docker commit 命令来扩展镜像
docker commit的方案相对比较简单,而且在镜像创建过程中,允许通过交互式shell来进行容器的调试;但是仍然推荐使用DockerFile进行镜像的管理;docker commit 不会打包容器上挂载卷的数据;正在提交的容器和其进程将在提交镜像时暂停(关闭 –pause false)。
既然以容器为单位,所以首先我们需要获得一个运行状态的容器
1
2# 通过docker run 命令启动容器
docker run -it -v /etc:/etc_test python:latest /bin/bash进入容器,对容器内的环境(软件、文件、环境、用户等)进行更改。实际和正常使用容器的过程一样
1
2
3
4
5docker 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
23docker 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方便进行共享。