网络概述
容器联网是指容器连接到 和 相互通信,或与非 Docker 工作负载通信。
容器默认启用联网,并且它们可以将
连接。容器没有关于它是哪种网络的信息
附加到 Docker 工作负载,或者它们的对等节点是否也是 Docker 工作负载。一个
容器只能看到具有 IP 地址、网关、
路由表、DNS 服务和其他网络详细信息。也就是说,除非
容器使用none
网络驱动程序。
本页从容器的角度描述了网络,
以及有关容器联网的概念。
本页不介绍有关 Docker 网络工作原理的特定于作系统的详细信息。
有关 Docker 如何作的信息iptables
rules 在 Linux 上,
请参阅数据包筛选和防火墙。
用户定义的网络
您可以创建自定义的用户定义网络,并连接多个容器 连接到同一网络。一旦连接到用户定义的网络,容器就可以 使用容器 IP 地址或容器名称相互通信。
以下示例使用bridge
network driver 和
在创建的网络中运行容器:
$ docker network create -d bridge my-net
$ docker run --network=my-net -itd --name=container3 busybox
司机
默认情况下,以下网络驱动程序可用,并提供核心 联网功能:
司机 | 描述 |
---|---|
bridge | 默认网络驱动程序。 |
host | 消除容器和 Docker 主机之间的网络隔离。 |
none | 将容器与主机和其他容器完全隔离。 |
overlay | 覆盖网络将多个 Docker 守护程序连接在一起。 |
ipvlan | IPvlan 网络提供对 IPv4 和 IPv6 寻址的完全控制。 |
macvlan | 为容器分配 MAC 地址。 |
有关不同驱动程序的更多信息,请参阅网络驱动程序 概述。
容器网络
除了用户定义的网络之外,您还可以将一个容器附加到另一个容器
容器的联网堆栈,直接使用--network container:<name|id>
flag 格式。
使用container:
联网模式:
--add-host
--hostname
--dns
--dns-search
--dns-option
--mac-address
--publish
--publish-all
--expose
以下示例运行一个 Redis 容器,并将 Redis 绑定到localhost
,然后运行redis-cli
命令并连接到 Redis
server 通过localhost
接口。
$ docker run -d --name redis example/redis --bind 127.0.0.1
$ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
已发布的端口
默认情况下,当您使用docker create
或docker run
,
桥接网络上的容器不会向外界公开任何端口。
使用--publish
或-p
标志,使端口可供服务
在桥接网络之外。
这将在主机中创建防火墙规则,
将容器端口映射到 Docker 主机上的端口到外部世界。
以下是一些示例:
标志值 | 描述 |
---|---|
-p 8080:80 | 地图端口8080 在 Docker 主机上连接到 TCP 端口80 在容器中。 |
-p 192.168.1.100:8080:80 | 地图端口8080 在 Docker 主机 IP 上192.168.1.100 到 TCP 端口80 在容器中。 |
-p 8080:80/udp | 地图端口8080 在 Docker 主机上到 UDP 端口80 在容器中。 |
-p 8080:80/tcp -p 8080:80/udp | 映射 TCP 端口8080 在 Docker 主机上连接到 TCP 端口80 ,并将 UDP 端口8080 在 Docker 主机上到 UDP 端口80 在容器中。 |
重要
默认情况下,发布容器端口是不安全的。含义,当您发布时 容器的端口,它不仅可以对 Docker 主机使用,而且可以 外面的世界也是如此。
如果包含 localhost IP 地址 (
127.0.0.1
或::1
) 替换为 publish 标志,则只有 Docker 主机及其容器可以访问 发布 Container Port。$ docker run -p 127.0.0.1:8080:80 -p '[::1]:8080:80' nginx
警告
同一 L2 Segment 中的主机(例如,连接到同一 网络交换机)可以访问发布到 localhost 的端口。 有关更多信息,请参阅 moby/moby#45610
如果要使容器可供其他容器访问, 无需发布容器的端口。 您可以通过将容器连接到 同一网络,通常是桥接网络。
主机的 IPv6 地址上的端口将映射到容器的 IPv4 地址
如果端口映射中没有给出主机 IP,则桥接网络仅支持 IPv4,
和--userland-proxy=true
(默认)。
有关端口映射的更多信息,包括如何禁用它并使用 直接路由到容器,请参阅数据包筛选和防火墙。
IP 地址和主机名
默认情况下,容器会为其附加到的每个 Docker 网络获取一个 IP 地址。 容器从网络的 IP 子网接收 IP 地址。 Docker 守护程序为容器执行动态子网划分和 IP 地址分配。 每个网络还具有默认子网掩码和网关。
您可以将正在运行的容器连接到多个网络,
或者通过将--network
flag 的
或使用docker network connect
命令。
在这两种情况下,您都可以使用--ip
或--ip6
标志来指定容器在该特定网络上的 IP 地址。
同样,容器的主机名默认为 Docker 中的容器 ID。
您可以使用--hostname
.
使用docker network connect
,
您可以使用--alias
标志为该网络上的容器指定其他网络别名。
DNS 服务
默认情况下,容器使用与主机相同的 DNS 服务器,但您可以
用 override this with--dns
.
默认情况下,容器会继承/etc/resolv.conf
配置文件。
附加到默认bridge
network 接收此文件的副本。
连接到自定义网络的容器使用 Docker 的嵌入式 DNS 服务器。
嵌入式 DNS 服务器将外部 DNS 查找转发到主机上配置的 DNS 服务器。
您可以基于每个容器配置 DNS 解析,使用docker run
或docker create
命令来启动容器。
下表描述了可用的docker run
与 DNS 相关的标志
配置。
旗 | 描述 |
---|---|
--dns | DNS 服务器的 IP 地址。要指定多个 DNS 服务器,请使用多个--dns 标志。DNS 请求将从容器的网络命名空间转发,例如,--dns=127.0.0.1 引用容器自己的 loopback 地址。 |
--dns-search | DNS 搜索域,用于搜索非完全限定主机名。要指定多个 DNS 搜索前缀,请使用多个--dns-search 标志。 |
--dns-opt | 表示 DNS 选项及其值的键值对。请参阅您的作系统文档resolv.conf 以获取有效选项。 |
--hostname | 容器用于自身的主机名。如果未指定,则默认为容器的 ID。 |
自定义主机
您的容器将在/etc/hosts
它们定义了
容器本身,以及localhost
以及其他一些常见的东西。习惯
主机, 定义于/etc/hosts
在主机上,不会由
器皿。要将其他主机传递到容器中,请参阅将条目添加到
container hosts 文件中的docker run
参考文档。
代理服务器
如果您的容器需要使用代理服务器,请参阅使用代理服务器。