diff --git a/advanced_network/access_control.md b/advanced_network/access_control.md index 9e79077..b3d0b9e 100644 --- a/advanced_network/access_control.md +++ b/advanced_network/access_control.md @@ -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` 规则。 ```bash diff --git a/advanced_network/bridge.md b/advanced_network/bridge.md index 1d5a0b0..31e24b1 100644 --- a/advanced_network/bridge.md +++ b/advanced_network/bridge.md @@ -1,4 +1,5 @@ ## 自定义网桥 + 除了默认的 `docker0` 网桥,用户也可以指定网桥来连接各个容器。 在启动 Docker 服务的时候,使用 `-b BRIDGE`或`--bridge=BRIDGE` 来指定使用的网桥。 @@ -10,13 +11,17 @@ $ 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: 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 valid_lft forever preferred_lft forever ``` -配置 Docker 服务,默认桥接到创建的网桥上。 -```bash -$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker -$ sudo systemctl start docker + +在 Docker 配置文件 `/etc/docker/daemon.json` 中添加如下内容,即可将 Docker 默认桥接到创建的网桥上。 + +```json +{ + "bridge": "bridge0", +} ``` + 启动 Docker 服务。 + 新建一个容器,可以看到它已经桥接到了 `bridge0` 上。 可以继续用 `brctl show` 命令查看桥接的信息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令来查看 IP 地址配置和路由信息。 diff --git a/advanced_network/docker0.md b/advanced_network/docker0.md index 129f297..99e5785 100644 --- a/advanced_network/docker0.md +++ b/advanced_network/docker0.md @@ -1,12 +1,16 @@ ## 配置 docker0 网桥 + Docker 服务默认会创建一个 `docker0` 网桥(其上有一个 `docker0` 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。 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 网桥是 Linux 网桥,用户可以使用 `brctl show` 来查看网桥和端口连接信息。 + ```bash $ sudo brctl show bridge name bridge id STP enabled interfaces @@ -17,6 +21,7 @@ docker0 8000.3a1d7362b4ee no veth65f9 每次创建一个新容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 `docker0` 接口的 IP 作为所有容器的默认网关。 + ```bash $ sudo docker run -i -t --rm base /bin/bash $ ip addr show eth0 @@ -29,5 +34,4 @@ $ ip addr show eth0 $ ip route default via 172.17.42.1 dev eth0 172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3 -$ exit ``` diff --git a/advanced_network/port_mapping.md b/advanced_network/port_mapping.md index ab03c84..8625e3a 100644 --- a/advanced_network/port_mapping.md +++ b/advanced_network/port_mapping.md @@ -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 -IP::port` 来指定允许访问容器的主机上的 IP、接口等,以制定更严格的规则。 +* 这里的规则映射了 `0.0.0.0`,意味着将接受主机来自所有接口的流量。用户可以通过 `-p IP:host_port:container_port` 或 `-p 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" +} +``` diff --git a/advanced_network/quick_guide.md b/advanced_network/quick_guide.md index c7db030..e326418 100644 --- a/advanced_network/quick_guide.md +++ b/advanced_network/quick_guide.md @@ -3,21 +3,24 @@ 下面是一个跟 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` 时可以覆盖设置的默认值。 -* `--dns=IP_ADDRESS...` --使用指定的DNS服务器 -* `--dns-search=DOMAIN...` --指定DNS搜索域 +* `-b BRIDGE` 或 `--bridge=BRIDGE` 指定容器挂载的网桥 +* `--bip=CIDR` 定制 docker0 的掩码 +* `-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` 执行时使用,因为它是针对容器的特性内容。 -* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主机名 -* `--link=CONTAINER_NAME:ALIAS` --添加到另一个容器的连接 -* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的桥接模式 -* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主机 -* `-P or --publish-all=true|false` --映射容器所有端口到宿主主机 + +* `-h HOSTNAME` 或 `--hostname=HOSTNAME` 配置容器主机名 +* `--link=CONTAINER_NAME:ALIAS` 添加到另一个容器的连接 +* `--net=bridge|none|container:NAME_or_ID|host` 配置容器的桥接模式 +* `-p SPEC` 或 `--publish=SPEC` 映射容器端口到宿主主机 +* `-P or --publish-all=true|false` 映射容器所有端口到宿主主机