带你了解docker是什么----基础原理篇(二)
·
前言
上一篇较为详细地介绍了docker的构架和其中有关镜像方面的核心原理。在这一篇就大致介绍一下,docker中有关容器部分以及docker之间的网络构建与存储的机制。
docker 容器
下图是常用命令之间的联系

在我看来,这个容器就类似我们的一个软件。镜像类似与为这个软件配置好了软件正常运行的环境配置。当我们使用commit将改变之后的容器环境再次保存为镜像。
为了使得这个软件在容器中运行的时候像在一个独立的电脑中,该电脑中只有这一个软件,环境也是为了这个软件运行而配置的。这就需要其中一些机制来处理。实际中,容器在docker host 上就是一个进程
容器的常用命令
- create :创建容器
- run : 运行容器
- pause :暂停容器
- unpause:取消暂停继续运行容器
- stop:发送 sigterm 停止容器,本质是向该进程发送信号。如果一个容器有多个进程,想快速停止应该使用kill命令
- kill:发送sigkill 快速停止容器
- start:启动容器
- restart:重启容器。其作用是依次执行 stop和start 命令
- attach : attach 到容器启动进程的终端
- exec:在容器中启动新进程,通常使用
-it参数 - logs:显示容器启动进程的控制台输出,用
-f持续打印 - rm:从磁盘中删除容器。其一次可以指定多个容器。如果希望批量删除所有已经退出的容器,可以执行该命令:
docker rm -v $(docker ps -ap -f status=exited)
容器运行
- 使用的是run命令
- 让容器长期运行:因为容器的生命周期依赖于启动时执行的命令,只要该命令不结束则容器就不会退出。因此就可以在run 命令后边执行一个长期运行的命令来保持容器的运行状态。如:
docker run -d Ubuntu /bin/bash -c "while true ;do sleep 1;done"其中的 -d 参数是以后台方式启动容器 - 在运行之后,docker 会返回一串字符,它就是容器的长ID
- 通过
docker ps可以查看容器(运行中的)。使用docker ps -a则会显示所有状态的容器。如下图
其中 第一列是容器的“短ID”,短ID是长ID的前12个字符。
指定容器的三种方式:
- 短ID
- 长ID
- 容器名称。可通过 --name 为容器命名。重命名容器可执行
docker rename
进入容器的方法
我们经常需要进到容器里去做一些工作,比如查看日志、调试、启动其他进程等。有两种方法进入容器:attach和exec
以下为使用两种方式的例子


attach 与exec主要区别如下
- attach 直接进入容器启动命令的终端,不会启动新的进程
- exec则是在容器中打开新的终端,并且可以启动新的进程。
- 如果想直接在终端中查看启动命令的输出,用attach;其他情况使用exec
实现容器的底层技术
cgroup和namespace 是最重要的两种技术。cgroup实现资源限额,namespace 实现资源隔离。
- cgroup全称Control Group。Linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额。
- namespace。在每个容器中,我们都可以看到文件系统、网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使host上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。
Linux实现这种方式的技术是namespace。namespace管理着host中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace实现了容器间资源的隔离。
Linux使用了6种namespace,分别对应6种资源:Mount、UTS、IPC、PID、Network和User。如下图
docker存储
- Docker为容器提供了两种存储资源:数据层和Data Volume。
- 数据层包括镜像层和容器层,由storage driver管理。
- Data Volume有两种类型:bind mount和docker managed volume。
- bind mount可实现容器与host之间、容器与容器之间共享数据。
- volume container是一种具有更好移植性的容器间数据共享方案,特别是data-packed volume container。
更多推荐
所有评论(0)