You are on page 1of 10

Docker

维基百科,自由的百科全书

Docker 是一个開放原始碼軟體,是一個开放平台,用于开发 Docker


应用、交付(shipping)应用、运行应用。 Docker允许用户
将基础设施(Infrastructure)中的应用单独分割出来,形成
更小的颗粒(容器),从而提高交付软件的速度。[1]
原作者 Solomon Hykes
Docker容器 与虚拟机类似,但原理上,容器是将操作系统层
虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、 開發者 Docker, Inc.
高效地利用服务器。 容器更多的用于表示 软件的一个标准 初始版本 2013年3月13日
化单元。由于容器的标准化,因此它可以无视基础设施 穩定版本 19.03.11(2020年6月1日)
(Infrastructure)的差异,部署到任何一个地方。另外,
預覽版本 19.03.6-rc2(2020年2月6日)
Docker也为容器提供更强的业界的隔离兼容。[2]
源代码库 github.com/docker/docker-ce (ht
Docker 利用Linux核心中的資源分離機制,例如cgroups,以 tps://github.com/docker/docker-c
及Linux核心命名空間(namespaces),來建立獨立的容器 e)
(containers)。這可以在單一Linux實體下運作,避免啟動
一個虛擬機器造成的額外負擔[3]。Linux核心對命名空間的支 编程语言 Go
援完全隔離了工作環境中應用程式的視野,包括行程樹、網
操作系统 Linux、Windows、macOS
路、用户ID與掛載檔案系統,而核心的cgroup提供资源隔
離,包括CPU、記憶體、block I/O與網路。從0.9版本起, 系統平台 x86-64、ARM、s390x、ppc64le
Dockers 在 使 用 抽 象 虛 擬 是 經 由 libvirt 的 LXC 與 systemd - 类型 作業系統層虛擬化
nspawn提供界面的基礎上,開始包括libcontainer函式庫做為 许可协议 可執行檔:免費增值软件即服务
以自己的方式開始直接使用由Linux核心提供的虛擬化的設 原始碼:Apache许可证 2.0
施,
网站 www.docker.com (https://www.d
依據行業分析公司「451研究」:「Dockers是有能力打包應 ocker.com/)
用程式及其虛擬容器,可以在任何Linux伺服器上執行的依
賴性工具,這有助於實現靈活性和便攜性,應用程式在任何地方都可以執行,無論是公用雲、私有
雲、單機等。」 [4]。
目录
基础架构
Docker引擎
Docker注册中心
对象
扩展架构
Docker Compose
Swarm Mode
原理

文件格式
Dockerfile
Compose文件
网络
bridge
host
overlay
macvlan
none
其他
数据管理

绑定挂载
tmpfs
命名管道
覆盖问题
日志
历史
已过时
Docker Swarm
Docker Machine
Docker Toolbox
参考文献
外部連結
参见

基础架构
专业名词Docker有两个意思:[5]
代指整个Docker项目。
代指Docker引擎。

Docker引擎

Docker引擎(Docker Engine)是一个服务端-客户端结构的应用,主要有这些部分:Docker守护进程、
Docker Engine AP (https://docs.docker.com/develop/sdk/)、Docker客户端。[6]

Docker守护进程(Docker daemons),也叫 dockerd ,是一个持久化的进程,用户管理容器。


守护进程会监听Docker Engine API (https://docs.docker.com/develop/sdk/) 的请求。[7]
Docker Engine API (https://docs.docker.com/develop/sdk/)是用于与Docker守护进程交互用的
的API。它是一个RESTful API,因此它不仅可以被Docker客户端调用,也可以被wget 和 curl
等命令调用。[8]
Docker客户端,也叫docker,是大部分用户与Docker交互的主要方式。用户通过客户端将命
令发送给守护进程。命令会遵循Docker Engine API (https://docs.docker.com/develop/sdk/)[9]

Docker注册中心

Docker注册中心(Docker registry)是用于存储Docker的镜像。Docker Hub 是一个公共的注册中心,任


何人都可以使用,默认配置下,Docker将会在这里寻找镜像。[6]

另外,用户可以自行构建私有注册中心。Docker Datacenter (DDC)的用户,可以直接使用 Docker


Trusted Registry (DTR)。[6]

对象

Docker的对象是指Images、Containers、Networks、Volumes、Plugins等等。[6]

容器(Containers)是镜像的可运行的实例。容器可通过API或CLI(命令行)进行操控。[6]
镜像(Images)是一个只读模板,用于指示创建容器。[6] 镜像分层(layers)构建的,而定义这些
层次的文件叫Dockerfile。[10]
服务(Services)允许使用者跨越不同的Docker守护进程(Docker daemons)的情况下增加容
器,并将这些容器分为管理者(managers)和工作者(workers),让他们为swarm共同工
作。[6]

扩展架构

Docker Compose

Compose可译为组合物。 [11]Compose 是用于定义和运行 多个容器Docker应用程序 的工具。通过


Compose,你可以使用YAML文件来配置应用程序需要的所有服务,然后通过使用一个命令,就可
以创建并启动所有服务。[12][13]Compose对应的命令为docker-compose。[14]
Swarm Mode

当说到 Docker Swarm 时,一般是指单独项目 Docker Swarm。而在Docker 1.12时,将swarm mode集


成到Docker 引擎中,可用Docker引擎API 和 CLI 命令直接使用。官方推荐用户使用集成的 swarm
mode [15]。

Swarm Mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置


服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 Swarm
集群具备与 Mesos、Kubernetes 竞争的实力。[16]

cluster(中文:集群),Docker将集群定义为:一群共同作业并提供高可用性的机器 [17] 。swarm(中


文:群[18]),是指一个集群的Docker引擎以swarm mode形式运行[19]。swarm mode是指Docker引擎内
嵌的集群管理和编排功能。当你初始化了一个swarm(cluster)或者将节点加入一个swarm时,其
Docker引擎就会以swarm mode的形式运行。[20]

原理

swarm中的Docker机器中分为 managers(管理者) 和 workers(员工),管理者用于处理集群的关系


和委派,员工则用于执行 swarm服务。[21] 当你创建swarm服务时,你可以为其增加各种额外的状态
(如:数量、网络、端口、存储资源等等)。Docker会去维持用户想要的状态。如:一个工作节点
如果挂了,那么Docker会去把这个节点的任务给另外一个节点。此处的任务(task)是指:被swarm
管理者管理的一个运行中的容器。[21]

swarm服务比单独容器好在,修改swarm服务的配置之后不用重启。同时,Docker以swarm mode形式
运行时,也可以选择直接启动单独的容器。另外,swarm mode下,你也可以通过 docker stack
deploy 使用 Compose file 部署应用栈。[22][21] swarm服务分为两种,一种是replicated services ,可
以指定节点任务的总数量;global services,则是每个节点都会运行一个指定任务。[23] swarm管理员
使用 ingress 负载均衡使服务可被外部接触。 swarm管理员会自动地给服务分配PublishedPort(或者
手动配置)。外部组件,如云负载均衡器能通过集群中任何节点上的PublishedPort去接入服务(不
管该服务是否启动)。另外 swarm mode有内部DNS组件,它会为每个服务分配一个DNS条目。
swarm管理员使用 internal load balancing 去分发请求时,就是依靠这个DNS组件。[24]

swarm mode的功能是由swarmkit(一个独立项目)提供的,它实现了Docker的编排层。swarm可以直接
被Docker使用。[21]

文件格式
Docker有两种文件格式,Dockerfile和Compose file。Dockerfile定义了单个容器的内容和启动时候的
行为。Compose file定义了一个多容器应用。[25]

Dockerfile

Docker 可以依照 Dockerfile 的内容,自动化地构建镜像。 Dockerfile 是包含着用户想要如何构建镜


像的所有命令的文本。[26]

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
关键词:

RUN。RUN会在当前镜像的顶层上添加新的一层(layer),并在该层上执行命令,执行结果将会被
提交。提交后的结果将会用于Dockerfile的下一步。[27]
ENTRYPOINT,入口点。ENTRYPOINT允许你配置容器,使之成为可执行程序。[28]即,
ENTRYPOINT允许你为容器增加一个入口点。ENTRYPOINT和CMD类似,均在容器启动时执行,
但是ENTRYPOINT为了提供稳定且不可被覆盖的操作。[29]通过在命令行中指定--entrypoint
命令的方式,可在运行时将Dockerfile文件中的ENTRYPOINT覆盖。
CMD,是command的缩写。CMD用于为已创建的镜像提供默认的操作,当不想要用默认操作时
候,可用docker run IMAGE[:TAG|@DIGEST] [COMMAND] 进行替换 。的当Dockerfile拥有
入口点时,CMD用于赋予入口点参数。[30]

Compose文件

Compose文件 是一个YAML文件,定义了服务(service)、网络、卷(volume)。

服务(service)定义 各容器的配置,定义内容将以命令行参数的方式 传给 docker run 命


令。
网络(network),类似地,将定义内容传给 docker network create 命令 。
卷(volume),类似地,将定义内容传给 docker volume create 命令。

docker run 命 令 中 有 一 些 选 项 , 和 Dockerfile 文 件 中 的 指 令 效 果 一 样 ( 如 : CMD, EXPOSE,


VOLUME, ENV),如果Dockerfile文件中使用这些指令,那么这些指令就会被视为默认参数,所以开
发者无需特意在 Compose文件中再指定一次。[31]

Compose文件 可使用 Shell变量(Variable),如:[32]

db:
image: "postgres:${POSTGRES_VERSION}"

Compose文件 可通过自身的ARGS变量,将参数传给Dockerfile的 ARGS 指令。[33]

网络
参考文档:Docker文档-网络概要 (https://docs.docker.com/network/)

bridge

在Docker里,网桥网络 使用的是 软件形式的网桥。使用相同的网桥的容器连接进入该网络,而非该


网络的容器刷故无法接入。Docker网桥驱动会自动地在Docker主机上安装规则,这些规则让不同桥
接网络之间不能直接通信。 [34] 桥接经常用于:在单独容器上运行应用时,可通过 网桥 进行通
信。[35] 网桥网络 适用于容器运行在相同地Docker守护进程的主机上。不同Docker守护进程主机上
的容器,它们之间的通信需要依靠操作系统层次的路由,或者你应该使用 overlay网络 进行代
替。[34]
bridge 是网桥驱动,是Docker默认的网络驱动(接口名为 docker0[36]),当你不为容器指定一
个网络时候,Docker将会使用该驱动。 [35] 可通过 daemon.json (https://docs.docker.co
m/config/daemon/#configure-the-docker-daemon) 文件修改相关配置。[37]

自定义网桥可通过 brctl 命令进行配置。[38][39]

host

主机模式

host 用于单独容器,该网络下容器只能和Docker主机进行直接连接。host 只适用于 Docker 17.06


或以上版本的swarm服务。

host网络和VirtualBox的 仅主机网络(Host-only Networking) 类似。[40]

overlay

overlay (中文:覆盖网络)网络驱动将会创建分布式网络,该网络可以覆盖若干个 Docker守护


进程主机。该网络是基于 主机特定网络(host-specific networks),允许 swarm服务 和 容器 进行安
全通信(当加密功能开启时)。在该网络下,Docker能够清晰地掌握 数据包的路由 以及 发送接收
容器。[41]

overlay 有两种网络类型网络:[41]

ingress 网络,可掌控 swarm服务 的网络流量 。该网络是 overlay 的默认网络。


docker_gwbridge 网络是 网桥网络。该网络会将 单独的Docker守护进程 连接至 swarm里的
另外一个守护进程。

在 overlay 网络下,单独的容器 和 swarm服务 的行为和配置概念 是不一样。[41]

该策略不需要 容器们 具有操作系统级别的路由,因为Docker负责路由。[35]

macvlan

Macvlan 网络允许你赋予容器 MAC地址 ,在该网络里,容器会被认为是物理设备。Docker守护进


程会路由

none

该策略下,容器不使用任何网络。none 常常用于连接自定义网络驱动的情况下。

其他

其他第三方插件。

数据管理
Docker默认下,所有文件将会存储在容器里的可写的容器层(container layer)。[42]

数据与容器为一体。随着容器消失,数据将消失;难以与其他程序(容器)共享。
由于容器的写入层是与宿主机器紧紧耦合。所以你难以移动数据到其他机器。
容器的写入层的是通过 存储驱动 (https://docs.docker.com/storage/storagedriver/)(storage
driver) 管理文件系统。存储驱动 (https://docs.docker.com/storage/storagedriver/) 会使用Linux
内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数
据卷,这额外的抽象层将会降低性能。

容器有两种永久化存储方式:卷(volumes)和 绑定挂载(bind mounts)。另外,Linux用户还可使


用 tmpfs 进行挂载;window用户还可以使用 命名管道(named pipe)。在容器中,不管是哪种永久
化存储,表现形式都是一样的。[42]

卷 ( volumes ) 是 宿 主 机 器 的 文 件 系 统 的 一 部 分 , 由 Docker 进 行 管 理 ( 在 Linux , 存 储


于/var/lib/docker/volumes/)。非Docker程序不应该去修改这些文件。Docker推荐使用 卷
进行持久化数据。 卷 可支持 卷驱动(volume drivers),该驱动允许用户将数据存储到 远程主机 或
云服务商(cloud provider)或 其他。[42]

没有名字的卷叫匿名卷(anonymous volume),有名字的卷叫命名卷(named volume)。匿名卷没


有明确的名字,当被初始化时,会被赋予一个随机名字。[42]

绑定挂载

绑定挂载(bind mounts)通过将宿主机器的路径挂载到容器里的这种方式,从而数据持续化,因此
绑定挂载可将数据存储在宿主机器的文件系统的任何地方。非Docker程序可修改这些文件。 绑定挂
载是Docker早期就存在的,相比起卷,绑定挂载十分简单明了。[42] 在开发Docker应用时,应使用命
名卷(named volume)代替绑定挂载,因为用户不能对绑定挂载进行 Docker CLI 命令操作。[42]

绑定挂载常用于:[43]

同步配置文件,如: 将 宿主主机的DNS配置文件(/etc/resolv.conf)同步至容器中
在开发程序时,将 源代码 或 Artifact 同步至容器中。[43] 这种用法与 Vagrant 类似。

tmpfs

tmpfs 挂载(tmpfs mounts),仅仅存储于内存中,并不操作 宿主机器的文件系统(不持久化于磁


盘)。它可用于存储一些 非持久化状态、敏感数据。 举例,swarm服务 通过tmpfs 将 secrets (http
s://docs.docker.com/engine/swarm/secrets/)(密码、密钥、证书等)存储到swarm服务。 [42]

命名管道

命名管道(named pipes),通过 npipe 挂载的形式,使 Docker主机 和 容器 之间能互相通讯。常见


用例是在容器内运行第三方工具,并使用命名管道连接到Docker Engine API。[42][44]
覆盖问题

当挂载 空的卷 至一个目录中,目录中的内容会被复制于卷中(不会覆盖)。如果挂载 非空的卷 或


绑定挂载 至一个目录中,那么该目录的内容将会被隐藏(obscured ),当卸载后内容将会恢复显
示。[45]

日志
在Linux和UNIX中,常见的 I/O流(英語:I/O streams) 分为三种:STDIN(输入 )、 STDOUT(正
常输出)、STDERR(错误输出)。[46]

默认配置下,Docker的日志(如:docker logs、docker service log)所记载的是命令行的


输出结果(STDOUT和STDERR)。而STDOUT 和 STDERR 对应的文件路径分别是 /dev/stderr
和/dev/stdout。[46] 另外,也可以在宿主主机上查看容器的日志,使用以下命令可以查看到容器
的日志位置。[47]

$ docker inspect --format='{{.LogPath}}' $INSTANCE_ID

历史
Docker命令在过去的发展中诞生了40种以上的命令,过多的命令导致混论以及难以使用tab自动补
充,因此在docker 1.13版本(2017.1.19)中,命令行被重构,根据逻辑对象进行划分。官方建议用
户使用新的语法进行操作。[48]

已过时

Docker Swarm

参考Swarm Mode章节。

Docker Machine

Docker Machine 是一个工具,它允许你在虚拟宿主机上安装 Docker引擎,并使用 docker-machine 命


令管理这些宿主机。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司网络、数据中心、
或像 AWS 或 Digital Ocean 这样的云提供商上创建 Docker 宿主机。[49][50]

Docker Machine 最后更新时间是在0.16.0 (2018-11-08)版本 [51] 。官方建议在1.12以及之后版本使用


Docker Desktop for Mac和Docker Desktop for Windows进行代替。[52]

Docker Toolbox

Docker Toolbox是用于帮 Windows系统和Mac系统 安装Docker环境。新版本建议使用Docker Desktop


for Mac和Docker Desktop for Windows进行安装。[53]最后更新版本是 19.03.1(2019-08-01)。[54]

参考文献
1. Get Docker. Docker Documentation. 2020-03-20 [2020-03-22] (英语).
2. What is a Container? | App Containerization | Docker. www.docker.com. [2020-03-22] (英语).
3. Docker Documentation. docker.readthedocs.org. 2014-01-04 [2014-08-20]. (原始内容存档于
2014-08-21).
4. Docker Documentation. docker.readthedocs.org. 2014-01-04 [2014-08-20]. (原始内容存档于
2014-08-21).
5. Glossary. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
6. Docker overview. Docker Documentation. 2020-02-14 [2020-02-16] (英语).
7. dockerd. Docker Documentation. 2020-02-14 [2020-02-16] (英语).
8. Develop with Docker Engine SDKs and API. Docker Documentation. 2020-02-14 [2020-02-16]
(英语).
9. dockerd. Docker Documentation. 2020-02-14 [2020-02-16] (英语).
10. About storage drivers. Docker Documentation. 2020-02-14 [2020-02-16] (英语).
11. What is the noun for compose?. WordHippo. [2020-02-16] (英语).
12. Docker Compose | 菜鸟教程. www.runoob.com. [2020-02-16].
13. Overview of Docker Compose. Docker Documentation. 2020-02-14 [2020-02-16] (英语).
14. Compose command-line reference. Docker Documentation. 2020-02-14 [2020-02-16] (英语).
15. Docker Swarm overview. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
16. Swarm mode · Docker —— 从入门到实践. yeasy.gitbooks.io. [2020-03-05].
17. Glossary. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
18. swarm漢語(繁體)翻譯:劍橋詞典. dictionary.cambridge.org. [2020-02-24] (中文(繁體)).
19. Glossary. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
20. Glossary. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
21. Swarm mode key concepts. Docker Documentation. 2020-02-20 [2020-02-24] (英语).
22. Deploy a stack to a swarm. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
23. services-and-tasks. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
24. load-balancing. Docker Documentation. 2020-02-25 [2020-02-29] (英语).
25. Reference documentation. Docker Documentation. 2020-02-14 [2020-02-17] (英语).
26. dockerfile-reference.
27. run. [2020-02-18].
28. entrypoint. [2020-02-27].
29. entrypoint-default-command-to-execute-at-runtime.
30. cmd-default-command-or-options.
31. service-configuration-reference. [2020-02-19].
32. variable-substitution.
33. args. Docker Documentation. 2020-04-09 [2020-04-13] (英语).
34. Use bridge networks. Docker Documentation. 2020-03-19 [2020-03-20] (英语).
35. network-drivers 章节的. Docker Documentation. 2020-03-19 [2020-03-20] (英语).
36. 配置 docker0 网桥 · Docker —— 从入门到实践. yeasy.gitbooks.io. [2020-03-20].
37. Use bridge networks - configure-the-default-bridge-network. Docker Documentation. 2020-03-
19 [2020-03-20] (英语).
38. BridgeNetworkConnections - Debian Wiki. wiki.debian.org. [2020-03-20].
39. 自定义网桥 · Docker —— 从入门到实践. yeasy.gitbooks.io. [2020-03-20].
40. vbox_host-only_setup. condor.depaul.edu. [2020-03-09].
41. Use overlay networks. Docker Documentation. 2020-03-19 [2020-03-20] (英语).
42. Manage data in Docker. Docker Documentation. 2020-03-20 [2020-03-21] (英语).
43. good-use-cases-for-bind-mounts. Docker Documentation. 2020-03-20 [2020-03-21] (英语).
44. Docker中的数据管理 - 掘金. juejin.im. [2020-03-21].
45. using-bind-mounts-or-volumes. Docker Documentation. 2020-03-20 [2020-03-21] (英语).
46. View logs for a container or service. Docker Documentation. 2020-04-17 [2020-04-17] (英语).
47. get-an-instances-log-path. Docker Documentation. 2020-04-17 [2020-04-18] (英语).
48. Introducing Docker 1.13. Docker Blog. 2017-01-19 [2020-03-05] (美国英语).
49. Docker Machine Overview. Docker Documentation. 2020-02-25 [2020-03-02] (英语).
50. Docker(五):Docker 三剑客之 Docker Machine. 知乎专栏. [2020-03-02] (中文).
51. Docker Machine release notes. Docker Documentation. 2020-02-25 [2020-03-02] (英语).
52. Docker Machine Overview. Docker Documentation. 2020-02-25 [2020-03-02] (英语).
53. Docker Toolbox overview. Docker Documentation. 2020-02-25 [2020-03-02] (英语).
54. docker/toolbox. GitHub. [2020-03-02] (英语).

外部連結
官方网站 (https://www.docker.com)
Source code repository (https://github.com/docker/docker-ce)
Multi-tenancy using Docker (http://www.slideshare.net/AaterSuleman/docker-at-flux7/)
Docker 101 Tutorial (https://www.youtube.com/watch?v=VeiUjkiqo9E#t=60)
libcontainer git repo (https://github.com/docker/libcontainer/)
如何在Linux下安装Docker (https://www.ytyzx.org/index.php/%E5%A6%82%E4%BD%95%E
5%9C%A8Linux%E4%B8%8B%E5%AE%89%E8%A3%85Docker)
Windows 容器 (https://docs.microsoft.com/zh-tw/virtualization/windowscontainers/about/) - 在
Windows 10 部署 Docker

参见
作業系統層虛擬化
cgroups
LXC
Dotcloud

取自“https://zh.wikipedia.org/w/index.php?title=Docker&oldid=59920296”

本页面最后修订于2020年6月2日 (星期二) 02:52。

本站的全部文字在知识共享 署名-相同方式共享 3.0协议之条款下提供,附加条款亦可能应用。(请参阅使用条款)


Wikipedia®和维基百科标志是维基媒体基金会的注册商标;维基™是维基媒体基金会的商标。
维基媒体基金会是按美国国內稅收法501(c)(3)登记的非营利慈善机构。

You might also like