镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
现在让我们以定制一个 Web 服务器为例子,来了解镜像是如何构建的。
[root@docker ~]# docker run --name webserver -d -p 80:80 nginx:1.17.1
# 用 nginx:1.17.1 镜像启动一个容器,命名为 webserver,并且映射了 80 端口。因为是在linux虚拟机上安装的 Docker,则需要在宿主机的浏览器访问虚拟机地址这样我们可以用浏览器去访问这个 nginx 服务器。
直接用浏览器访问的话,我们会看到默认的 Nginx 欢迎页面。
现在,假设我们不想用这个欢迎页面,希望改成欢迎 Docker 的文字,可以使用 docker exec 命令进入容器,修改其内容。
[root@docker ~]# docker exec -it webserver /bin/bash
root@65eb3987e8ca:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@65eb3987e8ca:/# exit
exit
# 以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。
# 然后,用 <h1>Hello, Docker!</h1> 覆盖了 /usr/share/nginx/html/index.html 的内容。
现在再刷新浏览器的话,会发现内容被改变了。
因为修改了容器的文件,也就是改动了容器的存储层。可以通过 docker diff 命令看到具体的改动。</