一、需求
当某个镜像无法直接满足需求时,就可以在这些镜像的基础上修改,然后保存为新的镜像。
实例:在镜像busybox:latest
的基础上,新增了一个hello.txt
文件,形成一个镜像busybox:v1
。
二、拉取最新
镜像,创建容器,对容器进行修改
# 拉取busybox:latest镜像,并新建容器container1,最后在容器里新建了一个文件hello.txt
docker run --name container1 busybox touch hello.txt
docker commit [OPTIONS] CONTAINER [镜像名]
[OPTIONS]
:命令选项,其中--author
指定作者,--message
制定commit
的信息;CONTAINER
:需要commit
的容器;镜像名
:新镜像的名字,以:
的方式来指定。如果不显示设置,将默认为None:None
。(这个代表没有指定镜像名)
本例为:
# 将container1容器保存为busybox:v1镜像
docker commit container1 busybox:v1
查看效果
# docker exec进入了该容器内部,实际上就是进入容器另开一个终端。
# 若报错,可将/bin/bash修改为/bin/sh
docker run -it --name container5 busybox:v1 /bin/bash
# 查看所有文件
ls
四、使用commit定制镜像的缺陷
在实际的环境中,一般不会使用Commit
去构建一个镜像:
1. 由于commit
会将对容器做出所有的修改都保存为镜像,换句话说,就是在原有镜像的基础上,再叠加上容器的存储层(该存储层仅仅保存了容器所做的修改),将这些内容构成一个新的镜像。
2. docker commit
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。
更好的定制镜像的方法:Dockerfile
!!
参考:https://www.educoder.net/shixuns/4uyn5ebp/challenges