网络概述

容器联网是指容器连接到 和 相互通信,或与非 Docker 工作负载通信。

容器默认启用联网,并且它们可以将 连接。容器没有关于它是哪种网络的信息 附加到 Docker 工作负载,或者它们的对等节点是否也是 Docker 工作负载。一个 容器只能看到具有 IP 地址、网关、 路由表、DNS 服务和其他网络详细信息。也就是说,除非 container 使用网络驱动程序。none

本页从容器的角度描述了网络, 以及有关容器联网的概念。 本页不介绍有关 Docker 网络工作原理的特定于操作系统的详细信息。 有关 Docker 如何在 Linux 上操作规则的信息, 请参阅数据包筛选和防火墙iptables

用户定义的网络

您可以创建自定义的用户定义网络,并连接多个容器 连接到同一网络。一旦连接到用户定义的网络,容器就可以 使用容器 IP 地址或容器名称相互通信。

以下示例使用网络驱动程序创建一个网络,并且 在创建的网络中运行容器:bridge

$ docker network create -d bridge my-net
$ docker run --network=my-net -itd --name=container3 busybox

司机

默认情况下,以下网络驱动程序可用,并提供核心 联网功能:

司机描述
bridge默认网络驱动程序。
host消除容器和 Docker 主机之间的网络隔离。
none将容器与主机和其他容器完全隔离。
overlay覆盖网络将多个 Docker 守护程序连接在一起。
ipvlanIPvlan 网络提供对 IPv4 和 IPv6 寻址的完全控制。
macvlan为容器分配 MAC 地址。

有关不同驱动程序的更多信息,请参阅网络驱动程序 概述

容器网络

除了用户定义的网络之外,您还可以将一个容器附加到另一个容器 容器的网络堆栈,使用 flag 格式。--network container:<name|id>

使用联网模式的容器不支持以下标志:container:

  • --add-host
  • --hostname
  • --dns
  • --dns-search
  • --dns-option
  • --mac-address
  • --publish
  • --publish-all
  • --expose

以下示例运行一个 Redis 容器,将 Redis 绑定到 ,然后运行命令并连接到 Redis server 的localhostredis-clilocalhost

$ 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

已发布的端口

默认情况下,当您使用 或 创建或运行容器时, 桥接网络上的容器不会向外界公开任何端口。 使用 or 标志使端口可供服务 在桥接网络之外。 这将在主机中创建防火墙规则, 将容器端口映射到 Docker 主机上的端口到外部世界。 以下是一些示例:docker createdocker run--publish-p

标志值描述
-p 8080:80将 Docker 主机上的端口映射到容器中的 TCP 端口。808080
-p 192.168.1.100:8080:80将 Docker 主机 IP 上的端口映射到容器中的 TCP 端口。8080192.168.1.10080
-p 8080:80/udp将 Docker 主机上的端口映射到容器中的 UDP 端口。808080
-p 8080:80/tcp -p 8080:80/udp将 Docker 主机上的 TCP 端口映射到容器中的 TCP 端口,并将 Docker 主机上的 UDP 端口映射到容器中的 UDP 端口。808080808080

重要

默认情况下,发布容器端口是不安全的。含义,当您发布时 容器的端口,它不仅可以对 Docker 主机使用,而且可以 外面的世界也是如此。

如果将 localhost IP 地址(或 )与 publish 标志,则只有 Docker 主机及其容器可以访问 发布 Container Port。127.0.0.1::1

$ 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 地址分配。 每个网络还具有默认子网掩码和网关。

您可以将正在运行的容器连接到多个网络, 通过在创建容器时多次传递标志, 或者对已在运行的容器使用该命令。 在这两种情况下,您都可以使用 or 标志来指定容器在该特定网络上的 IP 地址。--networkdocker network connect--ip--ip6

同样,容器的主机名默认为 Docker 中的容器 ID。 您可以使用 覆盖主机名。 使用 连接到现有网络时, 您可以使用该标志为该网络上的容器指定其他网络别名。--hostnamedocker network connect--alias

DNS 服务

默认情况下,容器使用与主机相同的 DNS 服务器,但您可以 用 .--dns

默认情况下,容器会继承配置文件中定义的 DNS 设置。 连接到默认网络的容器会收到此文件的副本。 连接到自定义网络的容器使用 Docker 的嵌入式 DNS 服务器。 嵌入式 DNS 服务器将外部 DNS 查找转发到主机上配置的 DNS 服务器。/etc/resolv.confbridge

您可以基于每个容器配置 DNS 解析,使用用于启动容器的 or 命令的标志。 下表描述了与 DNS 相关的可用标志 配置。docker rundocker createdocker run

描述
--dnsDNS 服务器的 IP 地址。要指定多个 DNS 服务器,请使用多个标志。DNS 请求将从容器的网络命名空间转发,例如,引用容器自己的环回地址。--dns--dns=127.0.0.1
--dns-searchDNS 搜索域,用于搜索非完全限定主机名。要指定多个 DNS 搜索前缀,请使用多个标志。--dns-search
--dns-opt表示 DNS 选项及其值的键值对。有关有效选项,请参阅您的操作系统文档。resolv.conf
--hostname容器用于自身的主机名。如果未指定,则默认为容器的 ID。

自定义主机

您的容器将包含定义 容器本身,以及其他一些常见的东西。习惯 主机上定义的主机不会由 器皿。要将其他主机传递到容器中,请参阅将条目添加到 container hosts 文件/etc/hostslocalhost/etc/hostsdocker run

代理服务器

如果您的容器需要使用代理服务器,请参阅使用代理服务器