parent
f838297f05
commit
d1a640f383
|
@ -4,19 +4,20 @@
|
|||
在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。
|
||||
|
||||
如果服务已经运行,那需要先停止服务,并删除旧的网桥。
|
||||
```
|
||||
$ sudo service docker stop
|
||||
|
||||
```bash
|
||||
$ sudo systemctl stop docker
|
||||
$ sudo ip link set dev docker0 down
|
||||
$ sudo brctl delbr docker0
|
||||
```
|
||||
然后创建一个网桥 `bridge0`。
|
||||
```
|
||||
```bash
|
||||
$ sudo brctl addbr bridge0
|
||||
$ sudo ip addr add 192.168.5.1/24 dev bridge0
|
||||
$ sudo ip link set dev bridge0 up
|
||||
```
|
||||
查看确认网桥创建并启动。
|
||||
```
|
||||
```bash
|
||||
$ ip addr show bridge0
|
||||
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
|
||||
|
@ -24,9 +25,9 @@ $ ip addr show bridge0
|
|||
valid_lft forever preferred_lft forever
|
||||
```
|
||||
配置 Docker 服务,默认桥接到创建的网桥上。
|
||||
```
|
||||
```bash
|
||||
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
|
||||
$ sudo service docker start
|
||||
$ sudo systemctl start docker
|
||||
```
|
||||
启动 Docker 服务。
|
||||
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。
|
||||
|
|
|
@ -6,18 +6,18 @@
|
|||
解决办法很简单:创建一对 `peer` 接口,分别放到两个容器中,配置成点到点链路类型即可。
|
||||
|
||||
首先启动 2 个容器:
|
||||
```
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
```bash
|
||||
$ docker run -i -t --rm --net=none base /bin/bash
|
||||
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:/#
|
||||
```
|
||||
|
||||
找到进程号,然后创建网络命名空间的跟踪文件。
|
||||
```
|
||||
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||
```bash
|
||||
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
|
||||
2989
|
||||
$ sudo docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
||||
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
|
||||
3004
|
||||
$ sudo mkdir -p /var/run/netns
|
||||
$ 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` 接口,然后配置路由
|
||||
```
|
||||
```bash
|
||||
$ sudo ip link add A type veth peer name B
|
||||
|
||||
$ sudo ip link set A netns 2989
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#### index.py
|
||||
|
||||
编写一个 `index.py` 作为服务器文件,代码为
|
||||
```bash
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
#authors: yeasy.github.com
|
||||
#date: 2013-07-05
|
||||
|
@ -99,7 +99,7 @@ $ touch index.html
|
|||
|
||||
#### Dockerfile
|
||||
编写 `Dockerfile` 文件,内容为
|
||||
```bash
|
||||
```docker
|
||||
FROM python:2.7
|
||||
WORKDIR /code
|
||||
ADD . /code
|
||||
|
@ -194,8 +194,8 @@ compose-haproxy-web
|
|||
└── index.py
|
||||
```
|
||||
在该目录下执行 `docker-compose up` 命令,会整合输出所有容器的输出。
|
||||
```
|
||||
$sudo docker-compose up
|
||||
```bash
|
||||
$ docker-compose up
|
||||
Recreating composehaproxyweb_webb_1...
|
||||
Recreating composehaproxyweb_webc_1...
|
||||
Recreating composehaproxyweb_weba_1...
|
||||
|
|
|
@ -5,12 +5,12 @@
|
|||
`docker attach` 是 Docker 自带的命令。下面示例如何使用该命令。
|
||||
|
||||
```bash
|
||||
$ sudo docker run -idt ubuntu
|
||||
$ docker run -idt ubuntu
|
||||
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
||||
$ sudo docker ps
|
||||
$ docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
|
||||
$sudo docker attach nostalgic_hypatia
|
||||
$ docker attach nostalgic_hypatia
|
||||
root@243c32535da7:/#
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ root@243c32535da7:/#
|
|||
#### 安装
|
||||
`nsenter` 工具在 util-linux 包2.23版本后包含。
|
||||
如果系统中 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;
|
||||
$ ./configure --without-ncurses
|
||||
$ make nsenter && sudo cp nsenter /usr/local/bin
|
||||
|
@ -59,9 +59,9 @@ $ nsenter --target $pid --mount --uts --ipc --net --pid -- /usr/bin/env \
|
|||
下面给出一个完整的例子。
|
||||
|
||||
```bash
|
||||
$ sudo docker run -idt ubuntu
|
||||
$ docker run -idt ubuntu
|
||||
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
|
||||
$ sudo docker ps
|
||||
$ docker ps
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
|
||||
$ PID=$(docker-pid 243c32535da7)
|
||||
|
|
|
@ -2,24 +2,24 @@
|
|||
|
||||
###导出容器
|
||||
如果要导出本地某个容器,可以使用 `docker export` 命令。
|
||||
```
|
||||
```bash
|
||||
$ docker ps -a
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
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` 从容器快照文件中再导入为镜像,例如
|
||||
```
|
||||
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
|
||||
```bash
|
||||
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
|
||||
$ docker images
|
||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
|
||||
```
|
||||
此外,也可以通过指定 URL 或者某个目录来导入,例如
|
||||
```
|
||||
```bash
|
||||
$ docker import http://example.com/exampleimage.tgz example/imagerepo
|
||||
```
|
||||
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
例如对于上一章节中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 来退出终端时,所创建的容器立刻终止。
|
||||
|
||||
终止状态的容器可以用 `docker ps -a` 命令看到。例如
|
||||
```
|
||||
sudo docker ps -a
|
||||
```bash
|
||||
docker ps -a
|
||||
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
|
||||
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike
|
||||
|
|
|
@ -4,18 +4,18 @@
|
|||
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
|
||||
|
||||
首先,创建一个名为 dbdata 的数据卷容器:
|
||||
```
|
||||
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
|
||||
```bash
|
||||
$ docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
|
||||
```
|
||||
然后,在其他容器中使用 `--volumes-from` 来挂载 dbdata 容器中的数据卷。
|
||||
```
|
||||
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
|
||||
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
|
||||
```bash
|
||||
$ docker run -d --volumes-from dbdata --name db1 training/postgres
|
||||
$ docker run -d --volumes-from dbdata --name db2 training/postgres
|
||||
```
|
||||
可以使用超过一个的 `--volumes-from` 参数来指定从多个容器挂载不同的数据卷。
|
||||
也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。
|
||||
```
|
||||
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
|
||||
```bash
|
||||
$ docker run -d --name db3 --volumes-from db1 training/postgres
|
||||
```
|
||||
*注意:使用 `--volumes-from` 参数所挂载数据卷的容器自己并不需要保持在运行状态。
|
||||
|
||||
|
|
|
@ -3,23 +3,23 @@
|
|||
|
||||
### 备份
|
||||
首先使用 `--volumes-from` 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:
|
||||
```
|
||||
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
|
||||
```bash
|
||||
$ docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
|
||||
```
|
||||
容器启动后,使用了 `tar` 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 `backup.tar` 的文件。
|
||||
|
||||
|
||||
### 恢复
|
||||
如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。
|
||||
```
|
||||
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
|
||||
```bash
|
||||
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
|
||||
```
|
||||
然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 `untar` 解压备份文件到挂载的容器卷中。
|
||||
```
|
||||
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
|
||||
```bash
|
||||
$ docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
|
||||
/backup/backup.tar
|
||||
```
|
||||
为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看
|
||||
```bash
|
||||
$ docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
|
||||
```
|
||||
$ sudo docker run --volumes-from dbdata2 busybox /bin/ls /dbdata
|
||||
```
|
|
@ -6,34 +6,34 @@
|
|||
* 数据卷默认会一直存在,即使容器被删除
|
||||
|
||||
|
||||
*注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
|
||||
*注意*:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
|
||||
|
||||
|
||||
### 创建一个数据卷
|
||||
在用 `docker run` 命令的时候,使用 `-v` 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
|
||||
|
||||
下面创建一个名为 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)。
|
||||
|
||||
### 挂载一个主机目录作为数据卷
|
||||
使用 `-v` 标记也可以指定挂载一个本地主机的目录到容器中去。
|
||||
```
|
||||
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
|
||||
```
|
||||
上面的命令加载主机的 `/src/webapp` 目录到容器的 `/opt/webapp`
|
||||
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建它。
|
||||
|
||||
*注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。
|
||||
*注意*:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。
|
||||
|
||||
Docker 挂载数据卷的默认权限是读写,用户也可以通过 `:ro` 指定为只读。
|
||||
```
|
||||
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
|
||||
```bash
|
||||
$ docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
|
||||
training/webapp python app.py
|
||||
```
|
||||
加了 `:ro` 之后,就挂载为只读了。
|
||||
|
@ -41,13 +41,13 @@ training/webapp python app.py
|
|||
### 查看数据卷的具体信息
|
||||
|
||||
在主机里使用以下命令可以查看指定容器的信息
|
||||
```
|
||||
```bash
|
||||
$ docker inspect web
|
||||
...
|
||||
```
|
||||
|
||||
在输出的内容中找到其中和数据卷相关的部分,可以看到所有的数据卷都是创建在主机的`/var/lib/docker/volumes/`下面的
|
||||
```
|
||||
```json
|
||||
"Volumes": {
|
||||
"/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/....`下面了。
|
||||
```
|
||||
```json
|
||||
"Mounts": [
|
||||
{
|
||||
"Name": "b53ebd40054dae599faf7c9666acfe205c3e922fc3e8bc3f2fd178ed788f1c29",
|
||||
|
@ -74,10 +74,10 @@ $ docker inspect web
|
|||
|
||||
### 挂载一个本地主机文件作为数据卷
|
||||
`-v` 标记也可以从主机挂载单个文件到容器中
|
||||
```
|
||||
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
|
||||
```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起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目录。
|
||||
|
|
|
@ -8,14 +8,14 @@ etcd 基于 Go 语言实现,因此,用户可以从 [项目主页](https://gi
|
|||
|
||||
例如,下面的命令使用 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
|
||||
tar xzvf etcd-v2.0.0-rc.1-linux-amd64.tar.gz
|
||||
cd etcd-v2.0.0-rc.1-linux-amd64
|
||||
```
|
||||
|
||||
解压后,可以看到文件包括
|
||||
```
|
||||
```bash
|
||||
$ ls
|
||||
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/`。
|
||||
|
||||
```
|
||||
```bash
|
||||
$ sudo cp etcd* /usr/local/bin/
|
||||
```
|
||||
|
||||
运行 etcd,将默认组建一个两个节点的集群。数据库服务端默认监听在 2379 和 4001 端口,etcd 实例监听在 2380 和 7001 端口。显示类似如下的信息:
|
||||
```
|
||||
```bash
|
||||
$ ./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
|
||||
|
@ -56,7 +56,7 @@ $ ./etcd
|
|||
```
|
||||
|
||||
此时,可以使用 etcdctl 命令进行测试,设置和获取键值 `testkey: "hello world"`,检查 etcd 服务是否启动成功:
|
||||
```
|
||||
```bash
|
||||
$ ./etcdctl set testkey "hello world"
|
||||
hello world
|
||||
$ ./etcdctl get testkey
|
||||
|
@ -65,7 +65,7 @@ hello world
|
|||
说明 etcd 服务已经成功启动了。
|
||||
|
||||
当然,也可以通过 HTTP 访问本地 2379 或 4001 端口的方式来进行操作,例如查看 `testkey` 的值:
|
||||
```
|
||||
```bash
|
||||
$ curl -L http://localhost:4001/v2/keys/testkey
|
||||
{"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 镜像方式下载
|
||||
|
||||
镜像名称为 quay.io/coreos/etcd:v2.0.0_rc.1,可以通过下面的命令启动 etcd 服务监听到 4001 端口。
|
||||
```
|
||||
$ sudo docker run -p 4001:4001 -v /etc/ssl/certs/:/etc/ssl/certs/ quay.io/coreos/etcd:v2.0.0_rc.1
|
||||
```bash
|
||||
$ docker run -p 4001:4001 -v /etc/ssl/certs/:/etc/ssl/certs/ quay.io/coreos/etcd:v2.0.0_rc.1
|
||||
```
|
||||
|
|
|
@ -11,19 +11,19 @@
|
|||
* 当要连接其他容器时候,可以作为一个有用的参考点,比如连接web容器到db容器
|
||||
|
||||
使用 `--name` 标记可以为容器自定义命名。
|
||||
```
|
||||
$ sudo docker run -d -P --name web training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -P --name web training/webapp python app.py
|
||||
```
|
||||
|
||||
使用 `docker ps` 来验证设定的命名。
|
||||
```
|
||||
$ sudo docker ps -l
|
||||
```bash
|
||||
$ docker ps -l
|
||||
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
|
||||
```
|
||||
也可以使用 `docker inspect` 来查看容器的名字
|
||||
```
|
||||
$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
|
||||
```bash
|
||||
$ docker inspect -f "{{ .Name }}" aed84ee21bde
|
||||
/web
|
||||
```
|
||||
注意:容器的名称是唯一的。如果已经命名了一个叫 web 的容器,当你要再次使用 web 这个名称的时候,需要先用`docker rm` 来删除之前创建的同名容器。
|
||||
|
@ -34,23 +34,23 @@ $ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
|
|||
使用 `--link` 参数可以让容器之间安全的进行交互。
|
||||
|
||||
下面先创建一个新的数据库容器。
|
||||
```
|
||||
$ sudo docker run -d --name db training/postgres
|
||||
```bash
|
||||
$ docker run -d --name db training/postgres
|
||||
```
|
||||
删除之前创建的 web 容器
|
||||
```
|
||||
```bash
|
||||
$ docker rm -f web
|
||||
```
|
||||
然后创建一个新的 web 容器,并将它连接到 db 容器
|
||||
```
|
||||
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -P --name web --link db:db training/webapp python app.py
|
||||
```
|
||||
此时,db 容器和 web 容器建立互联关系。
|
||||
|
||||
`--link` 参数的格式为 `--link name:alias`,其中 `name` 是要链接的容器的名称,`alias` 是这个连接的别名。
|
||||
|
||||
使用 `docker ps` 来查看容器的连接
|
||||
```
|
||||
```bash
|
||||
$ docker ps
|
||||
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
|
||||
|
@ -65,8 +65,8 @@ Docker 通过 2 种方式为容器公开连接信息:
|
|||
* 更新 `/etc/hosts` 文件
|
||||
|
||||
使用 `env` 命令来查看 web 容器的环境变量
|
||||
```
|
||||
$ sudo docker run --rm --name web2 --link db:db training/webapp env
|
||||
```bash
|
||||
$ docker run --rm --name web2 --link db:db training/webapp env
|
||||
. . .
|
||||
DB_NAME=/web2/db
|
||||
DB_PORT=tcp://172.17.0.5:5432
|
||||
|
@ -79,8 +79,8 @@ DB_PORT_5000_TCP_ADDR=172.17.0.5
|
|||
其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。
|
||||
|
||||
除了环境变量,Docker 还添加 host 信息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件
|
||||
```
|
||||
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
|
||||
```bash
|
||||
$ docker run -t -i --rm --link db:db training/webapp /bin/bash
|
||||
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
|
||||
172.17.0.7 aed84ee21bde
|
||||
. . .
|
||||
|
@ -88,7 +88,7 @@ root@aed84ee21bde:/opt/webapp# cat /etc/hosts
|
|||
```
|
||||
这里有 2 个 hosts,第一个是 web 容器,web 容器用 id 作为他的主机名,第二个是 db 容器的 ip 和主机名。
|
||||
可以在 web 容器中安装 ping 命令来测试跟db容器的连通。
|
||||
```
|
||||
```bash
|
||||
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
|
||||
root@aed84ee21bde:/opt/webapp# ping db
|
||||
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
|
||||
```
|
||||
用 ping 来测试db容器,它会解析成 `172.17.0.5`。
|
||||
*注意:官方的 ubuntu 镜像默认没有安装 ping,需要自行安装。
|
||||
*注意*:官方的 ubuntu 镜像默认没有安装 ping,需要自行安装。
|
||||
|
||||
用户可以链接多个父容器到子容器,比如可以链接多个 web 到 db 容器上。
|
||||
|
|
|
@ -4,15 +4,15 @@
|
|||
当使用 -P 标记时,Docker 会随机映射一个 `49000~49900` 的端口到内部容器开放的网络端口。
|
||||
|
||||
使用 `docker ps` 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。
|
||||
```
|
||||
$ sudo docker run -d -P training/webapp python app.py
|
||||
$ sudo docker ps -l
|
||||
```bash
|
||||
$ docker run -d -P training/webapp python app.py
|
||||
$ docker ps -l
|
||||
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
|
||||
```
|
||||
同样的,可以通过 `docker logs` 命令来查看应用的信息。
|
||||
```
|
||||
$ sudo docker logs -f nostalgic_morse
|
||||
```bash
|
||||
$ docker logs -f nostalgic_morse
|
||||
* 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 /favicon.ico HTTP/1.1" 404 -
|
||||
|
@ -22,28 +22,28 @@ $ sudo docker logs -f nostalgic_morse
|
|||
|
||||
### 映射所有接口地址
|
||||
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
|
||||
```
|
||||
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -p 5000:5000 training/webapp python app.py
|
||||
```
|
||||
此时默认会绑定本地所有接口上的所有地址。
|
||||
|
||||
### 映射到指定地址的指定端口
|
||||
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
|
||||
```
|
||||
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
|
||||
```
|
||||
### 映射到指定地址的任意端口
|
||||
使用 `ip::containerPort` 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
|
||||
```
|
||||
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
|
||||
```
|
||||
还可以使用 udp 标记来指定 udp 端口
|
||||
```
|
||||
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
|
||||
```
|
||||
### 查看映射端口配置
|
||||
使用 `docker port` 来查看当前映射的端口配置,也可以查看到绑定的地址
|
||||
```
|
||||
```bash
|
||||
$ docker port nostalgic_morse 5000
|
||||
127.0.0.1:49155.
|
||||
```
|
||||
|
@ -52,6 +52,6 @@ $ docker port nostalgic_morse 5000
|
|||
* -p 标记可以多次使用来绑定多个端口
|
||||
|
||||
例如
|
||||
```
|
||||
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
|
||||
```bash
|
||||
$ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
|
||||
```
|
||||
|
|
|
@ -10,8 +10,8 @@
|
|||
你可以通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。
|
||||
|
||||
例如以 centos 为关键词进行搜索:
|
||||
```
|
||||
$ sudo docker search centos
|
||||
```bash
|
||||
$ docker search centos
|
||||
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
|
||||
centos The official build of CentOS. 465 [OK]
|
||||
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`参数)。
|
||||
|
||||
下载官方 centos 镜像到本地。
|
||||
```
|
||||
$ sudo docker pull centos
|
||||
```bash
|
||||
$ docker pull centos
|
||||
Pulling repository centos
|
||||
0b443ba03958: Download complete
|
||||
539c0211cd76: Download complete
|
||||
|
|
|
@ -9,13 +9,13 @@ Constraint 过滤器是绑定到节点的键值对,相当于给节点添加标
|
|||
|
||||
可在启动 Docker 服务的时候指定,例如指定某个节点颜色为 `red`。
|
||||
|
||||
```sh
|
||||
$ sudo docker daemon --label color=red -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
|
||||
```bash
|
||||
$ 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`)。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
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
|
||||
252ffb48e64e9858c72241f5eedf6a3e4571b1ad926faf091db3e26672370f64
|
||||
$ 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
|
||||
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
|
||||
|
@ -47,7 +47,7 @@ CONTAINER ID IMAGE COMMAND CREATED
|
|||
|
||||
例如,目前集群中各个节点的信息为:
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker -H 192.168.0.2:12375 info
|
||||
Containers: 5
|
||||
Images: 39
|
||||
|
@ -72,26 +72,26 @@ Name: 946d65606f7c
|
|||
|
||||
### Affinity 过滤器
|
||||
Affinity 过滤器允许用户在启动一个容器的时候,让它分配到某个已有容器的节点上。
|
||||
|
||||
|
||||
例如,下面我们将启动一个 nginx 容器,让它分配到已经运行某个 ubuntu 容器的节点上。
|
||||
|
||||
|
||||
在 Constraint 过滤器的示例中,我们分别启动了两个 ubuntu 容器 `sick_galileo` 和 `compassionate_ritchie`,分别在 Host-2 和 Host-3 上。
|
||||
|
||||
现在启动一个 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
|
||||
```
|
||||
|
||||
然后启动一个 redis 容器,让它跟容器 `compassionate_ritchie` 放在一起,都放到 Host-3 节点上。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ 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
|
||||
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
|
||||
|
|
|
@ -6,13 +6,13 @@ Swarm 安装有几种方式,可以基于 Docker Machine 来进行安装,也
|
|||
### 下载镜像
|
||||
Docker 官方已经提供了 Swarm 镜像使用,需要在所有被 Swarm 管理的 Docker 主机上下载该镜像。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker pull swarm
|
||||
```
|
||||
|
||||
可以使用下面的命令来查看 Swarm 版本,验证是否成功下载 Swarm 镜像。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker run --rm swarm -v
|
||||
swarm version 1.2.2 (34e3da3)
|
||||
```
|
||||
|
@ -22,8 +22,8 @@ Docker 主机在加入 Swarm 集群前,需要进行一些简单配置,添加
|
|||
|
||||
例如,在启动 Docker daemon 的时候通过 `-H` 参数:
|
||||
|
||||
```sh
|
||||
$ sudo docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
|
||||
```bash
|
||||
$ docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
|
||||
```
|
||||
|
||||
*注: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"
|
||||
```
|
||||
|
||||
|
@ -48,7 +48,7 @@ Docker 集群管理需要使用服务发现(Service Discover)功能,Swarm
|
|||
#### 启动 Consul 服务后端
|
||||
启动 consul 服务容器,映射到主机的 8500 端口。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ 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 管理器的默认监听端口,用户也可以指定映射为其它端口。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
|
||||
```
|
||||
|
||||
为了提高高可用性,用户也可以启动从管理节点。假定获取所在主机地址为 `<manager1_ip>`。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ 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 服务地址。
|
||||
|
||||
```sh
|
||||
```bash
|
||||
$ docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
|
||||
```
|
||||
|
||||
|
|
|
@ -29,33 +29,33 @@ Docker 创建一个容器的时候,会执行如下操作:
|
|||
用户使用 `--net=none` 后,可以自行配置网络,让容器达到跟平常一样具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节。
|
||||
|
||||
首先,启动一个 `/bin/bash` 容器,指定 `--net=none` 参数。
|
||||
```
|
||||
$ sudo docker run -i -t --rm --net=none base /bin/bash
|
||||
```bash
|
||||
$ docker run -i -t --rm --net=none base /bin/bash
|
||||
root@63f36fc01b5f:/#
|
||||
```
|
||||
在本地主机查找容器的进程 id,并为它创建网络命名空间。
|
||||
```
|
||||
$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
|
||||
```bash
|
||||
$ docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
|
||||
2778
|
||||
$ pid=2778
|
||||
$ sudo mkdir -p /var/run/netns
|
||||
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
|
||||
```
|
||||
检查桥接网卡的 IP 和子网掩码信息。
|
||||
```
|
||||
```bash
|
||||
$ ip addr show docker0
|
||||
21: docker0: ...
|
||||
inet 172.17.42.1/16 scope global docker0
|
||||
...
|
||||
```
|
||||
创建一对 “veth pair” 接口 A 和 B,绑定 A 到网桥 `docker0`,并启用它
|
||||
```
|
||||
```bash
|
||||
$ sudo ip link add A type veth peer name B
|
||||
$ sudo brctl addif docker0 A
|
||||
$ sudo ip link set A up
|
||||
```
|
||||
将B放到容器的网络命名空间,命名为 eth0,启动它并配置一个可用 IP(桥接网段)和默认网关。
|
||||
```
|
||||
```bash
|
||||
$ 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 eth0 up
|
||||
|
|
Loading…
Reference in New Issue