www.icesr.com
IT运维工程师的摇篮

学习Docker(2017-10-9)

本节目录:
– 高级网络配置
– 快速配置指南
– 配置DNS
– 容器访问控制
– 端口映射实现
– 配置 docker0 网桥
– 自定义网桥

高级网络配置

当 docker 启动时,会自动创建一个 docker0 虚拟网桥,实际上是 Linux 的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(zai RFC 1918 中定义)中的一个地址给 docker0 接口.
比如:
172.17.42.1,掩码为255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个Docker 容器的时候,同时创建一对 veth pair 接口。这对端口一段在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头,通过这个方式,主机可以跟容器通信,容器之间也可以相互通信。 Docker 就创建了在主机和所以容器之间的虚拟共享网络

关于1 RFC 1918
关于2 RFC 1918
veth pair

快速配置指南

下面关于 Docker 网络相关的命令列表。
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效

<code>-<span class="ruby">b <span class="hljs-constant">BRIDGE</span> <span class="hljs-keyword">or</span> --bridge=<span class="hljs-constant">BRIDGE</span> (指定容器挂载的网桥)
</span>-<span class="ruby">-bip=<span class="hljs-constant">CIDR</span> (定制 docker<span class="hljs-number">0</span> 的掩码)
</span>-<span class="ruby"><span class="hljs-constant">H</span> <span class="hljs-constant">SOCKET</span>... <span class="hljs-keyword">or</span> --host=<span class="hljs-constant">SOCKET</span>... (<span class="hljs-constant">Docker</span> 服务端接收命令的通道)
</span>-<span class="ruby">-icc=<span class="hljs-keyword">true</span>|<span class="hljs-keyword">false</span> (是否支持容器之间进行通信)
</span>-<span class="ruby">-ip-forward=<span class="hljs-keyword">true</span>|<span class="hljs-keyword">false</span> (请看下文容器之间的通信)
</span>-<span class="ruby">-iptables=<span class="hljs-keyword">true</span>|<span class="hljs-keyword">false</span> (是否允许 <span class="hljs-constant">Docker</span> 添加 iptables 规则)
</span>-<span class="ruby">-mtu=<span class="hljs-constant">BYTES</span> (容器网络中的 <span class="hljs-constant">MTU</span>)</span></code>

下面两个命令在启动服务时指定,也可以在 Docker 容器启动指定

<code>-<span class="ruby">-dns=<span class="hljs-constant">IP_ADDRESS</span>... (使用指定的<span class="hljs-constant">DNS</span>服务器)
</span>-<span class="ruby">-dns-search=<span class="hljs-constant">DOMAIN</span>... (指定<span class="hljs-constant">DNS</span>搜索域)</span></code>

下面的选项只有在 docker run 命令下执行,因为它们是针对容器的特性内容。

<code>-<span class="ruby">h <span class="hljs-constant">HOSTNAME</span> <span class="hljs-keyword">or</span> --hostname=<span class="hljs-constant">HOSTNAME</span> (配置容器主机名)
</span>-<span class="ruby">-link=<span class="hljs-constant">CONTAINER_NAME</span><span class="hljs-symbol">:ALIAS</span> (添加到另一个容器的连接)
</span>-<span class="ruby">-net=bridge|none|<span class="hljs-symbol">container:</span><span class="hljs-constant">NAME_or_ID</span>|host (配置容器的桥接模式)
</span>-<span class="ruby">p <span class="hljs-constant">SPEC</span> <span class="hljs-keyword">or</span> --publish=<span class="hljs-constant">SPEC</span> (映射容器端口到宿主主机)
</span>-<span class="ruby"><span class="hljs-constant">P</span> <span class="hljs-keyword">or</span> --publish-all=<span class="hljs-keyword">true</span>|<span class="hljs-keyword">false</span> (映射容器所有端口到宿主主机)</span></code>

配置 DNS

Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢?利用虚拟文件挂载容器的 3 个相关配置文件。在容器中使用 mount 命令可以看到挂载信息。

这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 dns 配置通过 /etc/resolv.conf 文件立即得到更新。如果想要手动指定容器的配置。可以使用下面的选项。

<code>-<span class="ruby">h <span class="hljs-constant">HOSTNAME</span> <span class="hljs-keyword">or</span> --hostname=<span class="hljs-constant">HOSTNAME</span></span></code>

会被写到容器内的 /etc/hostname 和 /etc/hosts 但在容器外看不到,即不会再 docker ps 中显示,也不会在其他的容器的 /etc/hosts 看到

–link=CONTAINER_NAME:ALIAS 选项会在创建容器的时候,添加一个其他容器的主机名到 /etc/hosts 文件中,使用主机名 alias 就可以连接它

–dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 的主机名

–dns-search=DOMAIN 设定容器的搜索域,当设定的搜索域为 .example.com ,在搜索一个名为 host 的主机,DNS 不仅搜索 host,还会搜索 host.example.com

默认用主机上的 /etc/resolv.conf 来配置容器

容器访问控制

容器访问控制,主要通过 Linux 上的 自带防火墙 iptables 进行管理和实现

容器访问外部网络
需要本地系统的转发支持

sysctl net.ipv4.ip_forward

如果为 0 ,说明没有开启转发,需要手动开启

sysctl -w net.ipv4.ip_forward=1

在启动 Docker 服务的时候设定 –ip-forward=true,
就会自动设置为 1 。

容器之间的访问
1. 容器之间网络拓补是否互联
2. 本地系统的防火软件 iptables 是否允许通过

访问所有端口
当启动 Docker 服务时,添加 iptables 的 FORWARD 链上。策略通过还是禁止取决于配置 –cc=true 还是 –cc=false 则不会添加 iptables 规则。

访问指定端口

再通过 –icc=false 关闭网络访问后,还可以通过 –link=CONTAINER_NAME:ALIAS 选项来访问容器的开放端口。

CONTAINER_NAME 必须是 Docker 分配的名字,或使用 –name 参数指定的名字。主机名则不会被识别

映射容器端口到宿主主机的实现

默认情况下容器可以访问外部网络,但是外部不能访问容器

容器访问外部实现

因为 windows 无法识别 iptables 这部分放弃了 ┭┮﹏┭┮ 我想换系统

配置 docker0 网桥

Docker 默认制定了 docker0 接口的 IP 地址和子网掩码,让主机和容器之间可以通过网桥互相通信,他们还给出了 MTU (接口允许接受的最大的传输单元),通常是 1500 Bytes

–bip=CIDR – IP 地址加掩码格式

–mtu=BYTES – 覆盖默认的 Docker mtu 配置 也可以在配置文件中配置 DOCKER_OPTS 然后重启服务。

每次创建一个新的容器的时候,Docker 从可用的地址段中选择一个空闲的 IP 地址分配给容器的 eth0 端口。使用本地主机上 docker0 接口的 IP 作为所以容器的默认网关。

自定义网桥

除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器
,使用 -b BRIDGE 或 –bridge=BRIDGE 来指定使用的网桥
。如果服务已经运行,需要停止服务,并删除旧的网桥


o(╥﹏╥)o 总结不下去,windows根本用不了,这本书让我好蛋疼啊,前面还介绍了 windows 后面直接全部 Linux 下的命令。
但是通过进入bash 可以执行,但是文件查看还是很麻烦

未经允许不得转载:冰点网络 » 学习Docker(2017-10-9)

分享到:更多 ()

评论 抢沙发

评论前必须登录!