理解 Docker – Docker 用户指南

Docker を理解する

Understanding Docker – Docker Documentation
http://docs.docker.com/introduction/understanding-docker/

为什么选择 Docker 呢?

Docker は開発、移動、アプリケーションの実行を行うオープンなプラットフォームです。Docker はアプリケーションを速く届けるよう設計されています。Docker を使う事で、インフラ基盤からアプリケーションを切り離すことができるのと、インフラ基盤をアプリケーションを管理するように扱えます。Docker は、コードをより速く送り出し、速くテストし、速くデプロイし、コードを書いてコードを実行するサイクルを短くするのに役立ちます。

Docker通过组合工作流程和工具提供了一个轻量级的容器虚拟化平台,可用于应用程序的管理和部署。

Docker 提供了一个核心功能,即在容器内运行时,几乎所有的应用程序都可以在安全隔离的环境中执行。由于具有隔离和安全性功能,因此可以在自己的主机上同时运行多个容器。由于其轻量级的特性,可以在不给虚拟机带来额外负载的情况下,从硬件中获得更多的利益。

有几个工具和平台围绕容器虚拟化来提供帮助:

    • Docker コンテナに、アプリケーション(そしてサポート・コンポーネント)を入れる

 

    • チームでの更なる開発とテストのために、コンテナの配付と発送をする

 

    これらのアプリケーションを本番環境、ローカルのデータセンタやクラウドに配備(デプロイ)します。

如何使用Docker?

应用程序的快速移动

Docker对于促进开发生命周期没有缺陷。Docker是一个包含应用程序和服务的本地容器,使开发人员能够进行开发。这样就可以将持续集成和开发工作流程整合起来。

例如,开发者可以在本地编写代码,然后通过Docker容器将这些开发堆栈共享。当这些准备工作完成后,他们会将代码push到测试环境中进行堆叠,并执行所有必要的测试。在测试环境中,可以将Docker映像部署到生产环境中。

使展开更加简单化

Docker のコンテナを基盤としたプラットフォームによって、高く持ち運び可能な作業負担(workload)となります。Docker コンテナは、開発者のローカルホストで開発することができますし、データセンタの物理あるいは仮想マシンでも構いませんし、クラウド上でも走らせることができます。

Docker の移植性(portability)と軽量な性質によって、動的に作業負担をの管理を簡単にもします。Docker を使う事で、アプリケーションやサービスの迅速なスケールアップや引き下ろし(tear down)ができるようになります。Docker のスピードというのは、リアルタイムに近くスケールすることができうるという意味があります。

高效地执行大量工作负荷。

Docker是一种轻量且高速的选择。它为通过虚拟机进行的基于超级监视器的解决方案,提供了实际且具有良好的成本效益的选择。特别适用于高密度环境,例如自建云计算或作为服务的平台(PaaS)。然而,对于小型及中型开发环境,也可以充分利用自身的租赁资源来实现有益的结果。

Docker の主要コンポーネントとは何か?

Docker有两个主要组件。

    • Docker: オープンソースのコンテナ仮想化プラットフォーム

 

    Docker Hub: Docker コンテナを共有・管理するための SaaS プラットフォーム

备注:Docker 是以开源 Apache 2.0 许可证提供的。

Docker 的设计(架构)是什么?

Docker 是一种客户端-服务器模型的设计。Docker 客户端与 Docker 守护进程进行通信,处理构建、运行和分发 Docker 容器等重负载任务。Docker 客户端和守护进程可以在同一系统上运行,也可以通过连接到远程 Docker 守护进程的方式来操作。Docker 客户端和服务可以通过套接字或 RESTful API 进行通信。

画像链接:http://docs.docker.com/article-img/architecture.svg

Docker 守护进程

如上图所示,Docker守护进程在主机上运行。使用者与守护进程的交互是通过Docker客户端完成的,而非直接与守护进程交互。

Docker 客户端

Docker 客户端是以 ‘docker’ 二进制文件的形式存在的,它是与 Docker 进行连接的主要接口。根据用户输入的命令,它与 Docker 守护进程进行交互。

Docker 的内部机制

为了理解Docker的内容,首先需要了解三个组成部分。

    • Docker イメージ(images)

 

    • Docker レジストリ(registries)

 

    Docker コンテナ(containers)

Docker 镜像 (Docker Image)

Docker镜像是只读的模板。例如,某个云服务中的镜像包含了安装有Apache和网页应用的Ubuntu操作系统。镜像用于创建Docker容器。Docker为新镜像的更新、现有镜像的更新等提供了便捷的方式,可以下载他人已经创建的Docker镜像。Docker镜像是Docker构建组件的一部分。

Docker 注册表

Docker注册表用于存储镜像。在注册表中,您可以上传或下载自己的镜像到公共或私有存储库。公共Docker注册表被称为Docker Hub,提供了一个巨大的可用现有镜像集合。您可以自行创建镜像,也可以使用他人已经创建的镜像。Docker注册表是Docker的分发组件。

Docker容器

Docker容器类似于文件夹。Docker容器包含了运行应用程序所需的所有内容。每个容器都是从Docker镜像创建的。Docker容器可以执行、启动、停止、移动和删除。每个容器都是独立的安全应用程序平台。Docker容器是Docker的执行组件。

那么,Docker 是用来做什么的呢?

到目前为止,我们学到了以下的事情;

    1. 你可以构建一个包含应用程序的 Docker 镜像。

 

    1. 你可以从 Docker 镜像创建 Docker 容器来运行应用程序。

 

    你可以通过 Docker Hub 或自己的注册表共享 Docker 镜像。

接下来,我们将看一下这些要素在Docker的运作中是如何相互关联的。

Docker镜像的作用是什么?

我们已经看到 Docker 镜像是启动 Docker 容器时的只读模板。每个镜像由多个层组成。Docker 使用联合文件系统将这些层合并到一个镜像中。联合文件系统通过将文件和目录与文件系统分离(称为分支),透明地覆盖在一起,创建一个一致性的文件系统。

Docker がとても軽量な理由の1つは、これらの層があるためとも考えられます。Docker イメージの変更を行うとき、例えば、アプリケーションを新しいバージョンにバージョンアップするときは、あたら意志レイヤを取得し、ビルドします。すなわち、マシンイメージの全てを(ゼロから)作り直すよりも、全体的な再建( entirely rebuilding ) であり、それらは仮想マシンだけで実行されるかもしれませんが、対象となる層だけが追加または更新されます。これで、新しい Docker イメージを作っても更新するだけで、Docker イメージを速く簡単に配付できるようになるので、どうやってその新しいイメージを配付するかを心配する必要はありません。

所有的镜像都是从基本镜像开始使用。例如,Ubuntu的基本镜像是基于Ubuntu的基本镜像,而Fedora的基本镜像是基于Fedora的基本镜像。
作为创建新镜像的基础,您可以使用自己的镜像。例如,如果您有一个基本Apache镜像,您也可以将其用作您所有Web应用程序镜像的基础。

备忘录:Docker通常从Docker Hub获取这些基本镜像。Docker镜像可以通过使用这些基本镜像以及称为指令的步骤的设置描述来轻松构建。通过许多指令,我们在我们的映像上创建新的层。指令包括以下操作。

    • コマンドを実行する

 

    • ファイルやディレクトリの追加

 

    • 環境変数の追加

 

    コンテナ起動時、対象イメージの中の何のプロセスを起動するか

这些指令会保存在一个称为 ‘Dockerfile’ 的文件中。当构建镜像时,Docker会读取这个 ‘Dockerfile’ 文件,并执行其中的指令,最终返回一个完成的镜像。

Docker注册表如何运作?

Docker镜像注册表是存放自己的Docker镜像的地方。一旦创建完成Docker镜像,就可以将该镜像放置在公共的Docker Hub注册表上,或者放置在自己的防火墙下。

通过使用Docker客户端,您可以搜索已经发布的镜像,并将其拉取到您的Docker主机上,以构建这些容器。

Docker Hub为用户提供了公共和私有的镜像存储空间。公共存储空间可以供任何人搜索和下载。而私有存储空间只能供自己或自己的用户搜索结果并构建容器。有关存储空间的定价计划,请在此处注册。

容器的功能是什么?

容器中包含操作系统、用户添加的文件和元数据。正如我们之前所看到的那样,每个容器都是从镜像构建而来的。镜像告诉Docker要保存哪些容器、要执行哪些进程、何时启动容器以及各种配置数据。Docker镜像是只读的。当Docker从镜像启动容器时,它会在镜像上添加可读写的层(使用我们之前所看到的联合文件系统),以使应用程序可执行。

当运行容器时,会发生什么?

无论是使用 Docker 二进制文件还是通过 API,Docker 客户端都可以告诉 Docker 守护进程来执行容器。

$ docker run -i -t ubuntu /bin/bash

让我们来分析一下这个命令。
Docker客户端在启动docker二进制文件的run选项下启动新容器时。
Docker客户端向Docker守护程序传达运行容器所需的最少信息如下:

    • コンテナの構築を、どの Docker イメージから行うか。ここでの ubuntu は、base ubnutu image を使います。

 

    コンテナ起動時に内部で実行したいと思うコマンド。ここでは /bin/bash が、新しいコンテナの中で Bash シェルを起動することを意味します。

如果执行此命令,会发生什么呢?

Docker 将按照以下顺序依次执行。

    • 1ubuntu1 イメージの取得: Docker は `ubuntu1 イメージの存在を調べ、もしもローカルホストや存在しないのであれば、Docker は Docker Hub からダウンロードします。もしイメージが既に存在しているなら、Docker はそれを新しいコンテナ向けに使います。

 

    • 新しいコンテナの作成: Docker が一度イメージを作成しておくと、そこから新しくコンテナを作成できます。

 

    • ファイルシステムを割り当て、読み書き層をマウント: コンテナはファイルシステム上で生成され、イメージに読み書き層を追加します。

 

    • ネットワークやブリッジインターフェースの追加: ネットワークインターフェースを作成し、Docker コンテナがローカルホストと通信できるようにします。

 

    • IP アドレスのセット: プール上で利用可能な IP アドレスを探し、取り付けます

 

    • 指定したプロセスを実行: アプリケーションを実行し、それから

 

    アプリケーションの出力を取得・提供:稼働しているアプリケーションに接続し、ログの標準入出力やエラーを見えるようにします。

容器已经开始运行!从这里开始,我们将对容器进行管理,并与应用程序进行交互,最后停止并删除容器。

基础技术

Docker 是用 Go 语言编写的,为了提供之前介绍过的功能,它利用了一些 Linux 内核技术。

命名空间

当我们提供被我们称为容器的隔离工作空间时,Docker 使用了称为命名空间的技术。当执行容器时,Docker 会为目标容器创建一组命名空间。

通过这个方法,可以实现层的分离(隔离):每个容器的外观都是它自己的命名空间,但不能从外部访问。

Docker使用的命名空间如下所示:

pid ネームスペース: プロセスの分離 (PID: プロセス ID).

net ネームスペース: ネットワークインターフェースの管理 (NET: ネットワーク).

ipc ネームスペース: IPC リソースの管理(IPC: 内部プロセスにおける通信).

mnt ネームスペース: マウントポイントのマッピング (MNT: マウント).

uts ネームスペース: カーネルとバージョン識別の分離 (UTS: Unix タイムシェアリングシステム).

控制组 zǔ)

Docker 使用了被称为 cgroups 或 control groups 的其他技术。关键是将应用程序分离并进行执行,只分配所需资源。这样,在主机上保证了只有合适的多租户用户。控制组允许 Docker 允许容器共享可共享的硬件资源,并且可以设置限制和约束。例如,可以为特定容器设置可用内存的上限。

联合文件系统

联合文件系统(UnionFS)是一种非常轻量且快速的容器层操作文件系统。为了使容器能够使用文件系统的块,Docker 使用了联合文件系统。Docker 可以使用包括 AUFS、Btrfs、vfs、DeviceMapper 在内的几个联合文件系统系列。

容器规范

Docker在组合容器格式和我们称之为的封装器,并使用这些组件。标准的容器格式是libcontainer。Docker还支持传统的Linux容器LXC。未来,Docker可能会支持其他容器格式,例如与BSD Jails或Solaris Zones的集成。

广告
将在 10 秒后关闭
bannerAds