Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .travis/book.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
{
"title": "Docker -- 从入门到实践",
"author": "yeasy",
"language": "zh-hans",
"links": {
"sidebar": {
"GitHub": "https://github.com/yeasy/docker_practice"
}
},
"plugins": [
"image-captions",
"github-buttons",
Expand Down
7 changes: 6 additions & 1 deletion SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
* [HEALTHCHECK 健康检查](image/dockerfile/healthcheck.md)
* [ONBUILD 为他人作嫁衣裳](image/dockerfile/onbuild.md)
* [参考文档](image/dockerfile/references.md)
* [Dockerfile 多阶段构建](image/multistage-builds.md)
* [Dockerfile 多阶段构建](image/multistage-builds.md)
* [其它制作镜像的方式](image/other.md)
* [删除本地镜像](image/rmi.md)
* [实现原理](image/internal.md)
Expand Down Expand Up @@ -94,6 +94,11 @@
* [安装](machine/install.md)
* [使用](machine/usage.md)
* [Docker 三剑客之 Docker Swarm](swarm/README.md)
* [Swarm mode](swarm_mode/README.md)
* [基本概念](swarm_mode/overview.md)
* [创建 Swarm 集群](swarm_mode/create.md)
* [在 Swarm 集群部署服务](swarm_mode/deploy.md)
* [在 Swarm 集群中使用 docker-compose.yml](swarm_mode/stack.md)
* [Etcd 项目](etcd/README.md)
* [简介](etcd/intro.md)
* [安装](etcd/install.md)
Expand Down
6 changes: 6 additions & 0 deletions book.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
{
"title": "Docker -- 从入门到实践",
"author": "yeasy",
"language": "zh-hans",
"links": {
"sidebar": {
"GitHub": "https://github.com/yeasy/docker_practice"
}
},
"plugins": [
"image-captions",
"github-buttons",
Expand Down
4 changes: 2 additions & 2 deletions compose/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Docker Compose 项目

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。
`Docker Compose` 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用。

本章将介绍 Compose 项目情况以及安装和使用。
本章将介绍 `Compose` 项目情况以及安装和使用。
2 changes: 1 addition & 1 deletion compose/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

执行 `docker-compose [COMMAND] --help` 或者 `docker-compose help [COMMAND]` 可以查看具体某个命令的使用格式。

Compose 命令的基本的使用格式是
`docker-compose` 命令的基本的使用格式是

```bash
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
Expand Down
6 changes: 3 additions & 3 deletions compose/django.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## 使用 Django

本小节内容适合 Python 开发人员阅读。
本小节内容适合 `Python` 开发人员阅读。

我们现在将使用 `Docker Compose` 配置并运行一个 `Django/PostgreSQL` 应用。

Expand Down Expand Up @@ -57,7 +57,7 @@ $ docker-compose run web django-admin.py startproject django_example .

Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject composeexample` 指令。

这将在当前目录生成一个 Django 应用。
这将在当前目录生成一个 `Django` 应用。

```bash
$ ls
Expand Down Expand Up @@ -110,7 +110,7 @@ web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.
```

这个 `Django` 应用已经开始在你的 Docker 守护进程里监听着 `8000` 端口了。打开 `127.0.0.1:8000` 即可看到 Django 欢迎页面。
这个 `Django` 应用已经开始在你的 Docker 守护进程里监听着 `8000` 端口了。打开 `127.0.0.1:8000` 即可看到 `Django` 欢迎页面。

你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端进入文件夹运行以下命令即可:

Expand Down
8 changes: 4 additions & 4 deletions compose/install.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
## 安装与卸载

Compose 目前支持 Linux、macOS、Windows 10 三大平台。
`Compose` 目前支持 Linux、macOS、Windows 10 三大平台。

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。
`Compose` 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。

前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。

Docker for macOSDocker for Windows 自带 `docker-compose` 二进制文件,安装 Docker 之后可以直接使用。
`Docker for macOS` 、`Docker for Windows` 自带 `docker-compose` 二进制文件,安装 Docker 之后可以直接使用。

```bash
$ docker-compose --version
Expand Down Expand Up @@ -119,7 +119,7 @@ exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES
$ sudo rm /usr/local/bin/docker-compose
```

如果是通过 python pip 安装的,则执行如下命令即可删除。
如果是通过 `pip` 安装的,则执行如下命令即可删除。

```bash
$ sudo pip uninstall docker-compose
Expand Down
12 changes: 6 additions & 6 deletions compose/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@

![Docker Compose 项目](_images/docker_compose.jpg)

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
`Compose` 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 `OpenStack` 中的 `Heat` 十分类似。

其代码目前在 [https://github.com/docker/compose](https://github.com/docker/compose) 上开源。

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
`Compose` 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

通过第一部分中的介绍,我们知道使用一个 `Dockerfile` 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 `docker-compose.yml` 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
`Compose` 恰好满足了这样的需求。它允许用户通过一个单独的 `docker-compose.yml` 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

Compose 中有两个重要的概念:
`Compose` 中有两个重要的概念:

* 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

* 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 `docker-compose.yml` 文件中定义。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
`Compose` 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
`Compose` 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 `Compose` 来进行编排管理。
11 changes: 6 additions & 5 deletions compose/rails.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
## 使用 Rail

本小节内容适合 Ruby 开发人员阅读。
本小节内容适合 `Ruby` 开发人员阅读。

我们现在将使用 Compose 配置并运行一个 Rails/PostgreSQL 应用。
我们现在将使用 `Compose` 配置并运行一个 `Rails/PostgreSQL` 应用。

在一切工作开始前,需要先设置好三个必要的文件。

在一切工作开始前,需要先设置好三个必要的文件。
首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:

```docker
Expand Down Expand Up @@ -33,7 +34,7 @@ services:
image: postgres
ports:
- "5432"

web:
build: .
command: bundle exec rackup -p 3000
Expand All @@ -49,7 +50,7 @@ services:
```bash
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
```
Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。
`Compose` 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。

```bash
$ ls
Expand Down
14 changes: 7 additions & 7 deletions compose/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
### 术语
首先介绍几个术语。

* 服务 (service):一个应用容器,实际上可以运行多个相同镜像的实例。
* 服务 (`service`):一个应用容器,实际上可以运行多个相同镜像的实例。

* 项目 (project):由一组关联的应用容器组成的一个完整业务单元。
* 项目 (`project`):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
可见,一个项目可以由多个服务(容器)关联而成,`Compose` 面向项目进行管理。

### 场景
下面,我们创建一个经典的 Web 项目:一个 [Haproxy](http://www.haproxy.org/),挂载三个 Web 容器。
Expand Down Expand Up @@ -93,7 +93,7 @@ if __name__ == '__main__':
```

#### index.html
生成一个临时的 `index.html` 文件,其内容会被 index.py 更新。
生成一个临时的 `index.html` 文件,其内容会被 `index.py` 更新。
```bash
$ touch index.html
```
Expand Down Expand Up @@ -145,7 +145,7 @@ backend web_backends
http-check expect status 200
```
### docker-compose.yml
编写 `docker-compose.yml` 文件,这个是 Compose 使用的主模板文件。内容十分简单,指定 3 个 web 容器,以及 1 个 haproxy 容器。
编写 `docker-compose.yml` 文件,这个是 `Compose` 使用的主模板文件。内容十分简单,指定 3 个 `web` 容器,以及 1 个 `haproxy` 容器。

```yaml
version: "3"
Expand Down Expand Up @@ -201,6 +201,6 @@ Recreating composehaproxyweb_haproxy_1...
Attaching to composehaproxyweb_webb_1, composehaproxyweb_webc_1, composehaproxyweb_weba_1, composehaproxyweb_haproxy_1
```

此时访问本地的 80 端口,会经过 haproxy 自动转发到后端的某个 web 容器上,刷新页面,可以观察到访问的容器地址的变化。
此时访问本地的 `80` 端口,会经过 `haproxy` 自动转发到后端的某个 web 容器上,刷新页面,可以观察到访问的容器地址的变化。

访问本地 70 端口,可以查看到 haproxy 的统计信息。
访问本地 `70` 端口,可以查看到 `haproxy` 的统计信息。
6 changes: 3 additions & 3 deletions compose/wordpress.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
## 使用 WordPress

本小节内容适合 PHP 开发人员阅读。
本小节内容适合 `PHP` 开发人员阅读。

Compose 可以很便捷的让 Wordpress 运行在一个独立的环境中。
`Compose` 可以很便捷的让 `Wordpress` 运行在一个独立的环境中。

### 创建空文件夹

Expand Down Expand Up @@ -44,4 +44,4 @@ volumes:

### 构建并运行项目

运行 `docker-compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 `wordpress` 和数据库容器。 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 WordPress 安装界面了。
运行 `docker-compose up -d` Compose 就会拉取镜像再创建我们所需要的镜像,然后启动 `wordpress` 和数据库容器。 接着浏览器访问 `127.0.0.1:8000` 端口就能看到 `WordPress` 安装界面了。
2 changes: 1 addition & 1 deletion compose/yaml_file.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## Compose 模板文件

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 `docker run` 相关参数的含义都是类似的。
模板文件是使用 `Compose` 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 `docker run` 相关参数的含义都是类似的。

默认的模板文件名称为 `docker-compose.yml`,格式为 YAML 格式。

Expand Down
5 changes: 5 additions & 0 deletions swarm_mode/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Swarm mode

Docker 1.12 [Swarm mode](https://docs.docker.com/engine/swarm/) 已经内嵌入 Docker 引擎,成为了 docker 子命令 `docker swarm`。请注意与旧的 `Docker Swarm` 区分开来。

`Swarm mode` 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的 `Swarm` 集群具备与 Mesos、Kubernetes 竞争的实力。
68 changes: 68 additions & 0 deletions swarm_mode/create.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
## 创建 Swarm 集群

阅读 [基本概念](overview.md) 一节我们知道 `Swarm` 集群由管理节点和工作节点组成。本节我们来创建一个包含一个管理节点和两个工作节点的最小 `Swarm` 集群。

### 初始化集群

我们使用 `docker swarm init` 在本机初始化一个 `Swarm` 集群。

```bash
$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
```

如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 `--advertise-addr` 指定 IP。

执行 `docker swarm init` 命令的节点自动成为管理节点。

### 增加工作节点

上一步中我们在本机初始化了一个 `Swarm` 集群,拥有了一个管理节点,下面我们使用 [`Docker Machine`](../machine) 创建两个 Docker 主机,并加入到集群中。

```bash
$ docker-machine create -d virtualbox worker1

$ docker-machine ssh worker1

docker@worker1:~$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377

This node joined a swarm as a worker.
```

```bash
$ docker-machine create -d virtualbox worker2

$ docker-machine ssh worker2

docker@worker1:~$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377

This node joined a swarm as a worker.
```

*注意:* 一些细心的读者可能通过 `docker-machine create --help` 查看到 `--swarm*` 等一系列参数。该参数是用于旧的 `Docker Swarm`,与本章所讲的 `Swarm mode` 没有关系。

### 查看集群

经过上边的两步,我们已经拥有了一个最小的 `Swarm` 集群,包含一个管理节点和两个工作节点。

在管理节点使用 `docker node ls` 查看集群。

```bash
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
03g1y59jwfg7cf99w4lt0f662 worker2 Ready Active
9j68exjopxe7wfl6yuxml7a7j worker1 Ready Active
dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader
```
47 changes: 47 additions & 0 deletions swarm_mode/demo/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
version: "3"

services:
wordpress:
image: wordpress
ports:
- 80:80
networks:
- overlay
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
deploy:
mode: replicated
replicas: 3

db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
deploy:
placement:
constraints: [node.role == manager]

visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]

volumes:
db-data:
networks:
overlay:
Loading