Merge pull request #212 from khs1994/master

Fix code grammar indicator, update help docs
pull/217/merge
Baohua Yang 2017-11-14 11:16:53 +08:00 committed by GitHub
commit fcc6535910
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 208 additions and 143 deletions

View File

@ -2,7 +2,7 @@
* 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。 * 在 GitHub 上 `fork` 到自己的仓库,如 `docker_user/docker_practice`,然后 `clone` 到本地,并设置用户信息。
```sh ```bash
$ git clone git@github.com:docker_user/docker_practice.git $ git clone git@github.com:docker_user/docker_practice.git
$ cd docker_practice $ cd docker_practice
$ git config user.name "yourname" $ git config user.name "yourname"
@ -11,7 +11,7 @@
* 修改代码后提交,并推送到自己的仓库。 * 修改代码后提交,并推送到自己的仓库。
```sh ```bash
$ #do some change on the content $ #do some change on the content
$ git commit -am "Fix issue #1: change helo to hello" $ git commit -am "Fix issue #1: change helo to hello"
$ git push $ git push
@ -20,7 +20,7 @@
* 在 GitHub 网站上提交 pull request。 * 在 GitHub 网站上提交 pull request。
* 定期使用项目仓库内容更新自己仓库内容。 * 定期使用项目仓库内容更新自己仓库内容。
```sh ```bash
$ git remote add upstream https://github.com/yeasy/docker_practice $ git remote add upstream https://github.com/yeasy/docker_practice
$ git fetch upstream $ git fetch upstream
$ git checkout master $ git checkout master

47
.github/ISSUE_TEMPLATE.md vendored 100644
View File

@ -0,0 +1,47 @@
### your OS
<!--请选择你的系统版本-->
<!--select your os version-->
* [x] Linux
* [x] CentOS 7
* [ ] Ubuntu 14.04
* [ ] Ubuntu 16.04
* [ ] Ubuntu 17.04
* [ ] Ubuntu 17.10
* [ ] CoreOS
* [ ] Debian 7.7
* [ ] Debian 8
* [ ] Debian 9
* [ ] macOS
* [ ] Windows 10
### Docker CE Version
<!--如果你的 Docker 版本低于 17.09 请尽可能升级到该版本-->
<!--if Docker version under 17.09, please upgrade Docker to 17.09-->
* [x] 17.10 edge
* [ ] 17.09 stable
* [ ] 1.13.0
* [ ] 1.8.0
### Problem description
<!--描述你的问题,请贴出终端报错截图-->
<!--describe problem-->

View File

@ -0,0 +1,11 @@
<!--Thanks for your contribution. See [CONTRIBUTING](CONTRIBUTING.md)
for this project's contribution guidelines. Remove these comments
as you go. -->
### Proposed changes (optional)
<!--Tell us what you did and why-->
### Fix issues (optional)
<!--Tell us what issues you fixed-->

View File

@ -13,7 +13,7 @@
* pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice) * pdf 版本 [下载](https://www.gitbook.com/download/pdf/book/yeasy/docker_practice)
* epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice) * epub 版本 [下载](https://www.gitbook.com/download/epub/book/yeasy/docker_practice)
Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用 Linux 上最新版的 Docker (v17.10.0) 进行学习实践。欢迎参与维护项目:[如何贡献](contribute.md)。 Docker 自身仍在快速发展中,生态环境也在蓬勃成长。建议初学者使用 Linux 上最新版的 Docker (v17.10.0) 进行学习实践。欢迎参与维护项目:[如何贡献](.github/CONTRIBUTING.md)。
* [修订记录](revision.md) * [修订记录](revision.md)
* [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors) * [贡献者名单](https://github.com/yeasy/docker_practice/graphs/contributors)

View File

@ -2,7 +2,7 @@
* [前言](README.md) * [前言](README.md)
* [修订记录](revision.md) * [修订记录](revision.md)
* [如何贡献](contribute.md) * [如何贡献](.github/CONTRIBUTING.md)
* [Docker 简介](introduction/README.md) * [Docker 简介](introduction/README.md)
* [什么是 Docker](introduction/what.md) * [什么是 Docker](introduction/what.md)
* [为什么要用 Docker](introduction/why.md) * [为什么要用 Docker](introduction/why.md)

View File

@ -4,19 +4,20 @@
在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。 在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。
如果服务已经运行,那需要先停止服务,并删除旧的网桥。 如果服务已经运行,那需要先停止服务,并删除旧的网桥。
```
$ sudo service docker stop ```bash
$ sudo systemctl stop docker
$ sudo ip link set dev docker0 down $ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0 $ sudo brctl delbr docker0
``` ```
然后创建一个网桥 `bridge0` 然后创建一个网桥 `bridge0`
``` ```bash
$ sudo brctl addbr bridge0 $ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0 $ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up $ sudo ip link set dev bridge0 up
``` ```
查看确认网桥创建并启动。 查看确认网桥创建并启动。
``` ```bash
$ ip addr show bridge0 $ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default 4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
@ -24,9 +25,9 @@ $ ip addr show bridge0
valid_lft forever preferred_lft forever valid_lft forever preferred_lft forever
``` ```
配置 Docker 服务,默认桥接到创建的网桥上。 配置 Docker 服务,默认桥接到创建的网桥上。
``` ```bash
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker $ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start $ sudo systemctl start docker
``` ```
启动 Docker 服务。 启动 Docker 服务。
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。 新建一个容器,可以看到它已经桥接到了 `bridge0` 上。

View File

@ -6,18 +6,18 @@
解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。 解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。
首先启动 2 个容器: 首先启动 2 个容器:
``` ```bash
$ sudo docker run -i -t --rm --net=none base /bin/bash $ docker run -i -t --rm --net=none base /bin/bash
root@1f1f4c1f931a:/# root@1f1f4c1f931a:/#
$ sudo docker run -i -t --rm --net=none base /bin/bash $ docker run -i -t --rm --net=none base /bin/bash
root@12e343489d2f:/# root@12e343489d2f:/#
``` ```
找到进程号,然后创建网络命名空间的跟踪文件。 找到进程号,然后创建网络命名空间的跟踪文件。
``` ```bash
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a $ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989 2989
$ sudo docker inspect -f '{{.State.Pid}}' 12e343489d2f $ docker inspect -f '{{.State.Pid}}' 12e343489d2f
3004 3004
$ sudo mkdir -p /var/run/netns $ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989 $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
@ -25,7 +25,7 @@ $ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
``` ```
创建一对 `peer` 接口,然后配置路由 创建一对 `peer` 接口,然后配置路由
``` ```bash
$ sudo ip link add A type veth peer name B $ sudo ip link add A type veth peer name B
$ sudo ip link set A netns 2989 $ sudo ip link set A netns 2989

View File

@ -20,7 +20,7 @@
#### index.py #### index.py
编写一个 `index.py` 作为服务器文件,代码为 编写一个 `index.py` 作为服务器文件,代码为
```bash ```python
#!/usr/bin/python #!/usr/bin/python
#authors: yeasy.github.com #authors: yeasy.github.com
#date: 2013-07-05 #date: 2013-07-05
@ -99,7 +99,7 @@ $ touch index.html
#### Dockerfile #### Dockerfile
编写 `Dockerfile` 文件,内容为 编写 `Dockerfile` 文件,内容为
```bash ```docker
FROM python:2.7 FROM python:2.7
WORKDIR /code WORKDIR /code
ADD . /code ADD . /code
@ -194,8 +194,8 @@ compose-haproxy-web
└── index.py └── index.py
``` ```
在该目录下执行 `docker-compose up` 命令,会整合输出所有容器的输出。 在该目录下执行 `docker-compose up` 命令,会整合输出所有容器的输出。
``` ```bash
$sudo docker-compose up $ docker-compose up
Recreating composehaproxyweb_webb_1... Recreating composehaproxyweb_webb_1...
Recreating composehaproxyweb_webc_1... Recreating composehaproxyweb_webc_1...
Recreating composehaproxyweb_weba_1... Recreating composehaproxyweb_weba_1...

View File

@ -5,12 +5,12 @@
`docker attach` 是 Docker 自带的命令。下面示例如何使用该命令。 `docker attach` 是 Docker 自带的命令。下面示例如何使用该命令。
```bash ```bash
$ sudo docker run -idt ubuntu $ docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$sudo docker attach nostalgic_hypatia $ docker attach nostalgic_hypatia
root@243c32535da7:/# root@243c32535da7:/#
``` ```
@ -20,7 +20,7 @@ root@243c32535da7:/#
#### 安装 #### 安装
`nsenter` 工具在 util-linux 包2.23版本后包含。 `nsenter` 工具在 util-linux 包2.23版本后包含。
如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。
``` ```bash
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24; $ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses $ ./configure --without-ncurses
$ make nsenter && sudo cp nsenter /usr/local/bin $ make nsenter && sudo cp nsenter /usr/local/bin
@ -59,9 +59,9 @@ $ nsenter --target $pid --mount --uts --ipc --net --pid -- /usr/bin/env \
下面给出一个完整的例子。 下面给出一个完整的例子。
```bash ```bash
$ sudo docker run -idt ubuntu $ docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia 243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$ PID=$(docker-pid 243c32535da7) $ PID=$(docker-pid 243c32535da7)

View File

@ -2,24 +2,24 @@
###导出容器 ###导出容器
如果要导出本地某个容器,可以使用 `docker export` 命令。 如果要导出本地某个容器,可以使用 `docker export` 命令。
``` ```bash
$ docker ps -a $ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar $ docker export 7691a814370e > ubuntu.tar
``` ```
这样将导出容器快照到本地文件。 这样将导出容器快照到本地文件。
###导入容器快照 ###导入容器快照
可以使用 `docker import` 从容器快照文件中再导入为镜像,例如 可以使用 `docker import` 从容器快照文件中再导入为镜像,例如
``` ```bash
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 $ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker images $ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
``` ```
此外,也可以通过指定 URL 或者某个目录来导入,例如 此外,也可以通过指定 URL 或者某个目录来导入,例如
``` ```bash
$ docker import http://example.com/exampleimage.tgz example/imagerepo $ docker import http://example.com/exampleimage.tgz example/imagerepo
``` ```

View File

@ -5,8 +5,8 @@
例如对于上一章节中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 来退出终端时,所创建的容器立刻终止。 例如对于上一章节中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用 `docker ps -a` 命令看到。例如 终止状态的容器可以用 `docker ps -a` 命令看到。例如
``` ```bash
sudo docker ps -a docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes ago Exited (0) About a minute ago trusting_newton
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike 98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike

View File

@ -4,18 +4,18 @@
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。 数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
首先,创建一个名为 dbdata 的数据卷容器: 首先,创建一个名为 dbdata 的数据卷容器:
``` ```bash
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres $ docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
``` ```
然后,在其他容器中使用 `--volumes-from` 来挂载 dbdata 容器中的数据卷。 然后,在其他容器中使用 `--volumes-from` 来挂载 dbdata 容器中的数据卷。
``` ```bash
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres $ docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres $ docker run -d --volumes-from dbdata --name db2 training/postgres
``` ```
可以使用超过一个的 `--volumes-from` 参数来指定从多个容器挂载不同的数据卷。 可以使用超过一个的 `--volumes-from` 参数来指定从多个容器挂载不同的数据卷。
也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。 也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。
``` ```bash
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres $ docker run -d --name db3 --volumes-from db1 training/postgres
``` ```
*注意:使用 `--volumes-from` 参数所挂载数据卷的容器自己并不需要保持在运行状态。 *注意:使用 `--volumes-from` 参数所挂载数据卷的容器自己并不需要保持在运行状态。

View File

@ -3,23 +3,23 @@
### 备份 ### 备份
首先使用 `--volumes-from` 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下: 首先使用 `--volumes-from` 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:
``` ```bash
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata $ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
``` ```
容器启动后,使用了 `tar` 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 `backup.tar` 的文件。 容器启动后,使用了 `tar` 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 `backup.tar` 的文件。
### 恢复 ### 恢复
如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。 如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
``` ```bash
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash $ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
``` ```
然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 `untar` 解压备份文件到挂载的容器卷中。 然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 `untar` 解压备份文件到挂载的容器卷中。
``` ```bash
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf $ docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar /backup/backup.tar
``` ```
为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看 为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
```bash
$ docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
``` ```
$ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
```

View File

@ -6,34 +6,34 @@
* 数据卷默认会一直存在,即使容器被删除 * 数据卷默认会一直存在,即使容器被删除
*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount镜像中的被指定为挂载点的目录中的文件会隐藏掉能显示看的是挂载的数据卷。 *注意*:数据卷的使用,类似于 Linux 下对目录或文件进行 mount镜像中的被指定为挂载点的目录中的文件会隐藏掉能显示看的是挂载的数据卷。
### 创建一个数据卷 ### 创建一个数据卷
在用 `docker run` 命令的时候,使用 `-v` 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。 在用 `docker run` 命令的时候,使用 `-v` 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
下面创建一个名为 web 的容器,并加载一个数据卷到容器的 `/webapp` 目录。 下面创建一个名为 web 的容器,并加载一个数据卷到容器的 `/webapp` 目录。
```bash
$ docker run -d -P --name web -v /webapp training/webapp python app.py
``` ```
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py *注意*:也可以在 Dockerfile 中使用 `VOLUME` 来添加一个或者多个新的卷到由该镜像创建的任意容器。
```
*注意:也可以在 Dockerfile 中使用 `VOLUME` 来添加一个或者多个新的卷到由该镜像创建的任意容器。
### 删除数据卷 ### 删除数据卷
数据卷是被设计用来持久化数据的它的生命周期独立于容器Docker不会在容器被删除后自动删除数据卷并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 `docker rm -v` 这个命令。无主的数据卷可能会占据很多空间要清理会很麻烦。Docker官方正在试图解决这个问题相关工作的进度可以查看这个[PR](https://github.com/docker/docker/pull/8484)。 数据卷是被设计用来持久化数据的它的生命周期独立于容器Docker不会在容器被删除后自动删除数据卷并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 `docker rm -v` 这个命令。无主的数据卷可能会占据很多空间要清理会很麻烦。Docker官方正在试图解决这个问题相关工作的进度可以查看这个[PR](https://github.com/docker/docker/pull/8484)。
### 挂载一个主机目录作为数据卷 ### 挂载一个主机目录作为数据卷
使用 `-v` 标记也可以指定挂载一个本地主机的目录到容器中去。 使用 `-v` 标记也可以指定挂载一个本地主机的目录到容器中去。
``` ```bash
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py $ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
``` ```
上面的命令加载主机的 `/src/webapp` 目录到容器的 `/opt/webapp` 上面的命令加载主机的 `/src/webapp` 目录到容器的 `/opt/webapp`
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。 目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
*注意Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。 *注意*Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。
Docker 挂载数据卷的默认权限是读写,用户也可以通过 `:ro` 指定为只读。 Docker 挂载数据卷的默认权限是读写,用户也可以通过 `:ro` 指定为只读。
``` ```bash
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro $ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py training/webapp python app.py
``` ```
加了 `:ro` 之后,就挂载为只读了。 加了 `:ro` 之后,就挂载为只读了。
@ -41,13 +41,13 @@ training/webapp python app.py
### 查看数据卷的具体信息 ### 查看数据卷的具体信息
在主机里使用以下命令可以查看指定容器的信息 在主机里使用以下命令可以查看指定容器的信息
``` ```bash
$ docker inspect web $ docker inspect web
... ...
``` ```
在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的`/var/lib/docker/volumes/`下面的 在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的`/var/lib/docker/volumes/`下面的
``` ```json
"Volumes": { "Volumes": {
"/webapp": "/var/lib/docker/volumes/fac362...80535" "/webapp": "/var/lib/docker/volumes/fac362...80535"
}, },
@ -57,7 +57,7 @@ $ docker inspect web
... ...
``` ```
从Docker 1.8.0起,数据卷配置在"Mounts"Key下面可以看到所有的数据卷都是创建在主机的`/mnt/sda1/var/lib/docker/volumes/....`下面了。 从Docker 1.8.0起,数据卷配置在"Mounts"Key下面可以看到所有的数据卷都是创建在主机的`/mnt/sda1/var/lib/docker/volumes/....`下面了。
``` ```json
"Mounts": [ "Mounts": [
{ {
"Name": "b53ebd40054dae599faf7c9666acfe205c3e922fc3e8bc3f2fd178ed788f1c29", "Name": "b53ebd40054dae599faf7c9666acfe205c3e922fc3e8bc3f2fd178ed788f1c29",
@ -74,10 +74,10 @@ $ docker inspect web
### 挂载一个本地主机文件作为数据卷 ### 挂载一个本地主机文件作为数据卷
`-v` 标记也可以从主机挂载单个文件到容器中 `-v` 标记也可以从主机挂载单个文件到容器中
``` ```bash
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash $ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
``` ```
这样就可以记录在容器输入过的命令了。 这样就可以记录在容器输入过的命令了。
*注意:如果直接挂载一个文件,很多文件编辑工具,包括 `vi` 或者 `sed --in-place`,可能会造成文件 inode 的改变,从 Docker 1.1 *注意*:如果直接挂载一个文件,很多文件编辑工具,包括 `vi` 或者 `sed --in-place`,可能会造成文件 inode 的改变,从 Docker 1.1
.0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。 .0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。

View File

@ -8,14 +8,14 @@ etcd 基于 Go 语言实现,因此,用户可以从 [项目主页](https://gi
例如,下面的命令使用 curl 工具下载压缩包,并解压。 例如,下面的命令使用 curl 工具下载压缩包,并解压。
``` ```bash
curl -L https://github.com/coreos/etcd/releases/download/v2.0.0-rc.1/etcd-v2.0.0-rc.1-linux-amd64.tar.gz -o etcd-v2.0.0-rc.1-linux-amd64.tar.gz curl -L https://github.com/coreos/etcd/releases/download/v2.0.0-rc.1/etcd-v2.0.0-rc.1-linux-amd64.tar.gz -o etcd-v2.0.0-rc.1-linux-amd64.tar.gz
tar xzvf etcd-v2.0.0-rc.1-linux-amd64.tar.gz tar xzvf etcd-v2.0.0-rc.1-linux-amd64.tar.gz
cd etcd-v2.0.0-rc.1-linux-amd64 cd etcd-v2.0.0-rc.1-linux-amd64
``` ```
解压后,可以看到文件包括 解压后,可以看到文件包括
``` ```bash
$ ls $ ls
etcd etcdctl etcd-migrate README-etcdctl.md README.md etcd etcdctl etcd-migrate README-etcdctl.md README.md
``` ```
@ -24,12 +24,12 @@ etcd etcdctl etcd-migrate README-etcdctl.md README.md
推荐通过下面的命令将三个文件都放到系统可执行目录 `/usr/local/bin/``/usr/bin/` 推荐通过下面的命令将三个文件都放到系统可执行目录 `/usr/local/bin/``/usr/bin/`
``` ```bash
$ sudo cp etcd* /usr/local/bin/ $ sudo cp etcd* /usr/local/bin/
``` ```
运行 etcd将默认组建一个两个节点的集群。数据库服务端默认监听在 2379 和 4001 端口etcd 实例监听在 2380 和 7001 端口。显示类似如下的信息: 运行 etcd将默认组建一个两个节点的集群。数据库服务端默认监听在 2379 和 4001 端口etcd 实例监听在 2380 和 7001 端口。显示类似如下的信息:
``` ```bash
$ ./etcd $ ./etcd
2014/12/31 14:52:09 no data-dir provided, using default data-dir ./default.etcd 2014/12/31 14:52:09 no data-dir provided, using default data-dir ./default.etcd
2014/12/31 14:52:09 etcd: listening for peers on http://localhost:2380 2014/12/31 14:52:09 etcd: listening for peers on http://localhost:2380
@ -56,7 +56,7 @@ $ ./etcd
``` ```
此时,可以使用 etcdctl 命令进行测试,设置和获取键值 `testkey: "hello world"`,检查 etcd 服务是否启动成功: 此时,可以使用 etcdctl 命令进行测试,设置和获取键值 `testkey: "hello world"`,检查 etcd 服务是否启动成功:
``` ```bash
$ ./etcdctl set testkey "hello world" $ ./etcdctl set testkey "hello world"
hello world hello world
$ ./etcdctl get testkey $ ./etcdctl get testkey
@ -65,7 +65,7 @@ hello world
说明 etcd 服务已经成功启动了。 说明 etcd 服务已经成功启动了。
当然,也可以通过 HTTP 访问本地 2379 或 4001 端口的方式来进行操作,例如查看 `testkey` 的值: 当然,也可以通过 HTTP 访问本地 2379 或 4001 端口的方式来进行操作,例如查看 `testkey` 的值:
``` ```bash
$ curl -L http://localhost:4001/v2/keys/testkey $ curl -L http://localhost:4001/v2/keys/testkey
{"action":"get","node":{"key":"/testkey","value":"hello world","modifiedIndex":3,"createdIndex":3}} {"action":"get","node":{"key":"/testkey","value":"hello world","modifiedIndex":3,"createdIndex":3}}
``` ```
@ -73,6 +73,6 @@ $ curl -L http://localhost:4001/v2/keys/testkey
### Docker 镜像方式下载 ### Docker 镜像方式下载
镜像名称为 quay.io/coreos/etcd:v2.0.0_rc.1,可以通过下面的命令启动 etcd 服务监听到 4001 端口。 镜像名称为 quay.io/coreos/etcd:v2.0.0_rc.1,可以通过下面的命令启动 etcd 服务监听到 4001 端口。
``` ```bash
$ sudo docker run -p 4001:4001 -v /etc/ssl/certs/:/etc/ssl/certs/ quay.io/coreos/etcd:v2.0.0_rc.1 $ docker run -p 4001:4001 -v /etc/ssl/certs/:/etc/ssl/certs/ quay.io/coreos/etcd:v2.0.0_rc.1
``` ```

View File

@ -2,7 +2,7 @@
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。 在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。
Docker 运行容器前需要本地存在对应的镜像如果镜像不存在本地Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。 Docker 运行容器前需要本地存在对应的镜像如果镜像不存在本地Docker 会从镜像仓库下载(默认是 Docker Hub )。
本章将介绍更多关于镜像的内容,包括: 本章将介绍更多关于镜像的内容,包括:
* 从仓库获取镜像; * 从仓库获取镜像;

View File

@ -9,7 +9,7 @@
现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。 现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。
```bash ```bash
docker run --name webserver -d -p 80:80 nginx $ docker run --name webserver -d -p 80:80 nginx
``` ```
这条命令会用 `nginx` 镜像启动一个容器,命名为 `webserver`,并且映射了 80 端口,这样我们可以用浏览器去访问这个 `nginx` 服务器。 这条命令会用 `nginx` 镜像启动一个容器,命名为 `webserver`,并且映射了 80 端口,这样我们可以用浏览器去访问这个 `nginx` 服务器。

View File

@ -24,6 +24,12 @@ ubuntu 14.04 1e0c3dd64ccd 4 weeks ago
另外一个需要注意的问题是,`docker images` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。 另外一个需要注意的问题是,`docker images` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
在 Docker 1.13+ 版本中可以你可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间。
```bash
$ docker system df
```
### 虚悬镜像 ### 虚悬镜像
上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 `<none>`。: 上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 `<none>`。:
@ -46,7 +52,7 @@ REPOSITORY TAG IMAGE ID CREATED
$ docker rmi $(docker images -q -f dangling=true) $ docker rmi $(docker images -q -f dangling=true)
``` ```
注意:如果你使用的是 Docker 1.13+ 版本,你可以便捷的使用以下命令来删除虚悬镜像。 在 Docker 1.13+ 版本中你可以便捷的使用以下命令来删除虚悬镜像。
```bash ```bash
$ docker image prune $ docker image prune

View File

@ -1,12 +1,12 @@
## 镜像加速器 ## 镜像加速器
国内访问 Docker Hub 有时会遇到困难此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了加速器服务,例如: 国内从 Docker Hub 拉取镜像有时会遇到困难此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
* [Docker 官方提供的中国registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror) * [Docker 官方提供的中国registry mirror](https://docs.docker.com/registry/recipes/mirror/#use-case-the-china-registry-mirror)
* [阿里云加速器](https://cr.console.aliyun.com/#/accelerator) * [阿里云加速器](https://cr.console.aliyun.com/#/accelerator)
* [DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc) * [DaoCloud 加速器](https://www.daocloud.io/mirror#accelerator-doc)
注册用户并且申请加速器,会获得如 `https://jxus37ad.mirror.aliyuncs.com` 这样的地址。我们需要将其配置给 Docker 引擎 我们以 Docker 官方加速器为例进行介绍
### Ubuntu 14.04、Debian 7 Wheezy ### Ubuntu 14.04、Debian 7 Wheezy

View File

@ -11,19 +11,19 @@
* 当要连接其他容器时候可以作为一个有用的参考点比如连接web容器到db容器 * 当要连接其他容器时候可以作为一个有用的参考点比如连接web容器到db容器
使用 `--name` 标记可以为容器自定义命名。 使用 `--name` 标记可以为容器自定义命名。
``` ```bash
$ sudo docker run -d -P --name web training/webapp python app.py $ docker run -d -P --name web training/webapp python app.py
``` ```
使用 `docker ps` 来验证设定的命名。 使用 `docker ps` 来验证设定的命名。
``` ```bash
$ sudo docker ps -l $ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
``` ```
也可以使用 `docker inspect` 来查看容器的名字 也可以使用 `docker inspect` 来查看容器的名字
``` ```bash
$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde $ docker inspect -f "{{ .Name }}" aed84ee21bde
/web /web
``` ```
注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用`docker rm` 来删除之前创建的同名容器。 注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用`docker rm` 来删除之前创建的同名容器。
@ -34,23 +34,23 @@ $ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
使用 `--link` 参数可以让容器之间安全的进行交互。 使用 `--link` 参数可以让容器之间安全的进行交互。
下面先创建一个新的数据库容器。 下面先创建一个新的数据库容器。
``` ```bash
$ sudo docker run -d --name db training/postgres $ docker run -d --name db training/postgres
``` ```
删除之前创建的 web 容器 删除之前创建的 web 容器
``` ```bash
$ docker rm -f web $ docker rm -f web
``` ```
然后创建一个新的 web 容器,并将它连接到 db 容器 然后创建一个新的 web 容器,并将它连接到 db 容器
``` ```bash
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py $ docker run -d -P --name web --link db:db training/webapp python app.py
``` ```
此时db 容器和 web 容器建立互联关系。 此时db 容器和 web 容器建立互联关系。
`--link` 参数的格式为 `--link name:alias`,其中 `name` 是要链接的容器的名称,`alias` 是这个连接的别名。 `--link` 参数的格式为 `--link name:alias`,其中 `name` 是要链接的容器的名称,`alias` 是这个连接的别名。
使用 `docker ps` 来查看容器的连接 使用 `docker ps` 来查看容器的连接
``` ```bash
$ docker ps $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db 349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db
@ -65,8 +65,8 @@ Docker 通过 2 种方式为容器公开连接信息:
* 更新 `/etc/hosts` 文件 * 更新 `/etc/hosts` 文件
使用 `env` 命令来查看 web 容器的环境变量 使用 `env` 命令来查看 web 容器的环境变量
``` ```bash
$ sudo docker run --rm --name web2 --link db:db training/webapp env $ docker run --rm --name web2 --link db:db training/webapp env
. . . . . .
DB_NAME=/web2/db DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5:5432 DB_PORT=tcp://172.17.0.5:5432
@ -79,8 +79,8 @@ DB_PORT_5000_TCP_ADDR=172.17.0.5
其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。 其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。
除了环境变量Docker 还添加 host 信息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件 除了环境变量Docker 还添加 host 信息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件
``` ```bash
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash $ docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde 172.17.0.7 aed84ee21bde
. . . . . .
@ -88,7 +88,7 @@ root@aed84ee21bde:/opt/webapp# cat /etc/hosts
``` ```
这里有 2 个 hosts第一个是 web 容器web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。 这里有 2 个 hosts第一个是 web 容器web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。
可以在 web 容器中安装 ping 命令来测试跟db容器的连通。 可以在 web 容器中安装 ping 命令来测试跟db容器的连通。
``` ```bash
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db root@aed84ee21bde:/opt/webapp# ping db
PING db (172.17.0.5): 48 data bytes PING db (172.17.0.5): 48 data bytes
@ -97,6 +97,6 @@ PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms 56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
``` ```
用 ping 来测试db容器它会解析成 `172.17.0.5` 用 ping 来测试db容器它会解析成 `172.17.0.5`
*注意:官方的 ubuntu 镜像默认没有安装 ping需要自行安装。 *注意*:官方的 ubuntu 镜像默认没有安装 ping需要自行安装。
用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。 用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。

View File

@ -4,15 +4,15 @@
当使用 -P 标记时Docker 会随机映射一个 `49000~49900` 的端口到内部容器开放的网络端口。 当使用 -P 标记时Docker 会随机映射一个 `49000~49900` 的端口到内部容器开放的网络端口。
使用 `docker ps` 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。 使用 `docker ps` 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
``` ```bash
$ sudo docker run -d -P training/webapp python app.py $ docker run -d -P training/webapp python app.py
$ sudo docker ps -l $ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
``` ```
同样的,可以通过 `docker logs` 命令来查看应用的信息。 同样的,可以通过 `docker logs` 命令来查看应用的信息。
``` ```bash
$ sudo docker logs -f nostalgic_morse $ docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/ * Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 - 10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 - 10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
@ -22,28 +22,28 @@ $ sudo docker logs -f nostalgic_morse
### 映射所有接口地址 ### 映射所有接口地址
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以执行 使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
``` ```bash
$ sudo docker run -d -p 5000:5000 training/webapp python app.py $ docker run -d -p 5000:5000 training/webapp python app.py
``` ```
此时默认会绑定本地所有接口上的所有地址。 此时默认会绑定本地所有接口上的所有地址。
### 映射到指定地址的指定端口 ### 映射到指定地址的指定端口
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1 可以使用 `ip:hostPort:containerPort` 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
``` ```bash
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py $ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
``` ```
### 映射到指定地址的任意端口 ### 映射到指定地址的任意端口
使用 `ip::containerPort` 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。 使用 `ip::containerPort` 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
``` ```bash
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py $ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
``` ```
还可以使用 udp 标记来指定 udp 端口 还可以使用 udp 标记来指定 udp 端口
``` ```bash
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py $ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
``` ```
### 查看映射端口配置 ### 查看映射端口配置
使用 `docker port` 来查看当前映射的端口配置,也可以查看到绑定的地址 使用 `docker port` 来查看当前映射的端口配置,也可以查看到绑定的地址
``` ```bash
$ docker port nostalgic_morse 5000 $ docker port nostalgic_morse 5000
127.0.0.1:49155. 127.0.0.1:49155.
``` ```
@ -52,6 +52,6 @@ $ docker port nostalgic_morse 5000
* -p 标记可以多次使用来绑定多个端口 * -p 标记可以多次使用来绑定多个端口
例如 例如
``` ```bash
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py $ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
``` ```

View File

@ -10,8 +10,8 @@
你可以通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。 你可以通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。
例如以 centos 为关键词进行搜索: 例如以 centos 为关键词进行搜索:
``` ```bash
$ sudo docker search centos $ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 465 [OK] centos The official build of CentOS. 465 [OK]
tianon/centos CentOS 5 and 6, created using rinse instea... 28 tianon/centos CentOS 5 and 6, created using rinse instea... 28
@ -30,8 +30,8 @@ tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4
另外,在查找的时候通过 `-s N` 参数可以指定仅显示评价为 `N` 星以上的镜像新版本Docker推荐使用`--filter=stars=N`参数)。 另外,在查找的时候通过 `-s N` 参数可以指定仅显示评价为 `N` 星以上的镜像新版本Docker推荐使用`--filter=stars=N`参数)。
下载官方 centos 镜像到本地。 下载官方 centos 镜像到本地。
``` ```bash
$ sudo docker pull centos $ docker pull centos
Pulling repository centos Pulling repository centos
0b443ba03958: Download complete 0b443ba03958: Download complete
539c0211cd76: Download complete 539c0211cd76: Download complete

View File

@ -9,13 +9,13 @@ Constraint 过滤器是绑定到节点的键值对,相当于给节点添加标
可在启动 Docker 服务的时候指定,例如指定某个节点颜色为 `red` 可在启动 Docker 服务的时候指定,例如指定某个节点颜色为 `red`
```sh ```bash
$ sudo docker daemon --label color=red -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock $ docker daemon --label color=red -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
``` ```
同样的,可以写在 Docker 服务的配置文件里面(以 Ubuntu 14.04 为例,是 `/etc/default/docker`)。 同样的,可以写在 Docker 服务的配置文件里面(以 Ubuntu 14.04 为例,是 `/etc/default/docker`)。
```sh ```bash
DOCKER_OPTS="--label color=red -H 0.0.0.0:2375 -H unix:///var/run/docker.sock" DOCKER_OPTS="--label color=red -H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
``` ```
@ -25,7 +25,7 @@ DOCKER_OPTS="--label color=red -H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
然后,分别启动两个容器,指定使用过滤器分别为红色和绿色。 然后,分别启动两个容器,指定使用过滤器分别为红色和绿色。
```sh ```bash
$ docker -H 192.168.0.2:12375 run -d -e constraint:color==red ubuntu:14.04 ping 127.0.0.1 $ docker -H 192.168.0.2:12375 run -d -e constraint:color==red ubuntu:14.04 ping 127.0.0.1
252ffb48e64e9858c72241f5eedf6a3e4571b1ad926faf091db3e26672370f64 252ffb48e64e9858c72241f5eedf6a3e4571b1ad926faf091db3e26672370f64
$ docker -H 192.168.0.2:12375 run -d -e constraint:color==green ubuntu:14.04 ping 127.0.0.1 $ docker -H 192.168.0.2:12375 run -d -e constraint:color==green ubuntu:14.04 ping 127.0.0.1
@ -36,7 +36,7 @@ $ docker -H 192.168.0.2:12375 run -d -e constraint:color==green ubuntu:14.04 pin
查看它们将被分配到指定节点上。 查看它们将被分配到指定节点上。
```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
252ffb48e64e ubuntu:14.04 "ping 127.0.0.1" 1 minutes ago Up 1 minutes Host-2/sick_galileo 252ffb48e64e ubuntu:14.04 "ping 127.0.0.1" 1 minutes ago Up 1 minutes Host-2/sick_galileo
@ -47,7 +47,7 @@ CONTAINER ID IMAGE COMMAND CREATED
例如,目前集群中各个节点的信息为: 例如,目前集群中各个节点的信息为:
```sh ```bash
$ docker -H 192.168.0.2:12375 info $ docker -H 192.168.0.2:12375 info
Containers: 5 Containers: 5
Images: 39 Images: 39
@ -72,26 +72,26 @@ Name: 946d65606f7c
### Affinity 过滤器 ### Affinity 过滤器
Affinity 过滤器允许用户在启动一个容器的时候,让它分配到某个已有容器的节点上。 Affinity 过滤器允许用户在启动一个容器的时候,让它分配到某个已有容器的节点上。
例如,下面我们将启动一个 nginx 容器,让它分配到已经运行某个 ubuntu 容器的节点上。 例如,下面我们将启动一个 nginx 容器,让它分配到已经运行某个 ubuntu 容器的节点上。
在 Constraint 过滤器的示例中,我们分别启动了两个 ubuntu 容器 `sick_galileo``compassionate_ritchie`,分别在 Host-2 和 Host-3 上。 在 Constraint 过滤器的示例中,我们分别启动了两个 ubuntu 容器 `sick_galileo``compassionate_ritchie`,分别在 Host-2 和 Host-3 上。
现在启动一个 nginx 容器,让它跟容器 `sick_galileo` 放在一起,都放到 Host-2 节点上。可以通过 `-e affinity:container==<name or id>` 参数来实现。 现在启动一个 nginx 容器,让它跟容器 `sick_galileo` 放在一起,都放到 Host-2 节点上。可以通过 `-e affinity:container==<name or id>` 参数来实现。
```sh ```bash
$ docker -H 192.168.0.2:12375 run -d -e affinity:container==sick_galileo nginx $ docker -H 192.168.0.2:12375 run -d -e affinity:container==sick_galileo nginx
``` ```
然后启动一个 redis 容器,让它跟容器 `compassionate_ritchie` 放在一起,都放到 Host-3 节点上。 然后启动一个 redis 容器,让它跟容器 `compassionate_ritchie` 放在一起,都放到 Host-3 节点上。
```sh ```bash
$ docker -H 192.168.0.2:12375 run -d -e affinity:container==compassionate_ritchie redis $ docker -H 192.168.0.2:12375 run -d -e affinity:container==compassionate_ritchie redis
``` ```
查看所有容器运行情况。 查看所有容器运行情况。
```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
0a32f15aa8ee redis "/entrypoint.sh redis" 2 seconds ago Up 1 seconds 6379/tcp Host-3/awesome_darwin 0a32f15aa8ee redis "/entrypoint.sh redis" 2 seconds ago Up 1 seconds 6379/tcp Host-3/awesome_darwin

View File

@ -6,13 +6,13 @@ Swarm 安装有几种方式,可以基于 Docker Machine 来进行安装,也
### 下载镜像 ### 下载镜像
Docker 官方已经提供了 Swarm 镜像使用,需要在所有被 Swarm 管理的 Docker 主机上下载该镜像。 Docker 官方已经提供了 Swarm 镜像使用,需要在所有被 Swarm 管理的 Docker 主机上下载该镜像。
```sh ```bash
$ docker pull swarm $ docker pull swarm
``` ```
可以使用下面的命令来查看 Swarm 版本,验证是否成功下载 Swarm 镜像。 可以使用下面的命令来查看 Swarm 版本,验证是否成功下载 Swarm 镜像。
```sh ```bash
$ docker run --rm swarm -v $ docker run --rm swarm -v
swarm version 1.2.2 (34e3da3) swarm version 1.2.2 (34e3da3)
``` ```
@ -22,8 +22,8 @@ Docker 主机在加入 Swarm 集群前,需要进行一些简单配置,添加
例如,在启动 Docker daemon 的时候通过 `-H` 参数: 例如,在启动 Docker daemon 的时候通过 `-H` 参数:
```sh ```bash
$ sudo docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock $ docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
``` ```
*注Docker 1.8.0 版本之前不支持 daemon 命令,可以用 -d 代替。* *注Docker 1.8.0 版本之前不支持 daemon 命令,可以用 -d 代替。*
@ -34,7 +34,7 @@ $ sudo docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
在文件的最后添加: 在文件的最后添加:
```sh ```bash
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock" DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
``` ```
@ -48,7 +48,7 @@ Docker 集群管理需要使用服务发现Service Discover功能Swarm
#### 启动 Consul 服务后端 #### 启动 Consul 服务后端
启动 consul 服务容器,映射到主机的 8500 端口。 启动 consul 服务容器,映射到主机的 8500 端口。
```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
``` ```
@ -57,13 +57,13 @@ $ docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap
#### 启动管理节点 #### 启动管理节点
首先,启动一个主管理节点,映射到主机的 4000 端口,并获取所在主机地址为 `<manager0_ip>`。其中 4000 端口是 Swarm 管理器的默认监听端口,用户也可以指定映射为其它端口。 首先,启动一个主管理节点,映射到主机的 4000 端口,并获取所在主机地址为 `<manager0_ip>`。其中 4000 端口是 Swarm 管理器的默认监听端口,用户也可以指定映射为其它端口。
```sh ```bash
$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500 $ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
``` ```
为了提高高可用性,用户也可以启动从管理节点。假定获取所在主机地址为 `<manager1_ip>` 为了提高高可用性,用户也可以启动从管理节点。假定获取所在主机地址为 `<manager1_ip>`
```sh ```bash
$ docker run -d swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://<consul_ip>:8500 $ docker run -d swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://<consul_ip>:8500
``` ```
@ -72,7 +72,7 @@ $ docker run -d swarm manage -H :4000 --replication --advertise <manager1_ip>:40
获取节点的主机地址为 `<node_ip>`,并指定前面获取到的 consul 服务地址。 获取节点的主机地址为 `<node_ip>`,并指定前面获取到的 consul 服务地址。
```sh ```bash
$ docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500 $ docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
``` ```

View File

@ -29,33 +29,33 @@ Docker 创建一个容器的时候,会执行如下操作:
用户使用 `--net=none` 后,可以自行配置网络,让容器达到跟平常一样具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节。 用户使用 `--net=none` 后,可以自行配置网络,让容器达到跟平常一样具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节。
首先,启动一个 `/bin/bash` 容器,指定 `--net=none` 参数。 首先,启动一个 `/bin/bash` 容器,指定 `--net=none` 参数。
``` ```bash
$ sudo docker run -i -t --rm --net=none base /bin/bash $ docker run -i -t --rm --net=none base /bin/bash
root@63f36fc01b5f:/# root@63f36fc01b5f:/#
``` ```
在本地主机查找容器的进程 id并为它创建网络命名空间。 在本地主机查找容器的进程 id并为它创建网络命名空间。
``` ```bash
$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f $ docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778 2778
$ pid=2778 $ pid=2778
$ sudo mkdir -p /var/run/netns $ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid $ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
``` ```
检查桥接网卡的 IP 和子网掩码信息。 检查桥接网卡的 IP 和子网掩码信息。
``` ```bash
$ ip addr show docker0 $ ip addr show docker0
21: docker0: ... 21: docker0: ...
inet 172.17.42.1/16 scope global docker0 inet 172.17.42.1/16 scope global docker0
... ...
``` ```
创建一对 “veth pair” 接口 A 和 B绑定 A 到网桥 `docker0`,并启用它 创建一对 “veth pair” 接口 A 和 B绑定 A 到网桥 `docker0`,并启用它
``` ```bash
$ sudo ip link add A type veth peer name B $ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A $ sudo brctl addif docker0 A
$ sudo ip link set A up $ sudo ip link set A up
``` ```
将B放到容器的网络命名空间命名为 eth0启动它并配置一个可用 IP桥接网段和默认网关。 将B放到容器的网络命名空间命名为 eth0启动它并配置一个可用 IP桥接网段和默认网关。
``` ```bash
$ sudo ip link set B netns $pid $ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0 $ sudo ip netns exec $pid ip link set dev B name eth0
$ sudo ip netns exec $pid ip link set eth0 up $ sudo ip netns exec $pid ip link set eth0 up