diff --git a/docs/docker/README.md b/docs/docker/README.md index 4dea658..93afb51 100644 --- a/docs/docker/README.md +++ b/docs/docker/README.md @@ -11,12 +11,13 @@ - [x] [Docker 安装](basics/docker-install.md) - [ ] 配置(configuration) - [ ] 进阶篇(advanced) - - [ ] 设计(design) + - [x] [Docker 的设计](advanced/docker-design.md) - [ ] 实践篇(practice) - [ ] 常见问题(faq) - [x] [附录](appendix/README.md) - [x] [Docker 命令](appendix/docker-cli.md) - [x] [Docker 资源](appendix/docker-resource.md) - [x] [Docker 术语](appendix/docker-glossary.md) + - [x] [Docker 技巧](appendix/docker-recipe.md) _知识点仍在完善中。。。_ diff --git a/docs/docker/advanced/docker-design.md b/docs/docker/advanced/docker-design.md new file mode 100644 index 0000000..44551a2 --- /dev/null +++ b/docs/docker/advanced/docker-design.md @@ -0,0 +1,73 @@ +# Docker 的设计 + +## Docker 架构 + +Docker 使用 C/S 体系结构。Docker 守护进程,负责构建、运行和分发 Docker 容器;Docker 客户端与 Docker 守护进程通信。Docker 客户端和守护进程可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API,并通过 UNIX 套接字或网络接口进行通信。 + +![https://docs.docker.com/engine/images/architecture.svg](https://docs.docker.com/engine/images/architecture.svg) + +### Docker 守护进程(docker daemon) + +Docker 守护进程(`dockerd`)监听 Docker API 请求并管理 Docker 对象(如镜像,容器,网络和卷)。守护进程还可以与其他守护进程通信来管理 Docker 服务。 + +### Docker 客户端 + +Docker 客户端(`docker`)是许多 Docker 用户与 Docker 进行交互的主要方式。当你使用诸如 `docker run` 之类的命令时,客户端将这些命令发送到 `dockerd`,`dockerd` 执行这些命令。 `docker` 命令使用 Docker API。 Docker 客户端可以与多个守护进程进行通信。 + +### Docker 注册中心 + +Docker 注册中心存储 Docker 镜像。Docker Hub 和 Docker Cloud 是任何人都可以使用的公共注册中心,并且 Docker 默认配置为在 Docker Hub 上查找镜像。你甚至可以运行你自己的私人注册中心。如果您使用 Docker Datacenter(DDC),它包括 Docker Trusted Registry(DTR)。 + +当您使用 `docker pull` 或 `docker run` 命令时,所需的镜像将从配置的注册中心中提取。当您使用 `docker push` 命令时,您的镜像将被推送到您配置的注册中心。 + +[Docker 商店](http://store.docker.com/) 允许您购买和销售 Docker 镜像或免费发布。例如,您可以购买包含来自软件供应商的应用程序或服务的 Docker 镜像,并使用该镜像将应用程序部署到您的测试,临时和生产环境中。您可以通过拉取新版本的镜像并重新部署容器来升级应用程序。 + +### Docker 对象 + +#### 镜像 + +镜像是一个只读模板,带有创建 Docker 容器的说明。通常,镜像基于另一个镜像,并具有一些额外的自定义功能。例如,您可以构建基于 ubuntu 镜像的镜像,但会安装 Apache Web 服务器和应用程序,以及使应用程序运行所需的配置细节。 + +您可能会创建自己的镜像,或者您可能只能使用其他人创建并在注册中心中发布的镜像。为了构建您自己的镜像,您可以使用简单的语法创建 `Dockerfile`,以定义创建镜像并运行所需的步骤。 `Dockerfile` 中的每条指令都会在镜像中创建一个图层。当您更改 `Dockerfile` 并重建镜像时,只重建那些已更改的图层。与其他虚拟化技术相比,这是使镜像轻量,小巧,快速的一部分。 + +#### 容器 + +容器是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,将存储器连接到它,甚至可以根据其当前状态创建新镜像。 + +默认情况下,容器与其他容器及其主机相对隔离。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。 + +容器由其镜像以及您在创建或启动时提供给它的任何配置选项来定义。当一个容器被移除时,其未被存储在永久存储器中的状态将消失。 + +#### 服务 + +通过服务,您可以跨多个 Docker 守护进程扩展容器,这些守护进程可以作为一个群组与多个管理人员、工作人员一起工作。集群中的每个成员都是 Docker 守护进程,守护进程都使用 Docker API 进行通信。服务允许您定义所需的状态,例如在任何给定时间必须可用的服务的副本数量。默认情况下,该服务在所有工作节点之间进行负载平衡。对于消费者来说,Docker 服务似乎是一个单一的应用程序。Docker 引擎在 Docker 1.12 及更高版本中支持集群模式。 + +## 底层技术 + +Docker 使用 Go 编写,利用 Linux 内核的几个特性来提供其功能。 + +### 命名空间 + +Docker 使用名为 `namespaces` 的技术来提供独立工作空间(即容器)。当你运行一个容器时,Docker 会为该容器创建一组命名空间。 + +这些命名空间提供了一个隔离层。容器的每个方面都在单独的命名空间中运行,并且其访问权限限于该命名空间。 + +Docker 引擎在 Linux 上使用如下的命名空间: + +* `pid` 命名空间:进程隔离(PID:进程ID)。 +* `net` 命名空间:管理网络接口(NET:网络)。 +* `ipc` 命名空间:管理对IPC资源的访问(IPC:InterProcess Communication)。 +* `mnt` 命名空间:管理文件系统挂载点(MNT:挂载)。 +* `uts` 命名空间:隔离内核和版本标识符。 (UTS:Unix分时系统)。 + +### 控制组 + +Linux 上的 Docker Engine 也依赖于另一种称为控制组(`cgroups`)的技术。 cgroup 将应用程序限制为一组特定的资源。控制组允许 Docker 引擎将可用硬件资源共享给容器,并可选地强制实施限制和约束。例如,您可以限制可用于特定容器的内存。 + +### 联合文件系统 + +联合文件系统(UnionFS)是通过创建图层进行操作的文件系统,这使它们非常轻巧和快速。 Docker 引擎使用 UnionFS 为容器提供构建块。Docker 引擎可以使用多种 UnionFS 变体,包括 AUFS,btrfs,vfs 和 DeviceMapper。 + +### 容器格式 + +Docker 引擎将命名空间,控制组和 UnionFS 组合成一个名为容器格式的包装器。默认的容器格式是`libcontainer`。将来,Docker 可以通过与诸如 BSD Jails 或 Solaris Zones 等技术集成来支持其他容器格式。 diff --git a/docs/docker/appendix/README.md b/docs/docker/appendix/README.md index a56801d..f2a3cb3 100644 --- a/docs/docker/appendix/README.md +++ b/docs/docker/appendix/README.md @@ -5,3 +5,4 @@ * [Docker 命令](docker-cli.md) * [Docker 资源](docker-resource.md) * [Docker 术语](docker-glossary.md) +* [Docker 技巧](docker-recipe.md) diff --git a/docs/docker/appendix/docker-recipe.md b/docs/docker/appendix/docker-recipe.md new file mode 100644 index 0000000..80af699 --- /dev/null +++ b/docs/docker/appendix/docker-recipe.md @@ -0,0 +1,23 @@ +# Docker 技巧 + +## 命令技巧 + +### 停止所有的 docker container + +_这样才能够删除其中的images_ + +``` +docker stop $(docker ps -a -q) +``` + +### 删除所有的 docker container + +``` +docker rm $(docker ps -a -q) +``` + +### 删除所有的 docker images + +``` +docker rmi $(docker images -q) +``` \ No newline at end of file diff --git a/docs/docker/appendix/images/docker-cli.png b/docs/docker/appendix/images/docker-cli.png index e8d59e5..16ac183 100644 Binary files a/docs/docker/appendix/images/docker-cli.png and b/docs/docker/appendix/images/docker-cli.png differ diff --git a/docs/docker/basics/docker-images.md b/docs/docker/basics/docker-images.md new file mode 100644 index 0000000..1c81928 --- /dev/null +++ b/docs/docker/basics/docker-images.md @@ -0,0 +1,66 @@ +# Docker 镜像使用 + +## 列出镜像列表 + +`docker images` 命令可用来列出本地主机上的镜像。 + +``` +# docker images +REPOSITORY TAG IMAGE ID CREATED SIZE +docker.io/maven latest 76c9ab5df55b 7 days ago 737 MB +friendlyhello latest 0c6d91e71733 8 days ago 148 MB + d1eab98cf3bd 11 days ago 311 MB +docker.io/python 2.7-slim 5541369755c4 13 days ago 139 MB +docker.io/hello-world latest f2a91732366c 4 months ago 1.85 kB +docker.io/java 8-jre e44d62cf8862 14 months ago 311 MB +docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB +``` + +选项说明: + +* REPOSITORY:表示镜像的仓库源 +* TAG:镜像的标签 +* IMAGE ID:镜像ID +* CREATED:镜像创建时间 +* SIZE:镜像大小 + +同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。 + +如果要使用版本为14.04的ubuntu系统镜像来运行容器时,命令如下: + +``` +docker run -t -i ubuntu:14.04 /bin/bash +``` + +如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。 + +## 查找镜像 + +可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/ + +我们也可以使用 `docker search` 命令来搜索镜像。比如我们需要一个httpd的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。 + +``` +docker search httpd +``` + +## 拉取镜像 + +当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 `docker pull` 命令来下载它。 + +``` +# docker pull ubuntu:13.10 +13.10: Pulling from library/ubuntu +6599cadaf950: Pull complete +23eda618d451: Pull complete +f0be3084efe9: Pull complete +52de432f084b: Pull complete +a3ed95caeb02: Pull complete +Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3 +Status: Downloaded newer image for ubuntu:13.10 +``` + +下载完成后,我们可以直接使用这个镜像来运行容器。 + +## 创建镜像 + diff --git a/docs/docker/basics/docker-introduction.md b/docs/docker/basics/docker-introduction.md new file mode 100644 index 0000000..9d61363 --- /dev/null +++ b/docs/docker/basics/docker-introduction.md @@ -0,0 +1,35 @@ +# Docker 简介 + +## Docker 是什么 + +Docker 是开发,传输和运行应用程序的开放平台。 + +Docker 使您能够将应用程序与基础架构分开,以便快速交付软件。 + +借助 Docker,您可以像管理应用程序一样管理基础架构。通过利用 Docker 的方法快速进行运输,测试和部署代码,您可以显著缩短编写代码和在生产环境中运行代码之间的耗时。 + +## Docker 平台 + +Docker 提供了被称为容器的松散隔离环境,在环境中可以打包和运行应用程序。隔离和安全性允许您在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要管理程序的额外负载,而是直接在主机的内核中运行。这意味着您可以在给定的硬件组合上运行更多容器,而不是使用虚拟机。你甚至可以在实际上是虚拟机的主机中运行 Docker 容器! + +Docker 提供工具和平台来管理容器的生命周期: + +* 使用容器开发您的应用程序及其支持组件。 +* 容器成为分发和测试你的应用程序的单元。 +* 准备好后,将您的应用程序部署到生产环境中,作为容器或协调服务。无论您的生产环境是本地数据中心,云提供商还是两者的混合,这都是一样的。 + +## Docker 引擎 + +Docker 引擎是一个 C/S 架构的应用,它有这些主要的组件: + +服务器是一个长期运行的程序,被称为守护进程。 + +REST API 指定程序可用于与守护进程进行通信并指示其执行操作的接口。 + +命令行客户端。 + +![https://docs.docker.com/engine/images/engine-components-flow.png](https://docs.docker.com/engine/images/engine-components-flow.png) + +CLI 使用 Docker REST API 通过脚本或直接 CLI 命令来控制 Docker 守护进程或与其进行交互。许多其他 Docker 应用程序使用底层的 API 和 CLI。 + +守护进程创建并管理 Docker 对象,如镜像,容器,网络和卷。 \ No newline at end of file diff --git a/docs/docker/docker.xmind b/docs/docker/docker.xmind index 7b1e95b..76d249e 100644 Binary files a/docs/docker/docker.xmind and b/docs/docker/docker.xmind differ