diff --git a/advanced_network/dns.md b/advanced_network/dns.md index 2f16d0d..e8d8d3b 100644 --- a/advanced_network/dns.md +++ b/advanced_network/dns.md @@ -1,16 +1,14 @@ ## 配置 DNS -Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢? -秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。 +如何自定义配置容器的主机名和 DNS 呢?秘诀就是 Docker 利用虚拟文件来挂载容器的 3 个相关配置文件。 + +在容器中使用 `mount` 命令可以看到挂载信息: -在容器中使用 mount 命令可以看到挂载信息: ```bash $ mount -... /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... tmpfs on /etc/resolv.conf type tmpfs ... -... ``` 这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过 `/etc/resolv.conf` 文件立刻得到更新。 @@ -37,12 +35,9 @@ nameserver 8.8.8.8 如果用户想要手动指定容器的配置,可以利用下面的选项。 -`-h HOSTNAME or --hostname=HOSTNAME` -设定容器的主机名,它会被写到容器内的 `/etc/hostname` 和 `/etc/hosts`。但它在容器外部看不到,既不会在 `docker ps` 中显示,也不会在其他的容器的 `/etc/hosts` 看到。 +`-h HOSTNAME` 或者 `--hostname=HOSTNAME` 设定容器的主机名,它会被写到容器内的 `/etc/hostname` 和 `/etc/hosts`。但它在容器外部看不到,既不会在 `docker ps` 中显示,也不会在其他的容器的 `/etc/hosts` 看到。 -`--dns=IP_ADDRESS` -添加 DNS 服务器到容器的 `/etc/resolv.conf` 中,让容器用这个服务器来解析所有不在 `/etc/hosts` 中的主机名。 +`--dns=IP_ADDRESS` 添加 DNS 服务器到容器的 `/etc/resolv.conf` 中,让容器用这个服务器来解析所有不在 `/etc/hosts` 中的主机名。 -`--dns-search=DOMAIN` -设定容器的搜索域,当设定搜索域为 `.example.com` 时,在搜索一个名为 host 的主机时,DNS 不仅搜索host,还会搜索 `host.example.com`。 +`--dns-search=DOMAIN` 设定容器的搜索域,当设定搜索域为 `.example.com` 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 `host.example.com`。 注意:如果没有上述最后 2 个选项,Docker 会默认用主机上的 `/etc/resolv.conf` 来配置容器。 diff --git a/advanced_network/port_mapping.md b/advanced_network/port_mapping.md index b29162b..ab03c84 100644 --- a/advanced_network/port_mapping.md +++ b/advanced_network/port_mapping.md @@ -1,10 +1,13 @@ ## 映射容器端口到宿主主机的实现 默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。 + ### 容器访问外部实现 -容器所有到外部网络的连接,源地址都会被NAT成本地系统的IP地址。这是使用 `iptables` 的源地址伪装操作实现的。 + +容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址。这是使用 `iptables` 的源地址伪装操作实现的。 查看主机的 NAT 规则。 + ```bash $ sudo iptables -t nat -nL ... @@ -13,6 +16,7 @@ target prot opt source destination MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 ... ``` + 其中,上述规则将所有源地址在 `172.17.0.0/16` 网段,目标地址为其他网段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好处是它能动态从网卡获取地址。 ### 外部访问容器实现 @@ -22,6 +26,7 @@ MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16 不管用那种办法,其实也是在本地的 `iptable` 的 nat 表中添加相应的规则。 使用 `-P` 时: + ```bash $ iptables -t nat -nL ... @@ -31,13 +36,17 @@ DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:1 ``` 使用 `-p 80:80` 时: + ```bash $ iptables -t nat -nL Chain DOCKER (2 references) target prot opt source destination DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80 ``` + 注意: + * 这里的规则映射了 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 服务即可生效。 diff --git a/revision.md b/revision.md index ef8dd1d..cdc8fa1 100644 --- a/revision.md +++ b/revision.md @@ -7,7 +7,7 @@ * 0.9-rc2: 2017-12-10 * 更新 `CoreOS` 章节 - + * 0.9-rc1: 2017-11-30 * 根据最新版本(v17.09)修订内容 @@ -16,6 +16,7 @@ * 增加 `docker exec` 子命令介绍 * 增加 `docker` 管理子命令 `container` `image` `network` `volume` 介绍 * 增加 `树莓派单片电脑` 安装 Docker + * 增加 Docker 存储驱动 `OverlayFS` 相关内容 * 更新 `Docker CE` `v17.x` 安装说明 * 更新 `Docker 网络` 一节