启用IPv6支持
在Docker容器或swarm服务中使用IPv6之前,需要在Docker守护程序中启用IPv6支持。之后,您可以选择将IPv4或IPv6(或两者)与任何容器,服务或网络一起使用。
注意:仅在Linux主机上运行的Docker守护程序上支持IPv6网络。
- 编辑
/etc/docker/daemon.json
并将ipv6
设置为true
。
{
"ipv6": true
}
保存文件。
- 重新加载Docker配置文件。
$ systemctl reload docker
您现在可以使用该--ipv6
标志创建网络,并使用该--ip6
标志分配容器IPv6地址。
Docker和iptables
在Linux上,Docker操纵iptables
规则以提供网络隔离。这是一个实现细节,您不应该修改Docker插入iptables
策略的规则。
在Docker规则之前添加iptables策略
Docker的所有iptables
规则都被添加到DOCKER
链中。不要手动操作此表。如果您需要添加在Docker规则之前加载的规则,请将它们添加到DOCKER-USER
链中。在Docker自动创建任何规则之前加载这些规则。
限制与Docker守护程序的连接
默认情况下,允许所有外部源IP连接到Docker守护程序。要仅允许特定IP或网络访问容器,请在DOCKER过滤器链的顶部插入否定规则。例如,以下规则限制对除192.168.1.1之外的所有IP地址的外部访问:
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP
您可以改为允许来自源子网的连接。以下规则仅允许从子网192.168.1.0/24进行访问:
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP
最后,您可以指定要接受的IP地址范围--src-range
(记住还要-m iprange
在使用时添加--src-range
或--dst-range
):
$ iptables -I DOCKER-USER -m iprange -i ext_if ! --src-range 192.168.1.1-192.168.1.3 -j DROP
iptables
复杂,更复杂的规则超出了本主题的范围。有关 更多信息,请参见Netfilter.org HOWTO。
要防止Docker完全操作iptables
策略,请将iptables
设置 为false
在/etc/docker/daemon.json
。这对大多数用户来说是不合适的,因为这些iptables
策略需要手动管理。
集装箱网络
容器使用的网络类型(无论是网桥, 覆盖,macvlan网络还是自定义网络插件)在容器内是透明的。从容器的角度来看,它具有网络接口,包括IP地址,网关,路由表,DNS服务和其他网络详细信息(假设容器未使用none
网络驱动程序)。本主题是从容器的角度来看网络问题。
发布的端口
默认情况下,当您创建容器时,它不会将其任何端口发布到外部世界。要使端口可用于Docker之外的服务,或者未连接到容器网络的Docker容器,请使用 --publish
或-p
标记。这将创建一个防火墙规则,将容器端口映射到Docker主机上的端口。这里有些例子。
标志值 | 描述 |
| 将容器中的TCP端口80映射到Docker主机上的端口8080。 |
| 将容器中的TCP端口80映射到Docker主机上的端口8080,以连接到主机IP 192.168.1.100。 |
| 将容器中的UDP端口80映射到Docker主机上的端口8080。 |
| 将容器中的TCP端口80映射到Docker主机上的TCP端口8080,并将容器中的UDP端口80映射到Docker主机上的UDP端口8080。 |
IP地址和主机名
默认情况下,为容器分配连接到的每个Docker网络的IP地址。IP地址是从分配网络的池中分配的,因此Docker守护进程实际上充当每个容器的DHCP服务器。每个网络还具有默认子网掩码和网关。
当容器启动时,它只能使用连接到单个网络 --network
。但是,您可以使用运行容器连接到多个网络docker network connect
。
使用时将现有容器连接到其他网络时 docker network connect
,可以使用该命令上的--ip
或--ip6
标志来指定其他网络上容器的IP地址。
同样,容器的主机名默认为Docker中容器的名称。您可以使用覆盖主机名--hostname
。使用时连接到现有网络时docker network connect
,可以使用该--alias
标志为该网络上的容器指定其他网络别名。
DNS服务
默认情况下,容器继承Docker守护程序的DNS设置,包括/etc/hosts
和/etc/resolv.conf
。您可以基于每个容器覆盖这些设置。
旗 | 描述 |
| DNS服务器的IP地址。要指定多个DNS服务器,请使用多个 |
| 用于搜索非完全限定主机名的DNS搜索域。要指定多个DNS搜索前缀,请使用多个 |
| 表示DNS选项及其值的键值对。有关 |
| 容器用于自身的主机名。如果未指定,则默认为容器的名称。 |
配置Docker以使用代理服务器
如果您的容器需要使用HTTP,HTTPS或FTP代理服务器,则可以通过不同方式对其进行配置:
- 在Docker 17.07及更高版本中,您可以 将Docker客户端配置为自动将代理信息传递给容器。
- 在Docker 17.06及更低版本中,您必须 在容器中设置适当的环境变量。您可以在构建映像时(这使图像不那么便携)或创建或运行容器时执行此操作。
配置Docker客户端
- 在Docker客户端上,
~/.docker/config.json
在启动容器的用户的主目录中创建或编辑该文件。添加如下所示的JSON,用httpsProxy
或ftpProxy
在必要时替换代理类型,并替换代理服务器的地址和端口。您可以同时配置多个代理服务器。
您可以选择通过将noProxy
设置为一个或多个以逗号分隔的IP地址或主机来排除主机或范围通过代理服务器。*
支持将该字符用作通配符,如此示例所示。
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:3001",
"noProxy": "*.test.example.com,.example2.com"
}
}
}
保存文件。
- 创建或启动新容器时,会在容器中自动设置环境变量。
使用环境变量
手动设置环境变量
在构建映像时,或在创建或运行容器时使用标志--env 时,可以将以下一个或多个变量设置为适当的值。此方法使镜像的可移植性降低,因此如果您使用Docker 17.07或更高版本,则应该配置Docker客户端。
变量 | Dockerfile示例 |
|
|
|
|
|
|
|
|
|
|
|
|
|