Docker 上的原始交易:架构、概念、基础知识、行业观点,一直到 Docker Swarm 和 Docker 网络等忍者主题。
什么是 Docker?
Docker 是一种技术,允许您将代码及其依赖项合并并存储到一个整洁的小包中 - 映像。然后,此映像可用于生成应用程序的实例 - 容器。与虚拟机 (VM) 不同,Docker 容器不包含硬件管理程序。
此方法解决了几个问题:
Docker 容器的启动速度比 VM 快得多
没有特定于平台、IDE 或编程语言的限制。
图像尺寸小,更易于存储和共享。
没有与 dependencies/versions/setup 相关的兼容性问题。
快速轻松地部署应用程序。
应用程序及其资源是隔离的,从而实现了更好的模块化。
Docker 架构和概念
为了允许应用程序自包含,Docker 方法将资源的抽象从硬件级别上移至操作系统级别。
为了进一步了解 Docker,让我们看看它的架构。它使用客户端-服务器模型,由以下组件组成:
Docker 守护程序:守护程序负责所有与容器相关的操作,并通过 CLI 或 REST API 接收命令。
Docker 客户端:Docker 客户端是用户与 Docker 交互的方式。Docker 客户端可以与守护程序或远程主机位于同一主机上。
图像:用于构建容器的只读模板。图像用于存储和交付应用程序。
器皿:容器是运行应用程序的封装环境。容器由 image 和 configuration 选项定义。
Docker 注册表:注册表是我们存储和下载(或“拉取”)映像的位置。

Docker 架构
资料来源: Docker
其他重要的 Docker 概念包括:
Dockerfile — Dockerfile 实质上是构建 Docker 映像的构建说明。与仅存储二进制映像相比,Dockerfile 的优势在于,自动构建将确保您拥有最新版本。本页收集有关使用 Dockerfile 的资源,包括最佳实践、Dockerfile 命令、如何使用 Dockerfile 创建 Docker 映像等。
Docker Hub — Docker Hub 是一个基于云的存储库,Docker 用户和合作伙伴可以在其中创建、测试、存储和分发容器映像。通过 Docker Hub,用户可以访问公共开源镜像存储库,并使用空间创建自己的私有存储库、自动构建功能和工作组。本页收集有关 Docker Hub 以及如何将容器映像推送到 Docker Hub 和从 Docker Hub 推送和拉取容器映像的资源。
可写层和卷 — 可以将数据存储在容器的可写层中。Docker 提供了三种不同的方法将数据从 Docker 主机挂载到容器中:卷、绑定挂载或 tmpfs 卷。
Docker 镜像
Docker 镜像是一个快照或模板,可以从中启动新容器。它是文件系统加上给定操作系统的库的表示。可以通过执行 Dockerfile 中包含的一组命令来创建新映像。例如,此 Dockerfile 将采用基本 Ubuntu 16.06 映像并安装 mongoDB,从而生成新映像:
FROM ubuntu:16.04
RUN apt-get install -y mongodb-10gen
从物理角度来看,图像由一组只读图层组成。图像图层的功能如下:
每个映像层都是映像的 Dockerfile 中一个命令的结果,映像是包含一系列层的压缩 (tar) 文件。
每个额外的映像层仅包含与前一层的一组差异(尝试为给定映像运行 docker history 以列出其所有层以及创建它们的原因)。
从镜像运行容器
映像和容器不同 — 容器是映像的运行实例。单个映像可用于启动任意数量的容器。镜像是只读的,而容器可以修改。此外,除非将更改提交到新映像中,否则删除容器后,对容器的更改将丢失。
按照以下步骤将镜像作为容器运行:
首先,请注意,您可以运行指定映像名称或映像 ID (参考) 的容器。
运行命令以查看您在本地提取的映像,或者,浏览要从中运行容器的映像的 Docker Hub 存储库。docker images
知道映像的名称或 ID 后,可以使用该命令启动 Docker 容器。例如,要下载 Ubuntu 16.04 映像(如果本地尚不可用),请启动容器并运行 bash shell:docker run
docker run -it ubuntu:16.04 /bin/bash
其他常见的 Docker 操作
除了 docker run 之外,还有其他常见操作:
从 Dockerfile 构建新映像:从 Dockerfile 构建映像的命令是 docker build,您可以在其中指定 Dockerfile 的位置(可以是当前目录)。您可以使用参数(可选)将一个或多个标记应用于生成的图像。使用 -t 选项。
列出所有本地镜像:使用 docker images 命令列出所有本地镜像。输出包括映像 ID、存储库、标签和创建日期。
标记现有映像:为映像分配标记以进行澄清,以便用户知道他们从存储库中提取的映像版本。标记映像的命令是 docker tag,您需要提供映像 ID 和您选择的标签(包括存储库)。例如:
docker tag 0e5574283393 username/my_repo:1.0
从 Docker 注册表中提取新映像:要从注册表中提取映像,请使用 docker pull 并指定存储库名称。默认情况下,从 Docker Hub 注册表中检索最新版本的映像,但可以通过在 pull 命令中指定不同的版本和/或注册表来覆盖此行为。例如,要从 localhost 端口 2 上运行的私有注册表中提取 my_repo 0.5000 版,请运行:
docker pull localhost:5000/my_repo:2.0
将本地镜像推送到 Docker 注册表:您可以通过运行 docker push 命令将镜像推送到 Docker Hub 或其他注册表,使其可供其他用户使用。例如,要将 my_repo 的(最新)本地版本推送到 Docker Hub,请确保您首先通过运行 docker login 登录,然后运行:
docker push username/my_repo
搜索镜像:您可以使用 docker search 在 Docker Hub 中搜索与特定术语相关的镜像。您可以指定搜索筛选条件,例如仅列出 “官方” 存储库。
构建镜像的最佳实践
通过编写 Dockerfile 构建镜像时,建议遵循以下最佳实践:
使用 .dockerignore 文件从构建上下文中排除构建不需要的文件,从而减小映像大小并缩短构建时间。构建上下文是构建镜像时 Dockerfile 所在的目录的完整递归内容。
通过使用多阶段构建,减小图像文件大小(和攻击面),同时保持 Dockerfile 的可读性。多阶段构建允许您在单个 Dockerfile 中使用多个 FROM 语句,并有选择地将构件从一个阶段复制到另一个阶段,在最终映像中留下您不需要的所有内容。
构建镜像时不要安装不必要的软件包。
尽可能使用多行命令而不是多个 RUN 命令,以加快构建速度(例如,在安装软件包列表时)。
将包的多行列表按字母数字顺序排序,以便轻松识别重复项,并更轻松地更新和查看列表。
在使用远程 Docker 注册表进行操作时启用内容信任,以便您只能推送、拉取、运行或构建经过数字签名以验证其完整性的可信映像。当您使用具有内容信任的 Docker 时,命令仅对已进行数字签名的标记映像进行操作。
上一条:Docker不同宿主机网络打通
下一条:Docker镜像