共计 3239 个字符,预计需要花费 9 分钟才能阅读完成。
Docker 的体系结构
docker 使用 C / S 架构,docker daemon 作为 server 端接受 client 的请求,并处理(创建、运行、分发容器),他们可以运行在一个机器上,也通过 sockerts 或者 RESTfulAPI 通信。
Dockerdaemon 一般在宿主主机后台运行,用户使用 client 而直接跟 daemon 交互。Docker client 以系统做 bin 命令的形式存在,用户用 docker 命令来跟 docker daemon 交互。
1、Docker 的内部组件
docker 有三个内部组件
docker images
docker registries
docker containers
Docker images
dockerimages 就是一个只读的模板。比如:一个 image 可以包含一个 Ubuntu 的操作系统,里面安装了 apache 或者你需要的应用程序。images 可以用来创建 docker containers,docker 提供了一个很简单的机制来创建 images 或者更新现有的 images,你甚至可以直接从其他人那里下载一个已经做好的 images
Docker registries
Docker registries 也叫 docker 仓库,它有公有仓库和私有仓库 2 种形式,他们都可以用来让你上传和下载 images。公有的仓库也叫 DockerHub。它提供了一个巨大的 image 库可以让你下载,你也可以在自己的局域网内建一个自己的私有仓库。
Docker containers
Docker containers 也叫 docker 容器,容器是从 image 镜像创建的。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、安全的平台。
2、dockerimage 的工作原理
每个 docker 都有很多层次构成,docker 使用 unionfile systems 将这些不同的层结合到一个 image 中去。
AUFS(AnotherUnionFS)是一种 UnionFS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下 (uniteseveral directories into a single virtual filesystem) 的文件系统, 更进一步的理解,AUFS 支持为每一个成员目录 (类似 GitBranch) 设定 readonly、readwrite 和 whiteout-able 权限, 同时 AUFS 里有一个类似分层的概念, 对 readonly 权限的 branch 可以逻辑上进行修改(增量地, 不影响 readonly 部分的)。通常 UnionFS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下, 另一个更常用的就是将一个 readonly 的 branch 和一个 writeable 的 branch 联合在一起,LiveCD 正是基于此方法可以允许在 OSimage 不变的基础上允许用户在其上进行一些写操作。Docker 在 AUFS 上构建的 containerimage 也正是如此。
3、docker 仓库
docker 仓库用来保存我们的 images,当我们创建了自己的 image 之后我们就可以使用 push 命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个 image 时候,只需要从仓库上 pull 下来就可以了。
4、docker 容器
当我们运行 dockerrun -i -t ubuntu /bin/bash 命令时,docker 在后台运行的操作如下:
如果本地有 ubuntu 这个 image 就从它创建容器,否则从公有仓库下载
从 image 创建容器
分配一个文件系统,并在只读的 image 层外面挂载一层可读写的层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行你指定的程序,在这里启动一个 /bin/bash 进程
-i- t 指定标准输入和输出
5、Docker 底层技术
docker 底层的 2 个核心技术分别是 Namespaces 和 Controlgroups
以下内容摘自 InfoQDocker,自 1.20 版本开始 docker 已经抛开 lxc,不过下面的内容对于理解 docker 还是有很大帮助。
1)pidnamespace
不同用户的进程就是通过 pidnamespace 隔离开的,且不同 namespace 中可以有相同 pid。所有的 LXC 进程在 docker 中的父进程为 docker 进程,每个 lxc 进程具有不同的 namespace。同时由于允许嵌套,因此可以很方便的实现 Dockerin Docker。
2)net namespace
有了 pidnamespace, 每个 namespace 中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 netnamespace 实现的,每个 netnamespace 有独立的 networkdevices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 dockerbridge: docker0 连接在一起。
3)ipc namespace
container 中进程交互还是采用 linux 常见的进程间交互方法(interprocesscommunication – IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同的是,container 的进程间交互实际上还是 host 上具有相同 pidnamespace 中的进程间交互,因此需要在 IPC 资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32 位 ID。
4)mnt namespace
类似 chroot,将一个进程放到一个特定的目录执行。mntnamespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mountpoint。
5)uts namespace
UTS(“UNIXTime-sharing System”) namespace 允许每个 container 拥有独立的 hostname 和 domainname, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。
6)user namespace
每个 container 可以有不同的 user 和 groupid, 也就是说可以在 container 内部用 container 内部的用户执行程序而非 Host 上的用户。
Controlgroups 主要用来隔离各个容器和宿主主机的资源利用。
CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm
Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm
Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Docker 和一个正常的虚拟机有何区别? http://www.linuxidc.com/Linux/2013-12/93740.htm
在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm
Docker 将改变所有事情 http://www.linuxidc.com/Linux/2013-12/93998.htm
Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里