Docker
Docker是一个開放原始碼的開放平臺軟體,用于开发应用、交付(shipping)应用和运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。[2] Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、更能高效地利用服务器。 容器更多的用于表示软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的业界的隔离兼容。[3] Docker 利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心命名空間(namespaces),來建立獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機器造成的額外負擔[4]。Linux核心對命名空間的支援完全隔離了工作環境中應用程式的視野,包括行程樹、網路、用户ID與掛載檔案系統,而核心的cgroup提供资源隔離,包括CPU、記憶體、block I/O與網路。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供界面的基礎上,開始包括libcontainer函式庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施。[4] 基础架构专业名词Docker有两个意思:[5]
Docker引擎Docker引擎(Docker Engine)是一个服务端-客户端结构的应用,主要有这些部分:Docker守护进程、Docker Engine API(页面存档备份,存于互联网档案馆)、Docker客户端。[6]
Docker注册中心Docker注册中心(Docker registry)是用于存储Docker的镜像。Docker Hub 是一个公共的注册中心,任何人都可以使用,默认配置下,Docker将会在这里寻找镜像。[6] 另外,用户可以自行构建私有注册中心。Docker Datacenter(DDC)的用户,可以直接使用 Docker Trusted Registry(DTR)。[6] 2023年5月,在中国大陆地区被防火长城阻断屏蔽[9],同年9月恢复访问[10]。 对象Docker的对象是指Images、Containers、Networks、Volumes、Plugins等等。[6]
扩展架构Docker ComposeCompose可译为组合物。[12]Compose 是用于定义和运行 多个容器Docker应用程序 的工具。通过Compose,你可以使用YAML文件来配置应用程序需要的所有服务,然后通过使用一个命令,就可以创建并启动所有服务。[13][14]Compose对应的命令为 Docker DesktopDocker Desktop 是适用于Windows、Linux、MacOS操作系统的一键式安装程序,提供了图形用户界面,便于管理Docker的容器、镜像以及应用等对象。Docker Desktop包含了:Docker Engine、CLI、构建以及扩展等组件。[16] Swarm Mode当说到 Docker Swarm 时,一般是指单独项目 Docker Swarm。而在Docker 1.12时,将swarm mode集成到Docker 引擎中,可用Docker引擎API 和 CLI 命令直接使用。官方推荐用户使用集成的 swarm mode [17]。 Swarm Mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 cluster(中文:集群),Docker将集群定义为:一群共同作业并提供高可用性的机器[5]。swarm(中文:群[19]),是指一个集群的Docker引擎以swarm mode形式运行[5]。swarm mode是指Docker引擎内嵌的集群管理和编排功能。当你初始化了一个swarm(cluster)或者将节点加入一个swarm时,其Docker引擎就会以swarm mode的形式运行。[5] 原理swarm中的Docker机器中分为 managers(管理者) 和 workers(员工),管理者用于处理集群的关系和委派,员工则用于执行 swarm服务。[20]当你创建swarm服务时,你可以为其增加各种额外的状态(如:数量、网络、端口、存储资源等等)。Docker会去维持用户想要的状态。如:一个工作节点如果挂了,那么Docker会去把这个节点的任务给另外一个节点。此处的任务(task)是指:被swarm管理者管理的一个运行中的容器。[20] swarm服务比单独容器好在,修改swarm服务的配置之后不用重启。同时,Docker以swarm mode形式运行时,也可以选择直接启动单独的容器。另外,swarm mode下,你也可以通过 swarm mode的功能是由swarmkit(一个独立项目)提供的,它实现了Docker的编排层。swarm可以直接被Docker使用。[20] 文件格式Docker有两种文件格式,Dockerfile和Compose file。Dockerfile定义了单个容器的内容和启动时候的行为。Compose file定义了一个多容器应用。[24] DockerfileDocker 可以依照 Dockerfile 的内容,自动化地构建镜像。 Dockerfile 是包含着用户想要如何构建镜像的所有命令的文本。[25] FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
关键词:
Compose文件Compose文件 是一个YAML文件,定义了服务(service)、网络、卷(volume)。
Compose文件 可使用 Shell变量(Variable),如:[31] db:
image: "postgres:${POSTGRES_VERSION}"
Compose文件 可通过自身的 网络参考文档:Docker文档-网络概要(页面存档备份,存于互联网档案馆) bridge在Docker裡,网桥网络 使用的是 软件形式的网桥。使用相同的网桥的容器连接进入该网络,而非该网络的容器刷故无法接入。Docker网桥驱动会自动地在Docker主机上安装规则,这些规则让不同桥接网络之间不能直接通信。[33]桥接经常用于:在单独容器上运行应用时,可通过 网桥 进行通信。[34]网桥网络 适用于容器运行在相同地Docker守护进程的主机上。不同Docker守护进程主机上的容器,它们之间的通信需要依靠操作系统层次的路由,或者你应该使用 overlay网络 进行代替。[33]
自定义网桥可通过 host主机模式
host网络和VirtualBox的 仅主机网络(Host-only Networking) 类似。[39] overlay
在 该策略不需要 容器们 具有操作系统级别的路由,因为Docker负责路由。[34] macvlan
none该策略下,容器不使用任何网络。 其他截止2023年5月18日,Docker官方仓库域名 https://hub.docker.com/ (页面存档备份,存于互联网档案馆) 在中国大陆被屏蔽,方式为DNS污染。随后短暂解封,2024年6月6日再次被封。 数据管理Docker默认下,所有文件将会存储在容器里的可写的容器层(container layer)。[41]
容器有两种永久化存储方式:卷(volumes)和 绑定挂载(bind mounts)。另外,Linux用户还可使用 tmpfs 进行挂载;Window用户还可以使用 命名管道(named pipe)。在容器中,不管是哪种永久化存储,表现形式都是一样的。[41] 卷卷(volumes)是宿主机器的文件系统的一部分,由Docker进行管理( 在Linux,存储于 没有名字的卷叫匿名卷(anonymous volume),有名字的卷叫命名卷(named volume)。匿名卷没有明确的名字,当被初始化时,会被赋予一个随机名字。[41] 绑定挂载绑定挂载(bind mounts)通过将宿主机器的路径挂载到容器里的这种方式,从而数据持续化,因此绑定挂载可将数据存储在宿主机器的文件系统的任何地方。非Docker程序可修改这些文件。 绑定挂载是Docker早期就存在的,相比起卷,绑定挂载十分简单明了。[41]在开发Docker应用时,应使用命名卷(named volume)代替绑定挂载,因为用户不能对绑定挂载进行 Docker CLI 命令操作。[41] 绑定挂载常用于:[42]
tmpfs
命名管道命名管道(named pipes),通过 覆盖问题当挂载 空的卷 至一个目录中,目录中的内容会被复制于卷中(不会覆盖)。如果挂载 非空的卷 或 绑定挂载 至一个目录中,那么该目录的内容将会被隐藏(obscured ),当卸载后内容将会恢复显示。[44] 日志在UNIX和类Unix系统中,常见的 I/O流(英語:I/O streams) 分为三种:
默认配置下,Docker的日志(如: $ docker inspect --format='{{.LogPath}}' $INSTANCE_ID
Kubernetes in dockerkind(全称:Kubernetes IN Docker)是部署本地Kubernetes集群的工具,而集群的节点是由Docker生成的。[47] 操作细节
在安装完kind之后,通过 $ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99c96c1f21ab kindest/node:v1.17.0 "/usr/local/bin/entr…" 4 minutes ago Up 4 minutes 127.0.0.1:32769->6443/tcp kind-control-plane
历史Docker命令在过去的发展中诞生了40种以上的命令,过多的命令导致混乱以及难以使用tab自动补充,因此在docker 1.13版本(2017.1.19)中,命令行被重构,根据逻辑对象进行划分。官方建议用户使用新的语法进行操作。[48] 已过时Docker Swarm参考Swarm Mode章节。 Docker MachineDocker 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进行代替。[49] Docker ToolboxDocker Toolbox是用于帮 Windows系统和Mac系统 安装Docker环境。新版本建议使用Docker Desktop for Mac和Docker Desktop for Windows进行安装。[52]最后更新版本是 19.03.1(2019-08-01)。[53] 安全性爭議2021年,安全公司Palo Alto Networks研究人員Aviv Sasson,在Docker Hub上發現的惡意容器映像存檔,分別來自10個不同帳號,總下載次數超過2000萬次,其中內含的挖礦軟體。[54] 参考文献
外部連結
参见 |