This commit is contained in:
khs1994 2017-11-22 11:13:23 +08:00
parent c3c3cf98cb
commit 7cbdf27d93
30 changed files with 189 additions and 193 deletions

View File

@ -4,12 +4,12 @@
### 容器访问外部网络 ### 容器访问外部网络
容器要想访问外部网络需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。 容器要想访问外部网络需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
``` ```bash
$sysctl net.ipv4.ip_forward $sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1 net.ipv4.ip_forward = 1
``` ```
如果为 0说明没有开启转发则需要手动打开。 如果为 0说明没有开启转发则需要手动打开。
``` ```bash
$sysctl -w net.ipv4.ip_forward=1 $sysctl -w net.ipv4.ip_forward=1
``` ```
如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。 如果在启动 Docker 服务的时候设定 `--ip-forward=true`, Docker 就会自动设定系统的 `ip_forward` 参数为 1。
@ -30,7 +30,7 @@ $sysctl -w net.ipv4.ip_forward=1
例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。 例如,在启动 Docker 服务时,可以同时使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系统中的 `iptables` 规则。
此时,系统中的 `iptables` 规则可能是类似 此时,系统中的 `iptables` 规则可能是类似
``` ```bash
$ sudo iptables -nL $ sudo iptables -nL
... ...
Chain FORWARD (policy ACCEPT) Chain FORWARD (policy ACCEPT)
@ -42,7 +42,7 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0
之后,启动容器(`docker run`)时使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则,允许相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。 之后,启动容器(`docker run`)时使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker 会在 `iptable` 中为 两个容器分别添加一条 `ACCEPT` 规则,允许相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。
当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则。 当添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则。
``` ```bash
$ sudo iptables -nL $ sudo iptables -nL
... ...
Chain FORWARD (policy ACCEPT) Chain FORWARD (policy ACCEPT)

View File

@ -3,7 +3,7 @@ Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容
秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
在容器中使用 mount 命令可以看到挂载信息: 在容器中使用 mount 命令可以看到挂载信息:
``` ```bash
$ mount $ mount
... ...
/dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ...

View File

@ -7,7 +7,7 @@ Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机
也可以在配置文件中配置 DOCKER_OPTS然后重启服务。 也可以在配置文件中配置 DOCKER_OPTS然后重启服务。
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。 由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。
``` ```bash
$ sudo brctl show $ sudo brctl show
bridge name bridge id STP enabled interfaces bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9 docker0 8000.3a1d7362b4ee no veth65f9
@ -17,7 +17,7 @@ docker0 8000.3a1d7362b4ee no veth65f9
每次创建一个新容器的时候Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。 每次创建一个新容器的时候Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。
``` ```bash
$ sudo docker run -i -t --rm base /bin/bash $ sudo docker run -i -t --rm base /bin/bash
$ ip addr show eth0 $ ip addr show eth0
24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 24: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

View File

@ -5,7 +5,7 @@
容器所有到外部网络的连接源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。 容器所有到外部网络的连接源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。
查看主机的 NAT 规则。 查看主机的 NAT 规则。
``` ```bash
$ sudo iptables -t nat -nL $ sudo iptables -t nat -nL
... ...
Chain POSTROUTING (policy ACCEPT) Chain POSTROUTING (policy ACCEPT)
@ -22,7 +22,7 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。 不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。
使用 `-P` 时: 使用 `-P` 时:
``` ```bash
$ iptables -t nat -nL $ iptables -t nat -nL
... ...
Chain DOCKER (2 references) Chain DOCKER (2 references)
@ -31,7 +31,7 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:1
``` ```
使用 `-p 80:80` 时: 使用 `-p 80:80` 时:
``` ```bash
$ iptables -t nat -nL $ iptables -t nat -nL
Chain DOCKER (2 references) Chain DOCKER (2 references)
target prot opt source destination target prot opt source destination

View File

@ -8,7 +8,7 @@
### 使用方法 ### 使用方法
默认会启动一个最小化的 CentOS 环境。 默认会启动一个最小化的 CentOS 环境。
```sh ```bash
$ docker run --name some-centos -i -t centos bash $ docker run --name some-centos -i -t centos bash
bash-4.2# bash-4.2#
``` ```

View File

@ -8,19 +8,19 @@
### 使用方法 ### 使用方法
默认会在 `27017` 端口启动数据库。 默认会在 `27017` 端口启动数据库。
```sh ```bash
$ docker run --name some-mongo -d mongo $ docker run --name some-mongo -d mongo
``` ```
使用其他应用连接到容器,可以用 使用其他应用连接到容器,可以用
```sh ```bash
$ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo $ docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
``` ```
或者通过 `mongo` 或者通过 `mongo`
```sh ```bash
$ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"' $ docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
``` ```

View File

@ -8,17 +8,17 @@
### 使用方法 ### 使用方法
默认会在 `3306` 端口启动数据库。 默认会在 `3306` 端口启动数据库。
``` ```bash
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
``` ```
之后就可以使用其它应用来连接到该容器。 之后就可以使用其它应用来连接到该容器。
``` ```bash
$ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql $ docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
``` ```
或者通过 `mysql` 或者通过 `mysql`
``` ```bash
$ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' $ docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
``` ```

View File

@ -8,30 +8,30 @@
### 使用方法 ### 使用方法
下面的命令将作为一个静态页面服务器启动。 下面的命令将作为一个静态页面服务器启动。
``` ```bash
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx $ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
``` ```
用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为 用户也可以不使用这种映射方式,通过利用 Dockerfile 来直接将静态页面内容放到镜像中,内容为
``` ```bash
FROM nginx FROM nginx
COPY static-html-directory /usr/share/nginx/html COPY static-html-directory /usr/share/nginx/html
``` ```
之后生成新的镜像,并启动一个容器。 之后生成新的镜像,并启动一个容器。
``` ```bash
$ docker build -t some-content-nginx . $ docker build -t some-content-nginx .
$ docker run --name some-nginx -d some-content-nginx $ docker run --name some-nginx -d some-content-nginx
``` ```
开放端口,并映射到本地的 `8080` 端口。 开放端口,并映射到本地的 `8080` 端口。
``` ```bash
docker run --name some-nginx -d -p 8080:80 some-content-nginx docker run --name some-nginx -d -p 8080:80 some-content-nginx
``` ```
Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如 Nginx的默认配置文件路径为 `/etc/nginx/nginx.conf`,可以通过映射它来使用本地的配置文件,例如
``` ```bash
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
``` ```
使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;` 使用配置文件时,为了在容器中正常运行,需要保持 `daemon off;`

View File

@ -8,21 +8,21 @@
### 使用方法 ### 使用方法
在项目中创建一个 Dockerfile。 在项目中创建一个 Dockerfile。
``` ```bash
FROM node:0.10-onbuild FROM node:0.10-onbuild
# replace this with your application's default port # replace this with your application's default port
EXPOSE 8888 EXPOSE 8888
``` ```
然后创建镜像,并启动容器。 然后创建镜像,并启动容器。
``` ```bash
$ docker build -t my-nodejs-app $ docker build -t my-nodejs-app
$ docker run -it --rm --name my-running-app my-nodejs-app $ docker run -it --rm --name my-running-app my-nodejs-app
``` ```
也可以直接运行一个简单容器。 也可以直接运行一个简单容器。
``` ```bash
$ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js $ docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js
``` ```

View File

@ -8,12 +8,12 @@
### 使用方法 ### 使用方法
默认会在 `6379` 端口启动数据库。 默认会在 `6379` 端口启动数据库。
``` ```bash
$ docker run --name some-redis -d redis $ docker run --name some-redis -d redis
``` ```
另外还可以启用 [持久存储](http://redis.io/topics/persistence)。 另外还可以启用 [持久存储](http://redis.io/topics/persistence)。
``` ```bash
$ docker run --name some-redis -d redis redis-server --appendonly yes $ docker run --name some-redis -d redis redis-server --appendonly yes
``` ```
@ -21,12 +21,12 @@ $ docker run --name some-redis -d redis redis-server --appendonly yes
使用其他应用连接到容器,可以用 使用其他应用连接到容器,可以用
``` ```bash
$ docker run --name some-app --link some-redis:redis -d application-that-uses-redis $ docker run --name some-app --link some-redis:redis -d application-that-uses-redis
``` ```
或者通过 `redis-cli` 或者通过 `redis-cli`
``` ```bash
$ docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"' $ docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
``` ```

View File

@ -8,7 +8,7 @@
### 使用方法 ### 使用方法
默认会启动一个最小化的 Ubuntu 环境。 默认会启动一个最小化的 Ubuntu 环境。
``` ```bash
$ docker run --name some-ubuntu -i -t ubuntu $ docker run --name some-ubuntu -i -t ubuntu
root@523c70904d54:/# root@523c70904d54:/#
``` ```

View File

@ -8,7 +8,7 @@
### 使用方法 ### 使用方法
启动容器需要 MySQL 的支持,默认端口为 `80` 启动容器需要 MySQL 的支持,默认端口为 `80`
``` ```bash
$ docker run --name some-wordpress --link some-mysql:mysql -d wordpress $ docker run --name some-wordpress --link some-mysql:mysql -d wordpress
``` ```
启动 WordPress 容器时可以指定的一些环境参数包括: 启动 WordPress 容器时可以指定的一些环境参数包括:

View File

@ -12,7 +12,7 @@ CentOSCommunity Enterprise Operating System中文意思是社区企业
首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。 首先使用 `docker search` 命令来搜索标星至少为 25 的 CentOS 相关镜像。
```sh ```bash
$ docker search -f stars=25 centos $ docker search -f stars=25 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official... 2543 [OK] centos The official... 2543 [OK]
@ -21,7 +21,7 @@ jdeathe/centos-ssh 27 [OK]
使用 docker run 直接运行最新的 CentOS 镜像,并登录 bash。 使用 docker run 直接运行最新的 CentOS 镜像,并登录 bash。
```sh ```bash
$ docker run -it centos bash $ docker run -it centos bash
Unable to find image 'centos:latest' locally Unable to find image 'centos:latest' locally
latest: Pulling from library/centos latest: Pulling from library/centos
@ -42,7 +42,7 @@ Fedora 由 Fedora Project 社区开发,红帽公司赞助的 Linux 发行版
首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。 首先使用 `docker search` 命令来搜索标星至少为 2 的 Fedora 相关镜像,结果如下。
```sh ```bash
$ docker search -f stars=2 fedora $ docker search -f stars=2 fedora
NAME DESCRIPTION STARS OFFICIAL AUTOMATED NAME DESCRIPTION STARS OFFICIAL AUTOMATED
fedora Official Docker builds of Fedora 433 [OK] fedora Official Docker builds of Fedora 433 [OK]
@ -53,7 +53,7 @@ startx/fedora Simple container used for all startx based... 2
使用 docker run 命令直接运行 Fedora 官方镜像,并登录 bash。 使用 docker run 命令直接运行 Fedora 官方镜像,并登录 bash。
```sh ```bash
$ docker run -it fedora bash $ docker run -it fedora bash
Unable to find image 'fedora:latest' locally Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora latest: Pulling from library/fedora

View File

@ -67,7 +67,7 @@ CoreOS 团队还推出了很多有益的工具,包括 etcd, fleet, flannel 等
如果连接成功,则读者可以看到命令行页面,读者在命令行中查看 Docker 的版本信息: 如果连接成功,则读者可以看到命令行页面,读者在命令行中查看 Docker 的版本信息:
```sh ```bash
$ docker version $ docker version
``` ```
@ -83,7 +83,7 @@ $ docker version
如下所示: 如下所示:
```sh ```bash
$ ssh -i ~/insecure_ssh_key core@192.168.6.153 $ ssh -i ~/insecure_ssh_key core@192.168.6.153
CoreOS (alpha) CoreOS (alpha)
core@localhost ~ $ ls core@localhost ~ $ ls
@ -113,4 +113,3 @@ core@localhost ~ $
* `CoreOS` 官网:`https://coreos.com/` * `CoreOS` 官网:`https://coreos.com/`
* `CoreOS` 官方仓库:`https://github.com/coreos/` * `CoreOS` 官方仓库:`https://github.com/coreos/`

View File

@ -11,11 +11,11 @@ Debian 作为一个大的系统组织框架,其下有多种不同操作系统
众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。 众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。
#### 使用 Debian 官方镜像 #### 使用 Debian 官方镜像
读者可以使用 docker search 搜索 Docker Hub查找 Debian 镜像: 读者可以使用 docker search 搜索 Docker Hub查找 Debian 镜像:
```sh ```bash
$ docker search debian $ docker search debian
NAME DESCRIPTION STARS OFFICIAL AUTOMATED NAME DESCRIPTION STARS OFFICIAL AUTOMATED
debian Debian is... 1565 [OK] debian Debian is... 1565 [OK]
@ -28,7 +28,7 @@ armbuild/debian port of debian 8 [OK]
可以使用 docker run 直接运行 Debian 镜像。 可以使用 docker run 直接运行 Debian 镜像。
```sh ```bash
$ docker run -it debian bash $ docker run -it debian bash
root@668e178d8d69:/# cat /etc/issue root@668e178d8d69:/# cat /etc/issue
Debian GNU/Linux 8 Debian GNU/Linux 8
@ -46,7 +46,7 @@ Ubuntu 是一个以桌面应用为主的GNU/Linux操作系统其名称来自
Ubuntu 相关的镜像有很多,这里使用 `-s 10` 参数,只搜索那些被收藏 10 次以上的镜像。 Ubuntu 相关的镜像有很多,这里使用 `-s 10` 参数,只搜索那些被收藏 10 次以上的镜像。
```sh ```bash
$ docker search -s 10 ubuntu $ docker search -s 10 ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED NAME DESCRIPTION STARS OFFICIAL AUTOMATED
@ -69,7 +69,7 @@ tutum/ubuntu Ubuntu image with SSH access. For the root.
首先使用 `-ti` 参数启动容器,登录 bash查看 ubuntu 的发行版本号。 首先使用 `-ti` 参数启动容器,登录 bash查看 ubuntu 的发行版本号。
```sh ```bash
$ docker run -ti ubuntu:14.04 /bin/bash $ docker run -ti ubuntu:14.04 /bin/bash
root@7d93de07bf76:/# lsb_release -a root@7d93de07bf76:/# lsb_release -a
No LSB modules are available. No LSB modules are available.
@ -81,7 +81,7 @@ Codename: trusty
当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package` 当试图直接使用 `apt-get` 安装一个软件的时候,会提示 `E: Unable to locate package`
```sh ```bash
root@7d93de07bf76:/# apt-get install curl root@7d93de07bf76:/# apt-get install curl
Reading package lists... Done Reading package lists... Done
Building dependency tree Building dependency tree
@ -91,7 +91,7 @@ E: Unable to locate package curl
这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。 这并非系统不支持 `apt-get` 命令。Docker 镜像在制作时为了精简清除了 apt 仓库信息,因此需要先执行 `apt-get update` 命令来更新仓库信息。更新信息后即可成功通过 apt-get 命令来安装软件。
```sh ```bash
root@7d93de07bf76:/# apt-get update root@7d93de07bf76:/# apt-get update
Ign http://archive.ubuntu.com trusty InRelease Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease Ign http://archive.ubuntu.com trusty-updates InRelease
@ -103,7 +103,7 @@ Get:1 http://archive.ubuntu.com trusty Release.gpg [933 B]
首先,安装 curl 工具。 首先,安装 curl 工具。
```sh ```bash
root@7d93de07bf76:/# apt-get install curl root@7d93de07bf76:/# apt-get install curl
Reading package lists... Done Reading package lists... Done
Building dependency tree Building dependency tree
@ -122,7 +122,7 @@ curl: try 'curl --help' or 'curl --manual' for more information
接下来,再安装 apache 服务。 接下来,再安装 apache 服务。
```sh ```bash
root@7d93de07bf76:/# apt-get install -y apache2 root@7d93de07bf76:/# apt-get install -y apache2
Reading package lists... Done Reading package lists... Done
Building dependency tree Building dependency tree
@ -135,7 +135,7 @@ The following extra packages will be installed:
启动这个 apache 服务,然后使用 curl 来测试本地访问。 启动这个 apache 服务,然后使用 curl 来测试本地访问。
``` ```bash
root@7d93de07bf76:/# service apache2 start root@7d93de07bf76:/# service apache2 start
* Starting web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message * Starting web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
* *
@ -159,7 +159,7 @@ root@7d93de07bf76:/# curl 127.0.0.1
### 相关资源 ### 相关资源
* `Debian` 官网:`https://www.debian.org/` * `Debian` 官网:`https://www.debian.org/`
* `Neuro Debian` 官网:`http://neuro.debian.net/` * `Neuro Debian` 官网:`http://neuro.debian.net/`
* `Debian` 官方仓库:`https://github.com/Debian` * `Debian` 官方仓库:`https://github.com/Debian`
* `Debian` 官方镜像:`https://hub.docker.com/_/debian/` * `Debian` 官方镜像:`https://hub.docker.com/_/debian/`

View File

@ -5,7 +5,7 @@
在一切工作开始前,需要先设置好三个必要的文件。 在一切工作开始前,需要先设置好三个必要的文件。
第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: 第一步,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
``` ```docker
FROM python:2.7 FROM python:2.7
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
RUN mkdir /code RUN mkdir /code
@ -18,7 +18,7 @@ ADD . /code/
第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名 。 第二步,在 `requirements.txt` 文件里面写明需要安装的具体依赖包名 。
``` ```bash
Django Django
psycopg2 psycopg2
``` ```
@ -46,20 +46,20 @@ services:
现在我们就可以使用 `docker-compose run` 命令启动一个 Django 应用了。 现在我们就可以使用 `docker-compose run` 命令启动一个 Django 应用了。
``` ```bash
$ docker-compose run web django-admin.py startproject django_example . $ docker-compose run web django-admin.py startproject django_example .
``` ```
Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject django_example . ` 指令。 Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `django-admin.py startproject django_example . ` 指令。
这将在当前目录生成一个 Django 应用。 这将在当前目录生成一个 Django 应用。
``` ```bash
$ ls $ ls
Dockerfile docker-compose.yml django_example manage.py requirements.txt Dockerfile docker-compose.yml django_example manage.py requirements.txt
``` ```
首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。 首先,我们要为应用设置好数据库的连接信息。用以下内容替换 `django_example/settings.py` 文件中 `DATABASES = ...` 定义的节点内容。
``` ```bash
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ENGINE': 'django.db.backends.postgresql_psycopg2',
@ -73,7 +73,7 @@ DATABASES = {
这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。 这些信息是在 [postgres](https://registry.hub.docker.com/_/postgres/) Docker 镜像固定设置好的。
然后,运行 `docker-compose up` 然后,运行 `docker-compose up`
``` ```bash
Recreating myapp_db_1... Recreating myapp_db_1...
Recreating myapp_web_1... Recreating myapp_web_1...
Attaching to myapp_db_1, myapp_web_1 Attaching to myapp_db_1, myapp_web_1
@ -93,6 +93,6 @@ myapp_web_1 | Quit the server with CONTROL-C.
你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端运行以下命令即可: 你还可以在 Docker 上运行其它的管理命令,例如对于同步数据库结构这种事,在运行完 `docker-compose up` 后,在另外一个终端运行以下命令即可:
``` ```bash
$ docker-compose run web python manage.py syncdb $ docker-compose run web python manage.py syncdb
``` ```

View File

@ -11,12 +11,12 @@ Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直
执行安装命令: 执行安装命令:
```sh ```bash
$ sudo pip install -U docker-compose $ sudo pip install -U docker-compose
``` ```
可以看到类似如下输出,说明安装成功。 可以看到类似如下输出,说明安装成功。
```sh ```bash
Collecting docker-compose Collecting docker-compose
Downloading docker-compose-1.8.0.tar.gz (149kB): 149kB downloaded Downloading docker-compose-1.8.0.tar.gz (149kB): 149kB downloaded
... ...
@ -24,7 +24,7 @@ Successfully installed docker-compose cached-property requests texttable websock
``` ```
安装成功后,可以查看 `docker-compose` 命令的用法。 安装成功后,可以查看 `docker-compose` 命令的用法。
```sh ```bash
$ docker-compose -h $ docker-compose -h
Define and run multi-container applications with Docker. Define and run multi-container applications with Docker.
@ -65,7 +65,7 @@ Commands:
之后,可以添加 bash 补全命令。 之后,可以添加 bash 补全命令。
```sh ```bash
$ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
``` ```
@ -76,14 +76,14 @@ $ curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/complet
例如,在 Linux 和 macOS 平台上。 例如,在 Linux 和 macOS 平台上。
``` ```bash
$ sudo curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod a+x /usr/local/bin/docker-compose $ sudo chmod a+x /usr/local/bin/docker-compose
``` ```
可以使用 `docker-compose version` 命令来查看版本信息,以测试是否安装成功。 可以使用 `docker-compose version` 命令来查看版本信息,以测试是否安装成功。
```sh ```bash
$ docker-compose version $ docker-compose version
docker-compose version 1.8.0, build 94f7016 docker-compose version 1.8.0, build 94f7016
docker-py version: 1.9.0 docker-py version: 1.9.0
@ -95,14 +95,14 @@ OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014
Compose 既然是一个 Python 应用,自然也可以直接用容器来执行它。 Compose 既然是一个 Python 应用,自然也可以直接用容器来执行它。
```sh ```bash
$ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose $ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose $ chmod +x /usr/local/bin/docker-compose
``` ```
实际上,查看下载的 `run.sh` 脚本内容,如下 实际上,查看下载的 `run.sh` 脚本内容,如下
```sh ```bash
set -e set -e
VERSION="1.8.0" VERSION="1.8.0"
@ -151,12 +151,12 @@ exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES
### 卸载 ### 卸载
如果是二进制包方式安装的,删除二进制文件即可。 如果是二进制包方式安装的,删除二进制文件即可。
```sh ```bash
$ sudo rm /usr/local/bin/docker-compose $ sudo rm /usr/local/bin/docker-compose
``` ```
如果是通过 python pip 工具安装的,则可以执行如下命令删除。 如果是通过 python pip 工具安装的,则可以执行如下命令删除。
```sh ```bash
$ sudo pip uninstall docker-compose $ sudo pip uninstall docker-compose
``` ```

View File

@ -6,7 +6,7 @@
在一切工作开始前,需要先设置好三个必要的文件。 在一切工作开始前,需要先设置好三个必要的文件。
首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下: 首先,因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面,那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容。内容如下:
``` ```docker
FROM ruby FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp RUN mkdir /myapp
@ -18,7 +18,7 @@ ADD . /myapp
以上内容指定应用将使用安装了 Ruby、Bundler 以及其依赖件的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。 以上内容指定应用将使用安装了 Ruby、Bundler 以及其依赖件的镜像。更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) 和 [Dockerfile 使用](../dockerfile/README.md)。
下一步,我们需要一个引导加载 Rails 的文件 `Gemfile` 。 等一会儿它还会被 `rails new` 命令覆盖重写。 下一步,我们需要一个引导加载 Rails 的文件 `Gemfile` 。 等一会儿它还会被 `rails new` 命令覆盖重写。
``` ```bash
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'rails', '4.0.2' gem 'rails', '4.0.2'
``` ```
@ -44,12 +44,12 @@ services:
``` ```
所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。 所有文件就绪后,我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了。
``` ```bash
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle $ docker-compose run web rails new . --force --database=postgresql --skip-bundle
``` ```
Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。 Compose 会先使用 `Dockerfile` 为 web 服务创建一个镜像,接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令。一旦这个命令运行完后,应该就可以看一个崭新的应用已经生成了。
``` ```bash
$ ls $ ls
Dockerfile app docker-compose.yml tmp Dockerfile app docker-compose.yml tmp
Gemfile bin lib vendor Gemfile bin lib vendor
@ -59,18 +59,18 @@ Rakefile db test
``` ```
在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释,这样我们便可以使用 Javascript 运行环境: 在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释,这样我们便可以使用 Javascript 运行环境:
``` ```bash
gem 'therubyracer', platforms: :ruby gem 'therubyracer', platforms: :ruby
``` ```
现在我们已经有一个新的 `Gemfile` 文件,需要再重新创建镜像。(这个会步骤会改变 Dockerfile 文件本身,仅仅需要重建一次)。 现在我们已经有一个新的 `Gemfile` 文件,需要再重新创建镜像。(这个会步骤会改变 Dockerfile 文件本身,仅仅需要重建一次)。
``` ```bash
$ docker-compose build $ docker-compose build
``` ```
应用现在就可以启动了但配置还未完成。Rails 默认读取的数据库目标是 `localhost` ,我们需要手动指定容器的 `db` 。同样的,还需要把用户名修改成和 postgres 镜像预定的一致。 应用现在就可以启动了但配置还未完成。Rails 默认读取的数据库目标是 `localhost` ,我们需要手动指定容器的 `db` 。同样的,还需要把用户名修改成和 postgres 镜像预定的一致。
打开最新生成的 `database.yml` 文件。用以下内容替换: 打开最新生成的 `database.yml` 文件。用以下内容替换:
``` ```bash
development: &default development: &default
adapter: postgresql adapter: postgresql
encoding: unicode encoding: unicode
@ -86,19 +86,19 @@ test:
``` ```
现在就可以启动应用了。 现在就可以启动应用了。
``` ```bash
$ docker-compose up $ docker-compose up
``` ```
如果一切正常,你应该可以看到 PostgreSQL 的输出,几秒后可以看到这样的重复信息: 如果一切正常,你应该可以看到 PostgreSQL 的输出,几秒后可以看到这样的重复信息:
``` ```bash
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1 myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1
myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu] myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000 myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000
``` ```
最后, 我们需要做的是创建数据库,打开另一个终端,运行: 最后, 我们需要做的是创建数据库,打开另一个终端,运行:
``` ```bash
$ docker-compose run web rake db:create $ docker-compose run web rake db:create
``` ```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。 这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了。

View File

@ -66,7 +66,7 @@ cap_drop:
覆盖容器启动后默认执行的命令。 覆盖容器启动后默认执行的命令。
```sh ```bash
command: echo "hello world" command: echo "hello world"
``` ```
@ -102,7 +102,7 @@ devices:
自定义 DNS 服务器。可以是一个值,也可以是一个列表。 自定义 DNS 服务器。可以是一个值,也可以是一个列表。
```sh ```bash
dns: 8.8.8.8 dns: 8.8.8.8
dns: dns:
- 8.8.8.8 - 8.8.8.8
@ -113,7 +113,7 @@ dns:
配置 DNS 搜索域。可以是一个值,也可以是一个列表。 配置 DNS 搜索域。可以是一个值,也可以是一个列表。
```sh ```bash
dns_search: example.com dns_search: example.com
dns_search: dns_search:
- domain1.example.com - domain1.example.com
@ -137,7 +137,7 @@ dockerfile: Dockerfile-alternate
如果有变量名称与 `environment` 指令冲突,则按照惯例,以后者为准。 如果有变量名称与 `environment` 指令冲突,则按照惯例,以后者为准。
```sh ```bash
env_file: .env env_file: .env
env_file: env_file:
@ -148,7 +148,7 @@ env_file:
环境变量文件中每一行必须符合格式,支持 `#` 开头的注释行。 环境变量文件中每一行必须符合格式,支持 `#` 开头的注释行。
```sh ```bash
# common.env: Set development environment # common.env: Set development environment
PROG_ENV=development PROG_ENV=development
``` ```
@ -178,7 +178,7 @@ environment:
`http://yaml.org/type/bool.html` 中给出了这些特定词汇,包括 `http://yaml.org/type/bool.html` 中给出了这些特定词汇,包括
```sh ```bash
y|Y|yes|Yes|YES|n|N|no|No|NO y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE |true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF |on|On|ON|off|Off|OFF
@ -190,7 +190,7 @@ environment:
仅可以指定内部端口为参数 仅可以指定内部端口为参数
```sh ```bash
expose: expose:
- "3000" - "3000"
- "8000" - "8000"
@ -200,7 +200,7 @@ expose:
基于其它模板文件进行扩展。 基于其它模板文件进行扩展。
例如我们已经有了一个 webapp 服务,定义一个基础模板文件为 `common.yml` 例如我们已经有了一个 webapp 服务,定义一个基础模板文件为 `common.yml`
```sh ```bash
# common.yml # common.yml
webapp: webapp:
build: ./webapp build: ./webapp
@ -210,7 +210,7 @@ webapp:
``` ```
再编写一个新的 `development.yml` 文件,使用 `common.yml` 中的 webapp 服务进行扩展。 再编写一个新的 `development.yml` 文件,使用 `common.yml` 中的 webapp 服务进行扩展。
```sh ```bash
# development.yml # development.yml
web: web:
extends: extends:
@ -255,7 +255,7 @@ extra_hosts:
``` ```
会在启动后的服务容器中 `/etc/hosts` 文件中添加如下两条条目。 会在启动后的服务容器中 `/etc/hosts` 文件中添加如下两条条目。
```sh ```bash
8.8.8.8 googledns 8.8.8.8 googledns
52.1.157.61 dockerhub 52.1.157.61 dockerhub
``` ```
@ -265,7 +265,7 @@ extra_hosts:
指定为镜像名称或镜像 ID。如果镜像在本地不存在`Compose` 将会尝试拉去这个镜像。 指定为镜像名称或镜像 ID。如果镜像在本地不存在`Compose` 将会尝试拉去这个镜像。
例如: 例如:
```sh ```bash
image: ubuntu image: ubuntu
image: orchardup/postgresql image: orchardup/postgresql
image: a4bc65fd image: a4bc65fd
@ -284,7 +284,7 @@ labels:
链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 `SERVICE:ALIAS` 格式都可以。 链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 `SERVICE:ALIAS` 格式都可以。
```sh ```bash
links: links:
- db - db
- db:database - db:database
@ -293,7 +293,7 @@ links:
使用的别名将会自动在服务容器中的 `/etc/hosts` 里创建。例如: 使用的别名将会自动在服务容器中的 `/etc/hosts` 里创建。例如:
```sh ```bash
172.17.2.186 db 172.17.2.186 db
172.17.2.186 database 172.17.2.186 database
172.17.2.187 redis 172.17.2.187 redis
@ -326,7 +326,7 @@ log_opt:
设置网络模式。使用和 `docker client``--net` 参数一样的值。 设置网络模式。使用和 `docker client``--net` 参数一样的值。
```sh ```bash
net: "bridge" net: "bridge"
net: "none" net: "none"
net: "container:[name or id]" net: "container:[name or id]"
@ -336,7 +336,7 @@ net: "host"
### `pid` ### `pid`
跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
```sh ```bash
pid: "host" pid: "host"
``` ```
@ -409,7 +409,7 @@ volume_driver: mydriver
从另一个服务或容器挂载它的数据卷。 从另一个服务或容器挂载它的数据卷。
```sh ```bash
volumes_from: volumes_from:
- service_name - service_name
- container_name - container_name
@ -493,4 +493,4 @@ db:
image: "mongo:${MONGO_VERSION}" image: "mongo:${MONGO_VERSION}"
``` ```
如果执行 `MONGO_VERSION=3.0 docker-compose up` 则会启动一个 `mongo:3.2` 镜像的容器;如果执行 `MONGO_VERSION=2.8 docker-compose up` 则会启动一个 `mongo:2.8` 镜像的容器。 如果执行 `MONGO_VERSION=3.0 docker-compose up` 则会启动一个 `mongo:3.2` 镜像的容器;如果执行 `MONGO_VERSION=2.8 docker-compose up` 则会启动一个 `mongo:2.8` 镜像的容器。

View File

@ -7,21 +7,21 @@
所需要的命令主要为 `docker run` 所需要的命令主要为 `docker run`
例如,下面的命令输出一个 “Hello World”之后终止容器。 例如,下面的命令输出一个 “Hello World”之后终止容器。
``` ```bash
$ docker run ubuntu:14.04 /bin/echo 'Hello world' $ docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world Hello world
``` ```
这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。 这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。
下面的命令则启动一个 bash 终端,允许用户进行交互。 下面的命令则启动一个 bash 终端,允许用户进行交互。
``` ```bash
$ docker run -t -i ubuntu:14.04 /bin/bash $ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/# root@af8bae53bdd3:/#
``` ```
其中,`-t` 选项让Docker分配一个伪终端pseudo-tty并绑定到容器的标准输入上 `-i` 则让容器的标准输入保持打开。 其中,`-t` 选项让Docker分配一个伪终端pseudo-tty并绑定到容器的标准输入上 `-i` 则让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令,例如 在交互模式下,用户可以通过所创建的终端来输入命令,例如
``` ```bash
root@af8bae53bdd3:/# pwd root@af8bae53bdd3:/# pwd
/ /
root@af8bae53bdd3:/# ls root@af8bae53bdd3:/# ls
@ -42,7 +42,7 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr
可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。 可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps``top` 来查看进程信息。 容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps``top` 来查看进程信息。
``` ```bash
root@ba267838cc1b:/# ps root@ba267838cc1b:/# ps
PID TTY TIME CMD PID TTY TIME CMD
1 ? 00:00:00 bash 1 ? 00:00:00 bash

View File

@ -10,7 +10,7 @@ CoreOS的第一个重要组件就是使用etcd来实现的服务发现。
例如: 例如:
``` ```yml
#cloud-config #cloud-config
hostname: coreos0 hostname: coreos0
@ -51,7 +51,7 @@ Fleet通过接受systemd单元文件来工作同时在你集群的机器上
首先让我们构建一个简单的可以运行docker容器的systemd单元。把这个文件保存在home目录并命名为hello.service 首先让我们构建一个简单的可以运行docker容器的systemd单元。把这个文件保存在home目录并命名为hello.service
``` ```yml
hello.service hello.service
[Unit] [Unit]
@ -69,7 +69,7 @@ ExecStop=/usr/bin/docker stop hello
然后,读取并启动这个单元: 然后,读取并启动这个单元:
``` ```yml
$ fleetctl load hello.service $ fleetctl load hello.service
=> Unit hello.service loaded on 8145ebb7.../172.17.8.105 => Unit hello.service loaded on 8145ebb7.../172.17.8.105
$ fleetctl start hello.service $ fleetctl start hello.service
@ -80,7 +80,7 @@ $ fleetctl start hello.service
下面我们查看下它的状态: 下面我们查看下它的状态:
``` ```yml
$ fleetctl status hello.service $ fleetctl status hello.service
● hello.service - My Service ● hello.service - My Service
Loaded: loaded (/run/fleet/units/hello.service; linked-runtime) Loaded: loaded (/run/fleet/units/hello.service; linked-runtime)
@ -97,7 +97,7 @@ Jun 04 19:05:06 core-01 bash[27503]: Hello World
我们可以停止容器: 我们可以停止容器:
``` ```yml
fleetctl destroy hello.service fleetctl destroy hello.service
``` ```

View File

@ -20,21 +20,21 @@
首先,获取模板配置文件 首先,获取模板配置文件
``` ```bash
git clone https://github.com/coreos/coreos-vagrant $ git clone https://github.com/coreos/coreos-vagrant
cd coreos-vagrant $ cd coreos-vagrant
cp user-data.sample user-data $ cp user-data.sample user-data
``` ```
获取新的token 获取新的token
``` ```bash
curl https://discovery.etcd.io/new $ curl https://discovery.etcd.io/new
``` ```
把获取的token放到user-data文件中示例如下 把获取的token放到user-data文件中示例如下
``` ```yml
#cloud-config #cloud-config
coreos: coreos:
@ -50,7 +50,7 @@ coreos:
复制文件 复制文件
``` ```bash
cp config.rb.sample config.rb cp config.rb.sample config.rb
``` ```
@ -58,7 +58,7 @@ cp config.rb.sample config.rb
启动集群 启动集群
``` ```bash
vagrant up vagrant up
=> =>
Bringing machine 'core-01' up with 'virtualbox' provider... Bringing machine 'core-01' up with 'virtualbox' provider...
@ -74,13 +74,13 @@ Bringing machine 'core-03' up with 'virtualbox' provider...
添加ssh的公匙 添加ssh的公匙
``` ```bash
ssh-add ~/.vagrant.d/insecure_private_key ssh-add ~/.vagrant.d/insecure_private_key
``` ```
连接集群中的第一台机器 连接集群中的第一台机器
``` ```bash
vagrant ssh core-01 -- -A vagrant ssh core-01 -- -A
``` ```
@ -88,7 +88,7 @@ vagrant ssh core-01 -- -A
使用fleet来查看机器运行状况 使用fleet来查看机器运行状况
``` ```bash
fleetctl list-machines fleetctl list-machines
=> =>
MACHINE IP METADATA MACHINE IP METADATA
@ -99,4 +99,4 @@ cb35b356... 172.17.8.103 -
如果你也看到了如上类似的信息,恭喜,本地基于三台机器的集群已经成功启动,是不是很简单。 如果你也看到了如上类似的信息,恭喜,本地基于三台机器的集群已经成功启动,是不是很简单。
那么之后你就可以基于CoreOS的三大工具做任务分发分布式存储等很多功能了。 那么之后你就可以基于CoreOS的三大工具做任务分发分布式存储等很多功能了。

View File

@ -6,7 +6,7 @@ etcd 项目二进制发行包中已经包含了 etcdctl 工具,没有的话,
etcdctl 支持如下的命令,大体上分为数据库操作和非数据库操作两类,后面将分别进行解释。 etcdctl 支持如下的命令,大体上分为数据库操作和非数据库操作两类,后面将分别进行解释。
``` ```bash
$ etcdctl -h $ etcdctl -h
NAME: NAME:
etcdctl - A simple command line client for etcd. etcdctl - A simple command line client for etcd.
@ -55,12 +55,12 @@ etcd 在键的组织上采用了层次化的空间结构(类似于文件系统
#### set #### set
指定某个键的值。例如 指定某个键的值。例如
``` ```bash
$ etcdctl set /testdir/testkey "Hello world" $ etcdctl set /testdir/testkey "Hello world"
Hello world Hello world
``` ```
支持的选项包括: 支持的选项包括:
``` ```bash
--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0则永不超时 --ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0则永不超时
--swap-with-value value 若该键现在的值是 value则进行设置操作 --swap-with-value value 若该键现在的值是 value则进行设置操作
--swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作 --swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作
@ -68,7 +68,7 @@ Hello world
#### get #### get
获取指定键的值。例如 获取指定键的值。例如
``` ```bash
$ etcdctl set testkey hello $ etcdctl set testkey hello
hello hello
$ etcdctl update testkey world $ etcdctl update testkey world
@ -76,20 +76,20 @@ world
``` ```
当键不存在时,则会报错。例如 当键不存在时,则会报错。例如
``` ```bash
$ etcdctl get testkey2 $ etcdctl get testkey2
Error: 100: Key not found (/testkey2) [1] Error: 100: Key not found (/testkey2) [1]
``` ```
支持的选项为 支持的选项为
``` ```bash
--sort 对结果进行排序 --sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性 --consistent 将请求发给主节点,保证获取内容的一致性
``` ```
#### update #### update
当键存在时,更新值内容。例如 当键存在时,更新值内容。例如
``` ```bash
$ etcdctl set testkey hello $ etcdctl set testkey hello
hello hello
$ etcdctl update testkey world $ etcdctl update testkey world
@ -97,46 +97,44 @@ world
``` ```
当键不存在时,则会报错。例如 当键不存在时,则会报错。例如
``` ```bash
$ etcdctl update testkey2 world $ etcdctl update testkey2 world
Error: 100: Key not found (/testkey2) [1] Error: 100: Key not found (/testkey2) [1]
``` ```
支持的选项为 支持的选项为
``` ```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时 --ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
``` ```
#### rm #### rm
删除某个键值。例如 删除某个键值。例如
``` ```bash
$ etcdctl rm testkey $ etcdctl rm testkey
``` ```
当键不存在时,则会报错。例如 当键不存在时,则会报错。例如
``` ```bash
$ etcdctl rm testkey2 $ etcdctl rm testkey2
Error: 100: Key not found (/testkey2) [8] Error: 100: Key not found (/testkey2) [8]
``` ```
支持的选项为 支持的选项为
``` ```bash
--dir 如果键是个空目录或者键值对则删除 --dir 如果键是个空目录或者键值对则删除
--recursive 删除目录和所有子键 --recursive 删除目录和所有子键
--with-value 检查现有的值是否匹配 --with-value 检查现有的值是否匹配
--with-index '0' 检查现有的 index 是否匹配 --with-index '0' 检查现有的 index 是否匹配
``` ```
#### mk #### mk
如果给定的键不存在,则创建一个新的键值。例如 如果给定的键不存在,则创建一个新的键值。例如
``` ```bash
$ etcdctl mk /testdir/testkey "Hello world" $ etcdctl mk /testdir/testkey "Hello world"
Hello world Hello world
``` ```
当键存在的时候,执行该命令会报错,例如 当键存在的时候,执行该命令会报错,例如
``` ```bash
$ etcdctl set testkey "Hello world" $ etcdctl set testkey "Hello world"
Hello world Hello world
$ ./etcdctl mk testkey "Hello world" $ ./etcdctl mk testkey "Hello world"
@ -144,24 +142,23 @@ Error: 105: Key already exists (/testkey) [2]
``` ```
支持的选项为 支持的选项为
``` ```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时 --ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
``` ```
#### mkdir #### mkdir
如果给定的键目录不存在,则创建一个新的键目录。例如 如果给定的键目录不存在,则创建一个新的键目录。例如
``` ```bash
$ etcdctl mkdir testdir $ etcdctl mkdir testdir
``` ```
当键目录存在的时候,执行该命令会报错,例如 当键目录存在的时候,执行该命令会报错,例如
``` ```bash
$ etcdctl mkdir testdir $ etcdctl mkdir testdir
$ etcdctl mkdir testdir $ etcdctl mkdir testdir
Error: 105: Key already exists (/testdir) [7] Error: 105: Key already exists (/testdir) [7]
``` ```
支持的选项为 支持的选项为
``` ```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时 --ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
``` ```
@ -170,14 +167,14 @@ Error: 105: Key already exists (/testdir) [7]
创建一个键目录,无论存在与否。 创建一个键目录,无论存在与否。
支持的选项为 支持的选项为
``` ```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时 --ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
``` ```
#### updatedir #### updatedir
更新一个已经存在的目录。 更新一个已经存在的目录。
支持的选项为 支持的选项为
``` ```bash
--ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时 --ttl '0' 超时时间(单位为秒),不配置(默认为 0则永不超时
``` ```
@ -185,7 +182,7 @@ Error: 105: Key already exists (/testdir) [7]
删除一个空目录,或者键值对。 删除一个空目录,或者键值对。
若目录不空,会报错 若目录不空,会报错
``` ```bash
$ etcdctl set /dir/testkey hi $ etcdctl set /dir/testkey hi
hi hi
$ etcdctl rmdir /dir $ etcdctl rmdir /dir
@ -196,7 +193,7 @@ Error: 108: Directory not empty (/dir) [13]
列出目录(默认为根目录)下的键或者子目录,默认不显示子目录中内容。 列出目录(默认为根目录)下的键或者子目录,默认不显示子目录中内容。
例如 例如
``` ```bash
$ ./etcdctl set testkey 'hi' $ ./etcdctl set testkey 'hi'
hi hi
$ ./etcdctl set dir/test 'hello' $ ./etcdctl set dir/test 'hello'
@ -209,7 +206,7 @@ $ ./etcdctl ls dir
``` ```
支持的选项包括 支持的选项包括
``` ```bash
--sort 将输出结果排序 --sort 将输出结果排序
--recursive 如果目录下有子目录,则递归输出其中的内容 --recursive 如果目录下有子目录,则递归输出其中的内容
-p 对于输出为目录,在最后添加 `/` 进行区分 -p 对于输出为目录,在最后添加 `/` 进行区分
@ -221,7 +218,7 @@ $ ./etcdctl ls dir
备份 etcd 的数据。 备份 etcd 的数据。
支持的选项包括 支持的选项包括
``` ```bash
--data-dir etcd 的数据目录 --data-dir etcd 的数据目录
--backup-dir 备份到指定路径 --backup-dir 备份到指定路径
``` ```
@ -229,13 +226,13 @@ $ ./etcdctl ls dir
监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。 监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。
例如,用户更新 testkey 键值为 Hello world。 例如,用户更新 testkey 键值为 Hello world。
``` ```bash
$ etcdctl watch testkey $ etcdctl watch testkey
Hello world Hello world
``` ```
支持的选项包括 支持的选项包括
``` ```bash
--forever 一直监测,直到用户按 `CTRL+C` 退出 --forever 一直监测,直到用户按 `CTRL+C` 退出
--after-index '0' 在指定 index 之前一直监测 --after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值 --recursive 返回所有的键值和子键值
@ -244,7 +241,7 @@ Hello world
监测一个键值的变化,一旦键值发生更新,就执行给定命令。 监测一个键值的变化,一旦键值发生更新,就执行给定命令。
例如,用户更新 testkey 键值。 例如,用户更新 testkey 键值。
``` ```bash
$etcdctl exec-watch testkey -- sh -c 'ls' $etcdctl exec-watch testkey -- sh -c 'ls'
default.etcd default.etcd
Documentation Documentation
@ -256,7 +253,7 @@ README.md
``` ```
支持的选项包括 支持的选项包括
``` ```bash
--after-index '0' 在指定 index 之前一直监测 --after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值 --recursive 返回所有的键值和子键值
``` ```
@ -265,7 +262,7 @@ README.md
通过 list、add、remove 命令列出、添加、删除 etcd 实例到 etcd 集群中。 通过 list、add、remove 命令列出、添加、删除 etcd 实例到 etcd 集群中。
例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。 例如本地启动一个 etcd 服务实例后,可以用如下命令进行查看。
``` ```bash
$ etcdctl member list $ etcdctl member list
ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001 ce2a822cea30bfca: name=default peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://localhost:2379,http://localhost:4001

View File

@ -16,7 +16,7 @@ $ touch Dockerfile
其内容为: 其内容为:
```Dockerfile ```dockerfile
FROM nginx FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
``` ```
@ -35,7 +35,7 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
除了选择现有镜像为基础镜像外Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。 除了选择现有镜像为基础镜像外Docker 还存在一个特殊的镜像,名为 `scratch`。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
```Dockerfile ```dockerfile
FROM scratch FROM scratch
... ...
``` ```
@ -58,7 +58,7 @@ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
既然 `RUN` 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样: 既然 `RUN` 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样:
```Dockerfile ```dockerfile
FROM debian:jessie FROM debian:jessie
RUN apt-get update RUN apt-get update
@ -79,7 +79,7 @@ RUN make -C /usr/src/redis install
上面的 `Dockerfile` 正确的写法应该是这样: 上面的 `Dockerfile` 正确的写法应该是这样:
```Dockerfile ```dockerfile
FROM debian:jessie FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \ RUN buildDeps='gcc libc6-dev make' \

View File

@ -37,7 +37,7 @@
节点并非Kubernetes创建而是由云平台创建或者就是物理机器、虚拟机。在Kubernetes中节点仅仅是一条记录节点创建之后Kubernetes会检查其是否可用。在Kubernetes中节点用如下结构保存 节点并非Kubernetes创建而是由云平台创建或者就是物理机器、虚拟机。在Kubernetes中节点仅仅是一条记录节点创建之后Kubernetes会检查其是否可用。在Kubernetes中节点用如下结构保存
``` ```json
{ {
"id": "10.1.2.3", "id": "10.1.2.3",
"kind": "Minion", "kind": "Minion",

View File

@ -18,14 +18,14 @@ Docker 的 Registry 利用配置文件提供了一些仓库的模板flavor
用户也可以添加自定义的模版段。 用户也可以添加自定义的模版段。
默认情况下使用的模板是 `dev`,要使用某个模板作为默认值,可以添加 `SETTINGS_FLAVOR` 到环境变量中,例如 默认情况下使用的模板是 `dev`,要使用某个模板作为默认值,可以添加 `SETTINGS_FLAVOR` 到环境变量中,例如
``` ```bash
export SETTINGS_FLAVOR=dev export SETTINGS_FLAVOR=dev
``` ```
另外,配置文件中支持从环境变量中加载值,语法格式为 `_env:VARIABLENAME[:DEFAULT]` 另外,配置文件中支持从环境变量中加载值,语法格式为 `_env:VARIABLENAME[:DEFAULT]`
### 示例配置 ### 示例配置
``` ```yml
common: common:
loglevel: info loglevel: info
search_backend: "_env:SEARCH_BACKEND:" search_backend: "_env:SEARCH_BACKEND:"

View File

@ -8,12 +8,12 @@
### 安装运行 docker-registry ### 安装运行 docker-registry
#### 容器运行 #### 容器运行
在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。 在安装了 Docker 后,可以通过获取官方 registry 镜像来运行。
``` ```bash
$ docker run -d -p 5000:5000 registry $ docker run -d -p 5000:5000 registry
``` ```
这将使用官方的 registry 镜像来启动本地的私有仓库。 这将使用官方的 registry 镜像来启动本地的私有仓库。
用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。 用户可以通过指定参数来配置私有仓库位置,例如配置镜像存储到 Amazon S3 服务。
``` ```bash
$ docker run \ $ docker run \
-e SETTINGS_FLAVOR=s3 \ -e SETTINGS_FLAVOR=s3 \
-e AWS_BUCKET=acme-docker \ -e AWS_BUCKET=acme-docker \
@ -25,7 +25,7 @@ $ docker run \
registry registry
```` ````
此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。 此外,还可以指定本地路径(如 `/home/user/registry-conf` )下的配置文件。
``` ```bash
$ docker run -d \ $ docker run -d \
-p 5000:5000 \ -p 5000:5000 \
-v /home/user/registry-conf:/registry-conf \ -v /home/user/registry-conf:/registry-conf \
@ -34,7 +34,7 @@ $ docker run -d \
``` ```
默认情况下,仓库会被创建在容器的 `/var/lib/registry `v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。 默认情况下,仓库会被创建在容器的 `/var/lib/registry `v1 中是`/tmp/registry`)下。可以通过 `-v` 参数来将镜像文件存放在本地的指定路径。
例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。 例如下面的例子将上传的镜像放到 `/opt/data/registry` 目录。
``` ```bash
$ docker run -d \ $ docker run -d \
-p 5000:5000 \ -p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \ -v /opt/data/registry:/var/lib/registry \
@ -45,7 +45,7 @@ $ docker run -d \
创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000` 创建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然后推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址为 `192.168.7.26:5000`
先在本机查看已有的镜像。 先在本机查看已有的镜像。
``` ```bash
$ docker images $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
@ -53,7 +53,7 @@ ubuntu 14.04 ba5877dc9bec 6 week
``` ```
使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。 使用`docker tag` 将 `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式为 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
``` ```bash
$ docker tag ba58 192.168.7.26:5000/test $ docker tag ba58 192.168.7.26:5000/test
root ~ # docker images root ~ # docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@ -62,7 +62,7 @@ ubuntu latest ba5877dc9bec 6 week
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB 192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
``` ```
使用 `docker push` 上传标记的镜像。 使用 `docker push` 上传标记的镜像。
``` ```bash
$ docker push 192.168.7.26:5000/test $ docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1) The push refers to a repository [192.168.7.26:5000/test] (len: 1)
Sending image list Sending image list
@ -76,14 +76,14 @@ Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest} Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
``` ```
用 curl 查看仓库中的镜像。 用 curl 查看仓库中的镜像。
``` ```bash
$ curl http://192.168.7.26:5000/v1/search $ curl http://192.168.7.26:5000/v1/search
{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]} {"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}
``` ```
这里可以看到 `{"description": "", "name": "library/test"}`,表明镜像已经被成功上传了。 这里可以看到 `{"description": "", "name": "library/test"}`,表明镜像已经被成功上传了。
现在可以到另外一台机器去下载这个镜像。 现在可以到另外一台机器去下载这个镜像。
``` ```bash
$ docker pull 192.168.7.26:5000/test $ docker pull 192.168.7.26:5000/test
Pulling repository 192.168.7.26:5000/test Pulling repository 192.168.7.26:5000/test
ba5877dc9bec: Download complete ba5877dc9bec: Download complete
@ -104,7 +104,7 @@ REPOSITORY TAG IMAGE ID CREAT
```yaml ```yaml
version: "3.4" version: "3.4"
services: services:
ubuntu: ubuntu:
image: 127.0.0.1:5000/ubuntu:latest image: 127.0.0.1:5000/ubuntu:latest
centos: centos:

View File

@ -14,14 +14,14 @@
`192.168.0.2` 节点启动管理服务,管理 token://946d65606f7c2f49766e4dddac5b4365 的集群。 `192.168.0.2` 节点启动管理服务,管理 token://946d65606f7c2f49766e4dddac5b4365 的集群。
```sh ```bash
$ docker run -d -p 12375:2375 swarm manage --strategy "spread" token://946d65606f7c2f49766e4dddac5b4365 $ docker run -d -p 12375:2375 swarm manage --strategy "spread" token://946d65606f7c2f49766e4dddac5b4365
c6f25e6e6abbe45c8bcf75ac674f2b64d5f31a5c6070d64ba954a0309b197930 c6f25e6e6abbe45c8bcf75ac674f2b64d5f31a5c6070d64ba954a0309b197930
``` ```
列出集群中节点。 列出集群中节点。
```sh ```bash
$ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365
192.168.0.3:2375 192.168.0.3:2375
192.168.0.2:2375 192.168.0.2:2375
@ -31,7 +31,7 @@ $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365
启动一个 ubuntu 容器。 启动一个 ubuntu 容器。
```sh ```bash
$ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1 $ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1
bac3dfda5306181140fc959969d738549d607bc598390f57bdd432d86f16f069 bac3dfda5306181140fc959969d738549d607bc598390f57bdd432d86f16f069
``` ```
@ -40,14 +40,14 @@ bac3dfda5306181140fc959969d738549d607bc598390f57bdd432d86f16f069
再次启动一个 ubuntu 容器。 再次启动一个 ubuntu 容器。
```sh ```bash
$ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1 $ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1
8247067ba3a31e0cb692a8373405f95920a10389ce3c2a07091408281695281c 8247067ba3a31e0cb692a8373405f95920a10389ce3c2a07091408281695281c
``` ```
查看它的位置,发现被调度到了另外一个节点:`192.168.0.2` 节点。 查看它的位置,发现被调度到了另外一个节点:`192.168.0.2` 节点。
```sh ```bash
$ docker -H 192.168.0.2:12375 ps $ docker -H 192.168.0.2:12375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8247067ba3a3 ubuntu:14.04 "ping 127.0.0.1" 1 minutes ago Up 1 minutes Host-2/sick_galileo 8247067ba3a3 ubuntu:14.04 "ping 127.0.0.1" 1 minutes ago Up 1 minutes Host-2/sick_galileo
@ -61,7 +61,7 @@ bac3dfda5306 ubuntu:14.04 "ping 127.0.0.1" 2 minutes ago
直接启动若干 ubuntu 容器,并查看它们的位置。 直接启动若干 ubuntu 容器,并查看它们的位置。
```sh ```bash
$ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1 $ docker -H 192.168.0.2:12375 run -d ubuntu:14.04 ping 127.0.0.1
$ docker -H 192.168.0.2:12375 ps $ docker -H 192.168.0.2:12375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@ -70,4 +70,4 @@ CONTAINER ID IMAGE COMMAND CREATED
99c5a092530a ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago Up 3 minutes Host-3/naughty_engelbart 99c5a092530a ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago Up 3 minutes Host-3/naughty_engelbart
4ab392c26eb2 ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago Up 3 minutes Host-3/thirsty_mclean 4ab392c26eb2 ubuntu:14.04 "ping 127.0.0.1" 3 minutes ago Up 3 minutes Host-3/thirsty_mclean
``` ```
可以看到,所有的容器都是分布在同一个节点(`192.168.0.3`)上运行的。 可以看到,所有的容器都是分布在同一个节点(`192.168.0.3`)上运行的。

View File

@ -17,7 +17,7 @@ Swarm 目前可以支持多种服务发现后端,这些后端功能上都是
首先,在 Swarm 管理节点(`192.168.0.2`)上新建一个文件,把要加入集群的机器的 Docker daemon 信息写入文件: 首先,在 Swarm 管理节点(`192.168.0.2`)上新建一个文件,把要加入集群的机器的 Docker daemon 信息写入文件:
```sh ```bash
$ tee /tmp/cluster_info <<-'EOF' $ tee /tmp/cluster_info <<-'EOF'
192.168.0.2:2375 192.168.0.2:2375
192.168.0.3:2375 192.168.0.3:2375
@ -26,13 +26,13 @@ EOF
然后,本地执行 `swarm manage` 命令,并指定服务发现机制为本地文件,注意因为是容器方式运行 manager需要将本地文件挂载到容器内。 然后,本地执行 `swarm manage` 命令,并指定服务发现机制为本地文件,注意因为是容器方式运行 manager需要将本地文件挂载到容器内。
```sh ```bash
$ docker run -d -p 12375:2375 -v /tmp/cluster_info:/tmp/cluster_info swarm manage file:///tmp/cluster_info $ docker run -d -p 12375:2375 -v /tmp/cluster_info:/tmp/cluster_info swarm manage file:///tmp/cluster_info
``` ```
接下来就可以通过使用 Swarm 服务来进行管理了,例如使用 info 查看所有节点的信息。 接下来就可以通过使用 Swarm 服务来进行管理了,例如使用 info 查看所有节点的信息。
```sh ```bash
$ docker -H 192.168.0.2:12375 info $ docker -H 192.168.0.2:12375 info
Containers: 18 Containers: 18
Images: 36 Images: 36
@ -62,30 +62,30 @@ Name: e71eb5f1d48b
快速部署一个 consul 服务的命令为: 快速部署一个 consul 服务的命令为:
```sh ```bash
$ docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap $ docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap
``` ```
之后创建 Swarm 的管理服务,指定使用 consul 服务,管理端口监听在本地的 4000 端口。 之后创建 Swarm 的管理服务,指定使用 consul 服务,管理端口监听在本地的 4000 端口。
```sh ```bash
$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager_ip>:4000 consul://<consul_ip>:8500 $ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager_ip>:4000 consul://<consul_ip>:8500
``` ```
Swarm 节点注册时候命令格式类似于: Swarm 节点注册时候命令格式类似于:
```sh ```bash
$ swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix> $ swarm join --advertise=<node_ip:2375> consul://<consul_addr>/<optional path prefix>
``` ```
对于 etcd 服务后端来说,节点注册时候命令格式类似于: 对于 etcd 服务后端来说,节点注册时候命令格式类似于:
```sh ```bash
$ swarm join --addr=<node_addr:2375> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix> $ swarm join --addr=<node_addr:2375> etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
``` ```
启动管理服务时候,格式类似于: 启动管理服务时候,格式类似于:
```sh ```bash
$ swarm manage -H tcp://<manager_ip>:4000 etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix> $ swarm manage -H tcp://<manager_ip>:4000 etcd://<etcd_addr1>,<etcd_addr2>/<optional path prefix>
``` ```
@ -94,4 +94,4 @@ $ swarm manage -H tcp://<manager_ip>:4000 etcd://<etcd_addr1>,<etcd_addr2>/<opti
例如: 例如:
* `192.168.0.[2:10]:2375` 代表 `192.168.0.2:2375` -- `192.168.0.10:2375` 一共 9 个地址; * `192.168.0.[2:10]:2375` 代表 `192.168.0.2:2375` -- `192.168.0.10:2375` 一共 9 个地址;
* `192.168.0.2:[2:9]375` 代表 `192.168.0.2:2375` -- `192.168.0.2:9375` 一共 8 个地址。 * `192.168.0.2:[2:9]375` 代表 `192.168.0.2:2375` -- `192.168.0.2:9375` 一共 8 个地址。

View File

@ -18,7 +18,7 @@
Swarm 会通过服务发现后端(此处为 DockerHub 提供)来获取一个唯一的由数字和字母组成的 token用来标识要管理的集群。 Swarm 会通过服务发现后端(此处为 DockerHub 提供)来获取一个唯一的由数字和字母组成的 token用来标识要管理的集群。
```sh ```bash
$ docker run --rm swarm create $ docker run --rm swarm create
946d65606f7c2f49766e4dddac5b4365 946d65606f7c2f49766e4dddac5b4365
``` ```
@ -31,7 +31,7 @@ $ docker run --rm swarm create
例如某台机器 IP 地址为 `192.168.0.2`,将其加入我们刚创建的 `946d65606f7c2f49766e4dddac5b4365` 集群,则可以通过: 例如某台机器 IP 地址为 `192.168.0.2`,将其加入我们刚创建的 `946d65606f7c2f49766e4dddac5b4365` 集群,则可以通过:
```sh ```bash
$ docker run --rm swarm join --addr=192.168.0.2:2375 token://946d65606f7c2f49766e4dddac5b4365 $ docker run --rm swarm join --addr=192.168.0.2:2375 token://946d65606f7c2f49766e4dddac5b4365
time="2015-12-09T08:59:43Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.2:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365" time="2015-12-09T08:59:43Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.2:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365"
... ...
@ -53,14 +53,14 @@ time="2015-12-09T08:59:43Z" level=info msg="Registering on the discovery service
仍然在节点 `192.168.0.2` 进行操作。由于我们是采用 Docker 容器形式启动 manager 服务,本地的 `2375` 端口已经被 Docker Daemon 占用。我们将 manager 服务监听端口映射到本地一个空闲的 `12375` 端口。 仍然在节点 `192.168.0.2` 进行操作。由于我们是采用 Docker 容器形式启动 manager 服务,本地的 `2375` 端口已经被 Docker Daemon 占用。我们将 manager 服务监听端口映射到本地一个空闲的 `12375` 端口。
```sh ```bash
$ docker run -d -p 12375:2375 swarm manage token://946d65606f7c2f49766e4dddac5b4365 $ docker run -d -p 12375:2375 swarm manage token://946d65606f7c2f49766e4dddac5b4365
1e1ca8c4117b6b7271efc693f9685b4e907d8dc95324350392b21e94b3cffd18 1e1ca8c4117b6b7271efc693f9685b4e907d8dc95324350392b21e94b3cffd18
``` ```
可以通过 `docker ps` 命令来查看启动的 swarm manager 服务容器。 可以通过 `docker ps` 命令来查看启动的 swarm manager 服务容器。
```sh ```bash
$ docker ps $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e1ca8c4117b swarm "/swarm manage token:" 11 seconds ago Up 10 seconds 0.0.0.0:12375->2375/tcp jovial_rosalind 1e1ca8c4117b swarm "/swarm manage token:" 11 seconds ago Up 10 seconds 0.0.0.0:12375->2375/tcp jovial_rosalind
@ -72,14 +72,14 @@ CONTAINER ID IMAGE COMMAND CREATED
集群启动成功以后,用户可以在任何一台节点上使用 `swarm list` 命令查看集群中的节点列表。例如 集群启动成功以后,用户可以在任何一台节点上使用 `swarm list` 命令查看集群中的节点列表。例如
```sh ```bash
$ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365
192.168.0.2:2375 192.168.0.2:2375
``` ```
显示正是之前用 `swarm join` 命令加入集群的节点的地址。 显示正是之前用 `swarm join` 命令加入集群的节点的地址。
我们在另外一台节点 `192.168.0.3` 上同样使用 `swarm join` 命令新加入一个节点: 我们在另外一台节点 `192.168.0.3` 上同样使用 `swarm join` 命令新加入一个节点:
```sh ```bash
$docker run --rm swarm join --addr=192.168.0.3:2375 token://946d65606f7c2f49766e4dddac5b4365 $docker run --rm swarm join --addr=192.168.0.3:2375 token://946d65606f7c2f49766e4dddac5b4365
time="2015-12-10T02:05:34Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.3:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365" time="2015-12-10T02:05:34Z" level=info msg="Registering on the discovery service every 20s..." addr="192.168.0.3:2375" discovery="token://946d65606f7c2f49766e4dddac5b4365"
... ...
@ -87,7 +87,7 @@ time="2015-12-10T02:05:34Z" level=info msg="Registering on the discovery service
再次使用 `swarm list` 命令查看集群中的节点列表信息,可以看到新加入的节点: 再次使用 `swarm list` 命令查看集群中的节点列表信息,可以看到新加入的节点:
```sh ```bash
$ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365 $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365
192.168.0.3:2375 192.168.0.3:2375
192.168.0.2:2375 192.168.0.2:2375
@ -102,14 +102,14 @@ $ docker run --rm swarm list token://946d65606f7c2f49766e4dddac5b4365
在任意节点上使用 `docker run` 来启动若干容器,例如 在任意节点上使用 `docker run` 来启动若干容器,例如
```sh ```bash
$docker -H 192.168.0.2:12375:12375 run -d ubuntu ping 127.0.0.1 $docker -H 192.168.0.2:12375:12375 run -d ubuntu ping 127.0.0.1
4c9bccbf86fb6e2243da58c1b15e9378fac362783a663426bbe7058eea84de46 4c9bccbf86fb6e2243da58c1b15e9378fac362783a663426bbe7058eea84de46
``` ```
使用 `ps` 命令查看集群中正在运行的容器。 使用 `ps` 命令查看集群中正在运行的容器。
```sh ```bash
$ docker -H 192.168.0.2:12375 ps $ docker -H 192.168.0.2:12375 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c9bccbf86fb ubuntu "ping 127.0.0.1" About a minute ago Up About a minute clever_wright 4c9bccbf86fb ubuntu "ping 127.0.0.1" About a minute ago Up About a minute clever_wright
@ -121,7 +121,7 @@ CONTAINER ID IMAGE COMMAND CREATED
使用 info 查看所有节点的信息。 使用 info 查看所有节点的信息。
```sh ```bash
$ docker -H 192.168.0.2:12375 info $ docker -H 192.168.0.2:12375 info
Containers: 18 Containers: 18
Images: 36 Images: 36
@ -158,7 +158,7 @@ Swarm 为了支持跨主机的网络,默认采用了 `overlay` 网络类型,
以 consul 服务为例,可能类似: 以 consul 服务为例,可能类似:
```sh ```bash
--cluster-store=consul://<consul 服务地址>:8500 --cluster-advertise=192.168.0.3:2375 --cluster-store=consul://<consul 服务地址>:8500 --cluster-advertise=192.168.0.3:2375
``` ```
@ -166,13 +166,13 @@ Swarm 为了支持跨主机的网络,默认采用了 `overlay` 网络类型,
首先,创建一个网络。 首先,创建一个网络。
```sh ```bash
$ docker -H 192.168.0.2:12375 network create swarm_network $ docker -H 192.168.0.2:12375 network create swarm_network
``` ```
查看网络,将看到一个 overlay 类型的网络。 查看网络,将看到一个 overlay 类型的网络。
```sh ```bash
$ docker -H 192.168.0.2:12375 network ls $ docker -H 192.168.0.2:12375 network ls
NETWORK ID NAME DRIVER NETWORK ID NAME DRIVER
6edf2d16ec97 swarm_network overlay 6edf2d16ec97 swarm_network overlay