Update advanced_network

pull/258/head
khs1994 2017-11-29 10:23:42 +08:00
parent a9eb521865
commit 8bf728103b
5 changed files with 48 additions and 26 deletions

View File

@ -39,7 +39,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 ```bash

View File

@ -1,4 +1,5 @@
## 自定义网桥 ## 自定义网桥
除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。 除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。
在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。 在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。
@ -10,13 +11,17 @@ $ 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 ```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 ```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
@ -24,12 +29,17 @@ $ ip addr show bridge0
inet 192.168.5.1/24 scope global bridge0 inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever valid_lft forever preferred_lft forever
``` ```
配置 Docker 服务,默认桥接到创建的网桥上。
```bash 在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo systemctl start docker ```json
{
"bridge": "bridge0",
}
``` ```
启动 Docker 服务。 启动 Docker 服务。
新建一个容器,可以看到它已经桥接到了 `bridge0` 上。 新建一个容器,可以看到它已经桥接到了 `bridge0` 上。
可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr``ip route` 命令来查看 IP 地址配置和路由信息。 可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr``ip route` 命令来查看 IP 地址配置和路由信息。

View File

@ -1,12 +1,16 @@
## 配置 docker0 网桥 ## 配置 docker0 网桥
Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。 Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU接口允许接收的最大传输单元通常是 1500 Bytes或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。 Docker 默认指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU接口允许接收的最大传输单元通常是 1500 Bytes或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。
* `--bip=CIDR` -- IP 地址加掩码格式,例如 192.168.1.5/24
* `--mtu=BYTES` -- 覆盖默认的 Docker mtu 配置 * `--bip=CIDR` IP 地址加掩码格式,例如 192.168.1.5/24
* `--mtu=BYTES` 覆盖默认的 Docker mtu 配置
也可以在配置文件中配置 DOCKER_OPTS然后重启服务。 也可以在配置文件中配置 DOCKER_OPTS然后重启服务。
由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。 由于目前 Docker 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。
```bash ```bash
$ sudo brctl show $ sudo brctl show
bridge name bridge id STP enabled interfaces bridge name bridge id STP enabled interfaces
@ -17,6 +21,7 @@ docker0 8000.3a1d7362b4ee no veth65f9
每次创建一个新容器的时候Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。 每次创建一个新容器的时候Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。
```bash ```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
@ -29,5 +34,4 @@ $ ip addr show eth0
$ ip route $ ip route
default via 172.17.42.1 dev eth0 default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3
$ exit
``` ```

View File

@ -46,7 +46,12 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.
注意: 注意:
* 这里的规则映射了 0.0.0.0,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port` 或 `-p * 这里的规则映射了 `0.0.0.0`,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port``-p IP::port` 来指定允许访问容器的主机上的 IP、接口等以制定更严格的规则。
IP::port` 来指定允许访问容器的主机上的 IP、接口等以制定更严格的规则。
* 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之后重启 Docker 服务即可生效。 * 如果希望永久绑定到某个固定的 IP 地址,可以在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容。
```json
{
"ip": "0.0.0.0"
}
```

View File

@ -3,21 +3,24 @@
下面是一个跟 Docker 网络相关的命令列表。 下面是一个跟 Docker 网络相关的命令列表。
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。 其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
* `-b BRIDGE or --bridge=BRIDGE` --指定容器挂载的网桥
* `--bip=CIDR` --定制 docker0 的掩码
* `-H SOCKET... or --host=SOCKET...` --Docker 服务端接收命令的通道
* `--icc=true|false` --是否支持容器之间进行通信
* `--ip-forward=true|false` --请看下文容器之间的通信
* `--iptables=true|false` --是否允许 Docker 添加 iptables 规则
* `--mtu=BYTES` --容器网络中的 MTU
下面2个命令选项既可以在启动服务时指定也可以 Docker 容器启动(`docker run`)时候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 `docker run` 时可以覆盖设置的默认值。 * `-b BRIDGE``--bridge=BRIDGE` 指定容器挂载的网桥
* `--dns=IP_ADDRESS...` --使用指定的DNS服务器 * `--bip=CIDR` 定制 docker0 的掩码
* `--dns-search=DOMAIN...` --指定DNS搜索域 * `-H SOCKET...``--host=SOCKET...` Docker 服务端接收命令的通道
* `--icc=true|false` 是否支持容器之间进行通信
* `--ip-forward=true|false` 请看下文容器之间的通信
* `--iptables=true|false` 是否允许 Docker 添加 iptables 规则
* `--mtu=BYTES` 容器网络中的 MTU
下面2个命令选项既可以在启动服务时指定也可以在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 `docker run` 时可以覆盖设置的默认值。
* `--dns=IP_ADDRESS...` 使用指定的DNS服务器
* `--dns-search=DOMAIN...` 指定DNS搜索域
最后这些选项只有在 `docker run` 执行时使用,因为它是针对容器的特性内容。 最后这些选项只有在 `docker run` 执行时使用,因为它是针对容器的特性内容。
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主机名
* `--link=CONTAINER_NAME:ALIAS` --添加到另一个容器的连接 * `-h HOSTNAME``--hostname=HOSTNAME` 配置容器主机名
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的桥接模式 * `--link=CONTAINER_NAME:ALIAS` 添加到另一个容器的连接
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主机 * `--net=bridge|none|container:NAME_or_ID|host` 配置容器的桥接模式
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主机 * `-p SPEC``--publish=SPEC` 映射容器端口到宿主主机
* `-P or --publish-all=true|false` 映射容器所有端口到宿主主机