网络概述

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

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

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

用户定义的网络

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

以下示例使用bridgenetwork driver 和 在创建的网络中运行容器:

$ 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 地址。

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

容器网络

除了用户定义的网络之外,您还可以将一个容器附加到另一个容器 容器的联网堆栈,直接使用--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 createdocker 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 地址分配。 每个网络还具有默认子网掩码和网关。

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

同样,容器的主机名默认为 Docker 中的容器 ID。 您可以使用--hostname. 使用docker network connect, 您可以使用--alias标志为该网络上的容器指定其他网络别名。

DNS 服务

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

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

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

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

自定义主机

您的容器将在/etc/hosts它们定义了 容器本身,以及localhost以及其他一些常见的东西。习惯 主机, 定义于/etc/hosts在主机上,不会由 器皿。要将其他主机传递到容器中,请参阅将条目添加到 container hosts 文件中docker run参考文档。

代理服务器

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