学习Docker(2017-10-9)

来源:互联网 发布:直销奖金制度软件 编辑:程序博客网 时间:2024/06/15 14:23

本节目录:
- 高级网络配置
- 快速配置指南
- 配置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 服务启动的时候才能配置,而且不能马上生效

-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)

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

--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 (映射容器所有端口到宿主主机)

配置 DNS

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

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

-h HOSTNAME or --hostname=HOSTNAME

会被写到容器内的 /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 可以执行,但是文件查看还是很麻烦

原创粉丝点击