Docker是一个开放源代码的容器构建、分发与运行的工具链与平台,用于开发、交付和运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。
Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、更能高效地利用服务器。 容器更多的用于表示软件的一个标准化单元。由于容器的标准化,因此它可以无视基础设施(Infrastructure)的差异,部署到任何一个地方。另外,Docker也为容器提供更强的企业级隔离与兼容性。
Docker 利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心(namespaces),來建立獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機器造成的額外負擔。Linux核心對命名空間的支援完全隔離了工作環境中應用程式的視野,包括进程树、網路、用户ID與掛載檔案系統,而核心的cgroup提供资源隔離,包括CPU、記憶體、block I/O與網路。从 0.9 版本开始,Docker 逐步减少对 LXC 的依赖,转而引入 libcontainer 程序库,直接调用 Linux 核心提供的命名空间(namespaces)与控制组(cgroups)等机制来创建和管理容器,从而摆脱对传统容器管理工具的依赖,并实现对容器运行时的完全自主控制。
- 代指整个Docker项目。
- 代指Docker引擎。
Docker引擎
Docker引擎(Docker Engine)是一个服务端-客户端结构的应用,主要有这些部分:Docker守护进程、[https://docs.docker.com/develop/sdk/ Docker Engine API]、Docker客户端。
*Docker守护进程(Docker daemons),也叫 dockerd ,是一个持久化的进程,用户管理容器。守护进程会监听[https://docs.docker.com/develop/sdk/ Docker Engine API] 的请求。
*[https://docs.docker.com/develop/sdk/ Docker Engine API]是用于与Docker守护进程交互用的的API。它是一个RESTful API,因此它不仅可以被Docker客户端调用,也可以被wget 和 curl等命令调用。
*Docker客户端,也叫docker,是大部分用户与Docker交互的主要方式。用户通过客户端将命令发送给守护进程。命令会遵循[https://docs.docker.com/develop/sdk/ Docker Engine API] ,同年9月恢复访问,此后多次断续屏蔽。
对象
Docker的对象是指Images、Containers、Networks、Volumes、Plugins等等。
*服务(Services)允许使用者跨越不同的Docker守护进程(Docker daemons)的情况下增加容器,并将这些容器分为管理者(managers)和工作者(workers),让他们为swarm共同工作。Compose 是用于定义和运行 多个容器Docker应用程序 的工具。通过Compose,你可以使用YAML文件来配置应用程序需要的所有服务,然后通过使用一个命令,就可以创建并启动所有服务。Compose对应的命令为docker compose。
Docker Desktop
Docker Desktop 是适用于Windows、Linux、MacOS操作系统的一键式安装程序,提供了图形用户界面,便于管理Docker的容器、镜像以及应用等对象。Docker Desktop包含了:Docker Engine、CLI、构建以及扩展等组件。
Swarm Mode
当说到 Docker Swarm 时,一般是指单独项目 Docker Swarm。而在Docker 1.12时,将swarm mode集成到Docker 引擎中,可用Docker引擎API 和 CLI 命令直接使用。官方推荐用户使用集成的 swarm mode 。
Swarm Mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。Swarm 在设计上曾试图与 Kubernetes 竞争,但目前已逐渐边缘化,Kubernetes 成为事实上的容器编排标准。
cluster(中文:集群),Docker将集群定义为:一群共同作业并提供高可用性的机器),是指一个集群的Docker引擎以swarm mode形式运行当你创建swarm服务时,你可以为其增加各种额外的状态(如:数量、网络、端口、存储资源等等)。Docker会去维持用户想要的状态。如:一个工作节点如果挂了,那么Docker会去把这个节点的任务给另外一个节点。此处的任务(task)是指:被swarm管理者管理的一个运行中的容器。swarm服务分为两种,一种是replicated services ,可以指定节点任务的总数量;global services,则是每个节点都会运行一个指定任务。swarm内置 ingress 负载均衡机制使服务。 swarm管理节点会自动地给服务分配PublishedPort(或者手动配置)。外部组件,如云负载均衡器能通过集群中任何节点上的PublishedPort去接入服务(不管该服务是否启动)。另外 swarm mode有内部DNS组件,它会为每个服务分配一个DNS条目。swarm管理节点使用 internal load balancing 去分发请求时,就是依靠这个DNS组件。
swarm mode的功能是由swarmkit(一个独立项目)提供的,它实现了Docker的编排层。swarm可以直接被Docker使用。
Dockerfile
Docker 可以依照 Dockerfile 的内容,自动化地构建镜像。 Dockerfile 是包含着用户想要如何构建镜像的所有命令的文本。
FROM ubuntu:24.04
COPY . /app
RUN make /app
CMD python /app/app.py
关键词:
- RUN。RUN会在当前镜像的顶层上添加新的一层(layer),并在该层上执行命令,执行结果将会被提交。提交后的结果将会用于Dockerfile的下一步。
- ENTRYPOINT,入口点。ENTRYPOINT允许你配置容器,使之成为可执行程序。即,ENTRYPOINT允许你为容器增加一个入口点。ENTRYPOINT和CMD类似,均在容器启动时执行,但是ENTRYPOINT为了提供稳定且不可被覆盖的操作。通过在命令行中指定--entrypoint 命令的方式,可在运行时将Dockerfile文件中的ENTRYPOINT覆盖。
- CMD,是command的缩写。CMD用于为已创建的镜像提供默认的操作,当不想要用默认操作时候,可用docker run IMAGE[:TAG|@DIGEST] [COMMAND] 进行替换 。但当Dockerfile拥有入口点时,CMD用于赋予入口点参数。
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文件中再指定一次。
Compose文件 可使用 Shell变量(Variable),如:
db:
image: "postgres:${POSTGRES_VERSION}"
Compose文件 可通过自身的ARGS变量,将参数传给Dockerfile的 ARGS 指令。
网络
参考文档:[https://docs.docker.com/network/ Docker文档-网络概要]
bridge
在Docker裡,网桥网络 使用的是 软件形式的网桥。使用相同的网桥的容器连接进入该网络,而非该网络的容器则无法接入。Docker网桥驱动会自动地在Docker主机上安装规则,这些规则让不同桥接网络之间不能直接通信。桥接经常用于:在单独容器上运行应用时,可通过 网桥 进行通信。网桥网络 适用于容器运行在相同的Docker守护进程的主机上。不同Docker守护进程主机上的容器,它们之间的通信需要依靠操作系统层次的路由,或者你应该使用 overlay网络 进行代替。),当你不为容器指定一个网络时候,Docker将会使用该驱动。
自定义网桥可通过 brctl 命令进行配置。
host
主机模式
host 用于单独容器,该网络下容器只能和Docker主机进行直接连接。host 只适用于 Docker 17.06或以上版本的swarm服务。
host网络和VirtualBox的 仅主机网络(Host-only Networking) 类似。
overlay
overlay (中文:覆盖网络)网络驱动将会创建分布式网络,该网络可以覆盖若干个 Docker守护进程主机。该网络是基于 主机特定网络(host-specific networks),允许 swarm服务 和 容器 进行安全通信(当加密功能开启时)。在该网络下,Docker 通过 VXLAN 等机制实现跨主机容器网络通信
overlay 有两种网络类型网络:
- 数据与容器为一体。随着容器消失,数据将消失;难以与其他程序(容器)共享。可以采用挂载文件的方式解决。
- 由于容器的写入层是与宿主机器紧紧耦合。所以你难以移动数据到其他机器。
- 容器的写入层的是通过 [https://docs.docker.com/storage/storagedriver/ 存储驱动](storage driver) 管理文件系统。[https://docs.docker.com/storage/storagedriver/ 存储驱动] 会使用Linux内核的 链合文件系统(union filesystem)进行挂载。相比起直接操作于宿主机器文件系统的 数据卷,这额外的抽象层将会降低性能。
容器有两种永久化存储方式:卷(volumes)和 绑定挂载(bind mounts)。另外,Linux用户还可使用 tmpfs 进行挂载;Windows 用户还可以使用 命名管道(named pipe)。在容器中,不管是哪种永久化存储,表现形式都是一样的。
- 同步配置文件,如: 将 宿主主机的DNS配置文件(/etc/resolv.conf)同步至容器中
- 在开发程序时,将 源代码 或 Artifact 同步至容器中。
覆盖问题
当挂载 空的卷 至一个目录中,目录中的内容会被复制于卷中(不会覆盖)。如果挂载 非空的卷 或 绑定挂载 至一个目录中,那么该目录的内容将会被隐藏(obscured ),当卸载后内容将会恢复显示。
日志
在UNIX和类Unix系统中,常见的 I/O流() 分为三种:STDIN(输入 )、 STDOUT(正常输出)、STDERR(错误输出)。
默认配置下,Docker的日志(如:docker logs、docker service log)所记载的是命令行的输出结果(STDOUT和STDERR)。而STDOUT 和 STDERR 对应的文件路径分别是 /dev/stderr和/dev/stdout。
$ docker inspect --format=* $INSTANCE_ID
Kubernetes in docker
kind(全称:Kubernetes IN Docker)是部署本地Kubernetes集群的工具,而集群的节点是由Docker生成的。
操作细节
在安装完kind之后,通过kind create cluster命令生成集群。
已过时
Docker Swarm
参考Swarm Mode章节。
Docker Machine
Docker Machine 是一个工具,它允许你在虚拟宿主机上安装 Docker引擎,并使用 docker-machine 命令管理这些宿主机。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司网络、数据中心、或像 AWS 或 Digital Ocean 这样的云提供商上创建 Docker 宿主机。
Docker Machine 最后更新时间是在0.16.0 (2018-11-08)版本。官方建议在1.12以及之后版本使用Docker Desktop for Mac和Docker Desktop for Windows进行代替。最后更新版本是 19.03.1(2019-08-01)。
安全性争议
2021年,安全公司Palo Alto Networks研究人員Aviv Sasson在Docker Hub上發現了內含挖礦軟體的惡意容器映像存檔,分別來自10個不同帳號,總下載次數超過2000萬次。
参考文献
外部連結
*
- [https://github.com/docker/docker-ce Source code repository]
- [http://www.slideshare.net/AaterSuleman/docker-at-flux7/ Multi-tenancy using Docker]
- [http://www.youtube.com/watch?v=VeiUjkiqo9E#t=60 Docker 101 Tutorial]
- [https://github.com/docker/libcontainer/ libcontainer git repo]
- [https://www.ytyzx.org/index.php/%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E4%B8%8B%E5%AE%89%E8%A3%85Docker 如何在Linux下安装Docker]
- [https://docs.microsoft.com/zh-tw/virtualization/windowscontainers/about/ Windows 容器] - 在 Windows 10 部署 Docker
参见
- 作業系統層虛擬化
- cgroups
- LXC
- Dotcloud
评论 (0)