Docker-05-镜像原理

Docker-05-镜像原理

前序

  1. 什么是镜像?

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

2. Docker镜像 加载原理

2.1 联合文件系统(UnionFS)

  • 假设一个Dockerfile内容如下
1
2
3
4
FROM ubuntu:14.04
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]
  • 联合文件系统对应的层次图如下所示

mark

  1. FROM ubuntu:14.04 :设置基础镜像,此时会使用基础镜像ubuntu:14.04的所有镜像层,为简单起见,图中将其作为一个整体展示。
  2. ADD run.sh /:将Dockerfile所在目录的文件run.sh加至镜像的根目录,此时新一层的镜像只有一项内容,即根目录下的run.sh.
  3. VOLUME /data:设定镜像的VOLUME,此VOLUME在容器内部的路径为/data。需要注意的是,此时并未在新一层的镜像中添加任何文件,但更新了镜像的json文件,以便通过此镜像启动容器时获取这方面的信息。
  4. CMD [“./run.sh”]:设置镜像的默认执行入口,此命令同样不会在新建镜像中添加任何文件,仅仅在上一层镜像json文件的基础上更新新建镜像的json文件。

总结:是一层一层的折叠上去

图上顶上的两层,是Docker为Docker容器新建的内容,而这两层属于容器范畴。这两层分别为Docker容器的初始层(Init Layer)与可读写层(Read-Write Layer)。

  • 初始层
    • 大多是初始化容器环境的时候,与容器相关的环境信息,如容器主机名,主机host信息以及域名服务文件等。
  • 读写层
    • Docker容器内的进程支队可读写层拥有权限,其他层对进程而言都是只读的(Read-Only)。另外,关于VOLUME以及容器的hosts、hostname、resolv.conf文件等都会挂载到这里。

mark

2.2 Commit 镜像

创建一个修改过的镜像

docker commit :从容器创建一个新的镜像。

语法

1
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a :提交的镜像作者;

  • -c :使用Dockerfile指令来创建镜像;

  • -m :提交时的说明文字;

  • -p :在commit时,将容器暂停。

实例

将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。

1
2
3
4
5
runoob@runoob:~$ docker commit -a "Zhuuu" -m "my apache" a404c6c174a2  mymysql:v1 
sha256:37af1236adef1544e8886be23010b66577647a40bc02c0885a6600b33ee28057
runoob@runoob:~$ docker images mymysql:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
mymysql v1 37af1236adef 15 seconds ago 329 MB

总结:

如果你想要保存当前镜像的状态,就可以通过commit进行提交

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信