- 一、 Docker 的四大组成对象
- 二、搭建运行 Docker 环境
- 三、在 Windows 和 Mac 中使用 Docker
- 四、使用容器:镜像与容器
- 五、使用容器:从镜像仓库获得镜像
- 六、使用容器:运行和管理容器
- 七、为容器配置网络
- 八、管理和存储数据
- 九、操作镜像:保存和共享镜像
- 十、操作镜像:通过 Dockerfile 创建镜像
- 十一、常见 Dockerfile 使用技巧
- 十二、使用 Docker Hub 中的镜像
- 十三、组合操作:使用 Docker Compose 管理容器
- 十四、组合操作:常用的 Docker Compose 配置项
- 十五、组合操作:编写 Docker Compose 项目
- 十六、组合操作:应用于服务化开发
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
四、使用容器:镜像与容器
4.1 Docker 镜像
- 如果进行形象的表述,我们可以将
Docker
镜像理解为包含应用程序以及其相关依赖的一个基础文件系统,在Docker
容器启动的过程中,它以只读的方式被用于创建容器的运行环境。 - 从另一个角度看,在之前的小节里我们讲到了,
Docker
镜像其实是由基于UnionFS
文件系统的一组镜像层依次挂载而得,而每个镜像层包含的其实是对上一镜像层的修改,这些修改其实是发生在容器运行的过程中的。所以,我们也可以反过来理解,镜像是对容器运行环境进行持久化存储的结果…
4.2 查看镜像
- 镜像是由
Docker
进行管理的,所以它们的存储位置和存储方式等我们并不需要过多的关心,我们只需要利用Docker
所提供的一些接口或命令对它们进行控制即可。 - 如果要查看当前连接的
docker daemon
中存放和管理了哪些镜像,我们可以使用docker images
这个命令 (Linux
、macOS
还是Windows
上都是一致的 )
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
php 7-fpm f214b5c48a25 9 days ago 368MB
redis 3.2 2fef532eadb3 11 days ago 76MB
redis 4.0 e1a73233e3be 11 days ago 83.4MB
cogset/cron latest c01d5ac6fc8a 15 months ago 125MB...
在 docker images
命令的结果中,我们可以看到镜像的 ID
( IMAGE ID
)、构建时间 ( CREATED
)、占用空间 ( SIZE
) 等数据
这里需要注意一点,我们发现在结果中镜像 ID
的长度只有 12
个字符,这和我们之前说的 64
个字符貌似不一致。其实为了避免屏幕的空间都被这些看似“乱码”的镜像 ID
所挤占,所以 Docker
只显示了镜像 ID
的前 12
个字符,大部分情况下,它们已经能够让我们在单一主机中识别出不同的镜像了…
4.3 镜像命名
- 镜像层的
ID
既可以识别每个镜像层,也可以用来直接识别镜像 ( 因为根据最上层镜像能够找出所有依赖的下层镜像,所以最上层进行的镜像层 ID 就能表示镜像的ID
),但是使用这种无意义的超长哈希码显然是违背人性的,所以这里我们还要介绍镜像的命名,通过镜像名我们能够更容易的识别镜像… - 在
docker images
命令打印出的内容中,我们还能看到两个与镜像命名有关的数据:REPOSITORY
和TAG
,这两者其实就组成了docker
对镜像的命名规则
准确的来说,镜像的命名我们可以分成三个部分:username、repository 和 tag
username
: 主要用于识别上传镜像的不同用户,与 GitHub 中的用户空间类似。repository
:主要用于识别进行的内容,形成对镜像的表意描述。tag
:主要用户表示镜像的版本,方便区分进行内容的不同细节
对于 username
来说,在上面我们展示的 docker images
结果中,有的镜像有 username
这个部分,而有的镜像是没有的。没有 username
这个部分的镜像,表示镜像是由 Docker
官方所维护和提供的,所以就不单独标记用户了…
4.4 容器的生命周期
容器运行的状态流转图
图中展示了几种常见对 Docker
容器的操作命令,以及执行它们之后容器运行状态的变化。这里我们撇开命令,着重看看容器的几个核心状态,也就是图中色块表示的: Created
、 Running
、 Paused
、 Stopped
、 Deleted
在这几种状态中, Running
是最为关键的状态,在这种状态中的容器,就是真正正在运行的容器了
4.5 主进程
- 如果单纯去看容器的生命周期会有一些难理解的地方,而
Docker
中对容器生命周期的定义其实并不是独立存在的。 - 在
Docker
的设计中,容器的生命周期其实与容器中PID
为1
这个进程有着密切的关系。更确切的说,它们其实是共患难,同生死的兄弟。容器的启动,本质上可以理解为这个进程的启动,而容器的停止也就意味着这个进程的停止,反过来理解亦然。 - 当我们启动容器时,
Docker
其实会按照镜像中的定义,启动对应的程序,并将这个程序的主进程作为容器的主进程 ( 也就是PID
为1
的进程 )。而当我们控制容器停止时,Docker
会向主进程发送结束信号,通知程序退出。 - 而当容器中的主进程主动关闭时 ( 正常结束或出错停止 ),也会让容器随之停止。
- 通过之前提到的几个方面来看,
Docker
不仅是从设计上推崇轻量化的容器,也是许多机制上是以此为原则去实现的。所以,我们最佳的Docker
实践方法是遵循着它的逻辑,逐渐习惯这种容器即应用,应用即容器的虚拟化方式。虽然在Docker
中我们也能够实现在同一个容器中运行多个不同类型的程序,但这么做的话,Docker
就无法跟踪不同应用的生命周期,有可能造成应用的非正常关闭,进而影响系统、数据的稳定性…
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论