mirror of
https://github.com/yeasy/docker_practice.git
synced 2024-12-25 14:38:54 +00:00
Fix #117
This commit is contained in:
parent
c3c3cf98cb
commit
7cbdf27d93
@ -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)
|
||||||
|
@ -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 ...
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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#
|
||||||
```
|
```
|
||||||
|
@ -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"'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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"'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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;`。
|
||||||
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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"'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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:/#
|
||||||
```
|
```
|
||||||
|
@ -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 容器时可以指定的一些环境参数包括:
|
||||||
|
@ -12,7 +12,7 @@ CentOS(Community 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
|
||||||
|
@ -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/`
|
||||||
|
|
||||||
|
@ -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/`
|
||||||
|
@ -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
|
||||||
```
|
```
|
||||||
|
@ -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
|
||||||
```
|
```
|
||||||
|
@ -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 端口了。
|
||||||
|
@ -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` 镜像的容器。
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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的三大工具做任务分发,分布式存储等很多功能了。
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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' \
|
||||||
|
@ -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",
|
||||||
|
@ -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:"
|
||||||
|
@ -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:
|
||||||
|
@ -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`)上运行的。
|
||||||
|
@ -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 个地址。
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user