目錄 搜尋
Compose About versions and upgrading (Compose) ASP.NET Core + SQL Server on Linux (Compose) CLI environment variables (Compose) Command-line completion (Compose) Compose(组成) Compose command-line reference(组合命令行参考) Control startup order (Compose) Django and PostgreSQL (Compose) Docker stacks and distributed application bundles (Compose) docker-compose build(docker-compose构建) docker-compose bundle docker-compose config docker-compose create docker-compose down docker-compose events docker-compose exec docker-compose help docker-compose images docker-compose kill docker-compose logs docker-compose pause docker-compose port docker-compose ps docker-compose pull docker-compose push docker-compose restart docker-compose rm docker-compose run docker-compose scale docker-compose start docker-compose stop docker-compose top docker-compose unpause docker-compose up Environment file (Compose) Environment variables in Compose Extend services in Compose Frequently asked questions (Compose) Getting started (Compose) Install Compose Link environment variables (deprecated) (Compose) Networking in Compose Overview of Docker Compose Overview of docker-compose CLI Quickstart: Compose and WordPress Rails and PostgreSQL (Compose) Sample apps with Compose Using Compose in production Using Compose with Swarm Engine .NET Core application (Engine) About images, containers, and storage drivers (Engine) Add nodes to the swarm (Engine) Apply custom metadata (Engine) Apply rolling updates (Engine) apt-cacher-ng Best practices for writing Dockerfiles (Engine) Binaries (Engine) Bind container ports to the host (Engine) Breaking changes (Engine) Build your own bridge (Engine) Configure container DNS (Engine) Configure container DNS in user-defined networks (Engine) CouchDB (Engine) Create a base image (Engine) Create a swarm (Engine) Customize the docker0 bridge (Engine) Debian (Engine) Default bridge network Delete the service (Engine) Deploy a service (Engine) Deploy services to a swarm (Engine) Deprecated Engine features Docker container networking (Engine) Docker overview (Engine) Docker run reference (Engine) Dockerfile reference (Engine) Dockerize an application Drain a node (Engine) Engine FAQ (Engine) Fedora (Engine) Get started (Engine) Get started with macvlan network driver (Engine) Get started with multi-host networking (Engine) How nodes work (Engine) How services work (Engine) Image management (Engine) Inspect the service (Engine) Install Docker (Engine) IPv6 with Docker (Engine) Join nodes to a swarm (Engine) Legacy container links (Engine) Lock your swarm (Engine) Manage nodes in a swarm (Engine) Manage sensitive data with Docker secrets (Engine) Manage swarm security with PKI (Engine) Manage swarm service networks (Engine) Migrate to Engine 1.10 Optional Linux post-installation steps (Engine) Overview (Engine) PostgreSQL (Engine) Raft consensus in swarm mode (Engine) Riak (Engine) Run Docker Engine in swarm mode Scale the service (Engine) SDKs (Engine) Select a storage driver (Engine) Set up for the tutorial (Engine) SSHd (Engine) Storage driver overview (Engine) Store service configuration data (Engine) Swarm administration guide (Engine) Swarm mode key concepts (Engine) Swarm mode overlay network security model (Engine) Swarm mode overview (Engine) Understand container communication (Engine) Use multi-stage builds (Engine) Use swarm mode routing mesh (Engine) Use the AUFS storage driver (Engine) Use the Btrfs storage driver (Engine) Use the Device mapper storage driver (Engine) Use the OverlayFS storage driver (Engine) Use the VFS storage driver (Engine) Use the ZFS storage driver (Engine) Engine: Admin Guide Amazon CloudWatch logs logging driver (Engine) Bind mounts (Engine) Collect Docker metrics with Prometheus (Engine) Configuring and running Docker (Engine) Configuring logging drivers (Engine) Control and configure Docker with systemd (Engine) ETW logging driver (Engine) Fluentd logging driver (Engine) Format command and log output (Engine) Google Cloud logging driver (Engine) Graylog Extended Format (GELF) logging driver (Engine) Journald logging driver (Engine) JSON File logging driver (Engine) Keep containers alive during daemon downtime (Engine) Limit a container's resources (Engine) Link via an ambassador container (Engine) Log tags for logging driver (Engine) Logentries logging driver (Engine) PowerShell DSC usage (Engine) Prune unused Docker objects (Engine) Run multiple services in a container (Engine) Runtime metrics (Engine) Splunk logging driver (Engine) Start containers automatically (Engine) Storage overview (Engine) Syslog logging driver (Engine) tmpfs mounts Troubleshoot volume problems (Engine) Use a logging driver plugin (Engine) Using Ansible (Engine) Using Chef (Engine) Using Puppet (Engine) View a container's logs (Engine) Volumes (Engine) Engine: CLI Daemon CLI reference (dockerd) (Engine) docker docker attach docker build docker checkpoint docker checkpoint create docker checkpoint ls docker checkpoint rm docker commit docker config docker config create docker config inspect docker config ls docker config rm docker container docker container attach docker container commit docker container cp docker container create docker container diff docker container exec docker container export docker container inspect docker container kill docker container logs docker container ls docker container pause docker container port docker container prune docker container rename docker container restart docker container rm docker container run docker container start docker container stats docker container stop docker container top docker container unpause docker container update docker container wait docker cp docker create docker deploy docker diff docker events docker exec docker export docker history docker image docker image build docker image history docker image import docker image inspect docker image load docker image ls docker image prune docker image pull docker image push docker image rm docker image save docker image tag docker images docker import docker info docker inspect docker kill docker load docker login docker logout docker logs docker network docker network connect docker network create docker network disconnect docker network inspect docker network ls docker network prune docker network rm docker node docker node demote docker node inspect docker node ls docker node promote docker node ps docker node rm docker node update docker pause docker plugin docker plugin create docker plugin disable docker plugin enable docker plugin inspect docker plugin install docker plugin ls docker plugin push docker plugin rm docker plugin set docker plugin upgrade docker port docker ps docker pull docker push docker rename docker restart docker rm docker rmi docker run docker save docker search docker secret docker secret create docker secret inspect docker secret ls docker secret rm docker service docker service create docker service inspect docker service logs docker service ls docker service ps docker service rm docker service scale docker service update docker stack docker stack deploy docker stack ls docker stack ps docker stack rm docker stack services docker start docker stats docker stop docker swarm docker swarm ca docker swarm init docker swarm join docker swarm join-token docker swarm leave docker swarm unlock docker swarm unlock-key docker swarm update docker system docker system df docker system events docker system info docker system prune docker tag docker top docker unpause docker update docker version docker volume docker volume create docker volume inspect docker volume ls docker volume prune docker volume rm docker wait Use the Docker command line (Engine) Engine: Extend Access authorization plugin (Engine) Docker log driver plugins Docker network driver plugins (Engine) Extending Engine with plugins Managed plugin system (Engine) Plugin configuration (Engine) Plugins API (Engine) Volume plugins (Engine) Engine: Security AppArmor security profiles for Docker (Engine) Automation with content trust (Engine) Content trust in Docker (Engine) Delegations for content trust (Engine) Deploying Notary (Engine) Docker security (Engine) Docker security non-events (Engine) Isolate containers with a user namespace (Engine) Manage keys for content trust (Engine) Play in a content trust sandbox (Engine) Protect the Docker daemon socket (Engine) Seccomp security profiles for Docker (Engine) Secure Engine Use trusted images Using certificates for repository client verification (Engine) Engine: Tutorials Engine tutorials Network containers (Engine) Get Started Part 1: Orientation Part 2: Containers Part 3: Services Part 4: Swarms Part 5: Stacks Part 6: Deploy your app Machine Amazon Web Services (Machine) Digital Ocean (Machine) docker-machine active docker-machine config docker-machine create docker-machine env docker-machine help docker-machine inspect docker-machine ip docker-machine kill docker-machine ls docker-machine provision docker-machine regenerate-certs docker-machine restart docker-machine rm docker-machine scp docker-machine ssh docker-machine start docker-machine status docker-machine stop docker-machine upgrade docker-machine url Driver options and operating system defaults (Machine) Drivers overview (Machine) Exoscale (Machine) Generic (Machine) Get started with a local VM (Machine) Google Compute Engine (Machine) IBM Softlayer (Machine) Install Machine Machine Machine CLI overview Machine command-line completion Machine concepts and help Machine overview Microsoft Azure (Machine) Microsoft Hyper-V (Machine) Migrate from Boot2Docker to Machine OpenStack (Machine) Oracle VirtualBox (Machine) Provision AWS EC2 instances (Machine) Provision Digital Ocean Droplets (Machine) Provision hosts in the cloud (Machine) Rackspace (Machine) VMware Fusion (Machine) VMware vCloud Air (Machine) VMware vSphere (Machine) Notary Client configuration (Notary) Common Server and signer configurations (Notary) Getting started with Notary Notary changelog Notary configuration files Running a Notary service Server configuration (Notary) Signer configuration (Notary) Understand the service architecture (Notary) Use the Notary client
文字

本节概述 Docker 的默认网络行为,包括默认创建的网络类型以及如何创建自己的用户定义网络。它还介绍了在单个主机上或跨主机集群创建网络所需的资源。

有关 Docker 如何与iptables在 linux 主机上,请参见码头工人iptables...

默认网络

当您安装 Docke r时,它会自动创建三个网络。您可以使用以下docker network ls命令列出这些网络:

$ docker network ls

NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                nullcf03ee007fb4        host                host

这三个网络都构建在 Docker 中。当你运行一个容器时,你可以使用该--network标志来指定你的容器应该连接到哪个网络。

bridge网络是指docker0存在于所有的码头工人安装网络。除非您使用该docker run --network=<NETWORK>选项另外指定,否则默认情况下,Docker 守护程序会将容器连接到此网络。通过使用主机上的ifconfig命令,您可以将此桥看作主机网络堆栈的一部分。

$ ifconfig

docker0   Link encap:Ethernet  HWaddr 02:42:47:bc:3a:eb
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:47ff:febc:3aeb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:17 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1100 (1.1 KB)  TX bytes:648 (648.0 B)

所述none网络增加了一个容器为特定容器的网络栈。该容器缺少网络接口。附着在这样一个容器上,看着它的堆栈,你会看到:

$ docker attach nonenetcontainer

root@0cb243cd1293:/# cat /etc/hosts127.0.0.1	localhost::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
root@0cb243cd1293:/# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)root@0cb243cd1293:/#

注意:您可以从容器中分离并使其保持运行状态CTRL-p CTRL-q

host网络增加了主机的网络堆栈上的容器。就网络而言,主机和容器之间没有隔离。例如,如果使用主机网络运行在端口80上运行 Web 服务器的容器,则 Web 服务器在主机的端口80上可用。

这些nonehost网络不能直接在 Docker 中配置。但是,您可以配置默认bridge网络以及您自己的用户定义网桥。

默认网桥

默认bridge网络存在于所有 Docker 主机上。如果您未指定其他网络,则新容器会自动连接到默认bridge网络。

docker network inspect命令返回有关网络的信息:

$ docker network inspect bridge[   {       "Name": "bridge",       "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",       "Scope": "local",       "Driver": "bridge",       "IPAM": {           "Driver": "default",           "Config": [               {                   "Subnet": "172.17.0.1/16",                   "Gateway": "172.17.0.1"               }           ]       },       "Containers": {},       "Options": {           "com.docker.network.bridge.default_bridge": "true",           "com.docker.network.bridge.enable_icc": "true",           "com.docker.network.bridge.enable_ip_masquerade": "true",           "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",           "com.docker.network.bridge.name": "docker0",           "com.docker.network.driver.mtu": "9001"       },       "Labels": {}   }]

运行以下两个命令来启动两个busybox容器,每个容器都连接到默认bridge网络。

$ docker run -itd --name=container1 busybox

3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c

$ docker run -itd --name=container2 busybox

94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c

bridge启动两个容器后再次检查网络。这两个busybox容器都连接到网络。记下它们的 IP 地址,这与主机上的 IP 地址不同,下面的例子会有所不同。

$ docker network inspect bridge{[    {        "Name": "bridge",        "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",        "Scope": "local",        "Driver": "bridge",        "IPAM": {            "Driver": "default",            "Config": [                {                    "Subnet": "172.17.0.1/16",                    "Gateway": "172.17.0.1"                }            ]        },        "Containers": {            "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": {                "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1",                "MacAddress": "02:42:ac:11:00:02",                "IPv4Address": "172.17.0.2/16",                "IPv6Address": ""            },            "94447ca479852d29aeddca75c28f7104df3c3196d7b6d83061879e339946805c": {                "EndpointID": "b047d090f446ac49747d3c37d63e4307be745876db7f0ceef7b311cbba615f48",                "MacAddress": "02:42:ac:11:00:03",                "IPv4Address": "172.17.0.3/16",                "IPv6Address": ""            }        },        "Options": {            "com.docker.network.bridge.default_bridge": "true",            "com.docker.network.bridge.enable_icc": "true",            "com.docker.network.bridge.enable_ip_masquerade": "true",            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",            "com.docker.network.bridge.name": "docker0",            "com.docker.network.driver.mtu": "9001"        },        "Labels": {}    }]

连接到默认bridge网络的容器可以通过 IP 地址相互通信。Docker 不支持在默认网桥上自动发现服务。如果您希望容器能够通过容器名称解析 IP 地址,则应该使用用户定义的网络。您可以使用旧版docker run --link选项将两个容器链接在一起,但在大多数情况下不建议这样做。

您可以attach运行container以查看容器内网络的外观。您连接为root,因此您的命令提示符是一个#字符。

$ docker attach container1

root@0cb243cd1293:/# ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1296 (1.2 KiB)  TX bytes:648 (648.0 B)lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

从容器内部,使用该ping命令测试到其他容器的 IP 地址的网络连接。

root@0cb243cd1293:/# ping -w3 172.17.0.3PING 172.17.0.3 (172.17.0.3): 56 data bytes64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.096 ms64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.080 ms64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.074 ms--- 172.17.0.3 ping statistics ---3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.083/0.096 ms

使用该cat命令查看/etc/hosts容器上的文件。这显示容器识别的主机名和 IP 地址。

root@0cb243cd1293:/# cat /etc/hosts172.17.0.2	3386a527aa08127.0.0.1	localhost::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters

要从container1容器中分离并保持运行,请使用键盘序列 CTRL-p CTRL-q。如果您愿意,请附加container2并重复上述命令。

默认docker0网桥支持使用端口映射并docker run --link允许网络中的容器之间的docker0通信。不建议使用这种方法。在可能的情况下,您应该使用用户定义的网桥。

用户定义的网络

建议使用用户定义的桥接网络来控制哪些容器可以相互通信,还可以启用将容器名称自动 DNS 解析为 IP 地址。Docker 提供用于创建这些网络的默认网络驱动程序。您可以创建新的网桥覆盖网络MACVLAN网络。您还可以创建网络插件远程网络以进行完整的自定义和控制。

您可以根据需要创建尽可能多的网络,并且您可以在任何给定时间将容器连接到零个或多个这些网络。另外,您可以在不重新启动容器的情况下连接和断开网络中正在运行的容器。当容器连接到多个网络时,其外部连接通过第一个非内部网络以词汇顺序提供。

接下来的几节将更详细地介绍 Docker 的每个内置网络驱动程序。

桥梁网络

一个bridge网络是网络在泊坞中使用的最常见的类型。桥梁网络类似于默认bridge网络,但添加一些新功能并删除一些旧功能。以下示例创建了一些桥接网络并对这些网络上的容器执行了一些实验。

$ docker network create --driver bridge isolated_nw

1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b

$ docker network inspect isolated_nw[    {        "Name": "isolated_nw",        "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",        "Scope": "local",        "Driver": "bridge",        "IPAM": {            "Driver": "default",            "Config": [                {                    "Subnet": "172.21.0.0/16",                    "Gateway": "172.21.0.1/16"                }            ]        },        "Containers": {},        "Options": {},        "Labels": {}    }]$ docker network ls

NETWORK ID          NAME                DRIVER
9f904ee27bf5        none                nullcf03ee007fb4        host                host
7fca4eb8c647        bridge              bridge
c5ee82f76de3        isolated_nw         bridge

创建网络后,可以使用该docker run --network=<NETWORK>选项在其上启动容器。

$ docker run --network=isolated_nw -itd --name=container3 busybox

8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c

$ docker network inspect isolated_nw[    {        "Name": "isolated_nw",        "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",        "Scope": "local",        "Driver": "bridge",        "IPAM": {            "Driver": "default",            "Config": [                {}            ]        },        "Containers": {            "8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c": {                "EndpointID": "93b2db4a9b9a997beb912d28bcfc117f7b0eb924ff91d48cfa251d473e6a9b08",                "MacAddress": "02:42:ac:15:00:02",                "IPv4Address": "172.21.0.2/16",                "IPv6Address": ""            }        },        "Options": {},        "Labels": {}    }]

您启动到此网络中的容器必须驻留在同一个 Docker 主机上。网络中的每个容器可以立即与网络中的其他容器进行通信。虽然,网络本身将容器与外部网络隔离开来。

在用户定义的网桥网络中,不支持连接.。你可以公开和发布集装箱港口在这个网络中的容器上。如果您想要使部分bridge外部网络可用的网络。

在希望在单个主机上运行相对较小的网络的情况下,桥接网络非常有用。但是,您可以通过创建网络来创建更大的overlay网络。

docker_gwbridge网络

docker_gwbridge是一个由 Docker 在两种不同情况下自动创建的本地桥接网络:

  • 初始化或加入群集时,Docker 会创建docker_gwbridge网络并将其用于不同主机上的群集节点之间的通信。

  • 当一个容器的网络都不能提供外部连接时,docker_gwbridge除容器的其他网络外,Docker 还将容器连接到网络,以便容器可以连接到外部网络或其他群集节点。

docker_gwbridge如果需要自定义配置,您可以提前创建网络,否则 Docker 会根据需要创建它。以下示例docker_gwbridge使用一些自定义选项创建网络。

$ docker network create --subnet 172.30.0.0/16 \                        --opt com.docker.network.bridge.name=docker_gwbridge \--opt com.docker.network.bridge.enable_icc=false \
			docker_gwbridge

docker_gwbridge使用overlay网络时,网络始终存在。

以群模式覆盖网络

您可以在没有外部键值存储的情况下在以群集模式运行的管理器节点上创建覆盖网络。群体使覆盖网络只能用于群体中需要服务的节点。当您创建使用覆盖网络的服务时,管理器节点会自动将覆盖网络扩展到运行服务任务的节点。

要了解有关在群集模式下运行 Docker 引擎的更多信息,请参阅群集模式概述。

下面的例子显示了如何创建一个网络并将其用于群中管理器节点的服务:

$ docker network create \  --driver overlay \  --subnet 10.0.9.0/24 \
  my-multi-host-network

400g6bwzd68jizzdx5pgyoe95

$ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx

716thylsndqma81j6kkkb5aus

只有群集服务可以连接到覆盖网络,而不是独立的容器。有关群集的更多信息,请参阅 Docker 群集模式覆盖网络安全模型和将服务附加到覆盖网络。

没有群模式的覆盖网络

如果您未在群集模式下使用 Docker 引擎,则overlay网络需要有效的键值存储服务。支持的键值存储包括Consul,Etcd 和 ZooKeeper(分布式存储)。在以这种方式创建网络之前,您必须安装并配置您选择的键值存储服务。Docker 托管您打算联网并且该服务必须能够通信。

注意:以群集模式运行的 Docker Engine 与外部键值存储的网络不兼容。

对于大多数 Docker 用户,不推荐使用这种覆盖网络。它可以与独立群集一起使用,并可能对在 Docker 之上构建解决方案的系统开发人员有用。它可能在将来被弃用。如果您认为您可能需要以这种方式使用覆盖网络,请参阅本指南。

自定义网络插件

如果您的需求未被上述任何网络机制解决,您可以使用 Docker 的插件基础结构编写自己的网络驱动程序插件。该插件将作为运行 Docker 守护进程的主机上的单独进程运行。使用网络插件是一个高级主题。

网络插件遵循与其他插件相同的限制和安装规则。所有插件都使用插件 API,并且具有包含安装,启动,停止和激活的生命周期。

一旦创建并安装了自定义网络驱动程序,就可以创建一个使用该驱动程序和该--driver标志的网络。

$ docker network create --driver weave mynet

您可以检查网络,连接和断开容器,并删除它。一个特定的插件可能有特定的要求,以便使用。查看插件的文档以获得特定信息。有关编写插件的详细信息,请参阅延伸码头和编写网络驱动插件...

嵌入式DNS服务器

Docker 守护程序运行嵌入式 DNS 服务器,该服务器在连接到同一用户定义网络的容器中提供 DNS 解析,以便这些容器可以将容器名称解析为IP地址。如果嵌入式 DNS 服务器无法解析请求,它将被转发到为该容器配置的任何外部DNS服务器。为了便于创建容器,只有可访问的嵌入式 DNS 服务器127.0.0.11将在容器的resolv.conf文件中列出。有关用户定义网络中嵌入式 DNS 服务器的更多信息,请参阅用户定义网络中的嵌入式 DNS 服务器

公开和发布端口

在 Docker 网络中,有两种直接涉及网络端口的不同机制:公开和发布端口。这适用于默认桥接网络和用户定义桥接网络。

  • 您使用EXPOSEDockerfile中的关键字或--expose标志暴露端口docker run。公开端口是一种记录使用哪些端口的方法,但并不实际映射或打开任何端口。公开端口是可选的。

  • 您使用PUBLISHDockerfile 中的关键字或--publish标志来发布端口docker run。这告诉 Docker 在容器的网络接口上打开哪些端口。端口发布时,它将映射到30000主机上的可用高端端口(高于),除非您在运行时指定要在主机上映射的端口。您无法在 Dockerfile 中的主机上指定要映射到的端口,因为无法保证端口在您运行映像的主机上可用。

本示例将容器中的端口80发布到32768主机上的随机高端口(在这种情况下)。该-d标志将导致容器在后台运行,以便您可以发出该docker ps命令。

$ docker run -it -d -p 80 nginx $ docker ps 64879472feea nginx“nginx -g'daemon ...”43小时前Up大约一分钟443 / tcp,0.0.0.0:32768->80/tcp blissful_mclean

下一个示例指定端口80应映射到主机上的端口8080。如果端口8080不可用,它将失败。

$ docker run -it -d -p 8080:80 nginx $ docker ps b9788c7adca3 nginx“nginx -g'daemon ...”43小时前上传3秒80 / tcp,443 / tcp,0.0.0.0:8080->80 / tcp goofy_brahmagupta

使用带有容器的代理服务器

如果您的容器需要使用 HTTP,HTTPS 或 FTP 代理服务器,则可以采用不同的方式对其进行配置:

  • 在 Docker 17.07及更高版本中,您可以配置 Docker 客户端以自动将代理信息传递给容器。

  • 在 Docker 17.06 及更低版本中,您必须在容器中设置适当的环境变量。您可以在构建图像时(这会使图像的可移植性降低)或创建或运行容器时执行此操作。

配置Docker客户端

仅限边缘:此选项仅在Docker CE Edge版本中可用。请参阅Docker CE Edge。

  1. 在Docker客户端上,创建或编辑~/.config.json启动容器的用户的主目录中的文件。添加JSON(如下所示),用代理服务器的类型httpsproxyftpproxy必要时替换代理服务器的类型,并替换代理服务器的地址和端口。您可以同时配置多个代理服务器。通过将noProxy密钥设置为一个或多个逗号分隔的IP地址或主机,您可以选择性地排除通过代理服务器的主机或范围。*如本例所示,支持使用字符作为通配符。{“proxies”:{“httpProxy”:“http://127.0.0.1:3001”,“noProxy”:“* .test.example.com,.example2.com”}}保存文件。

  1. 当您创建或启动新容器时,环境变量将在容器中自动设置。

手动设置环境变量

当您创建图像或--env在创建或运行容器时使用该标记时,可以将一个或多个以下变量设置为适当的值。此方法使图像的可移植性降低,因此,如果您拥有 Docker 17.07或更高版本,则应该配置 Docker 客户端。

变量

Dockerfile示例

码头运行示例

HTTP_PROXY

ENV HTTP_PROXY“http://127.0.0.1:3001”

--env HTTP_PROXY“http://127.0.0.1:3001”

HTTPS_PROXY

ENV HTTPS_PROXY“https://127.0.0.1:3001”

--env HTTPS_PROXY“https://127.0.0.1:3001”

FTP_PROXY

ENV FTP_PROXY“ftp://127.0.0.1:3001”

--env FTP_PROXY“ftp://127.0.0.1:3001”

NO_PROXY

ENV NO_PROXY“* .test.example.com,.example2.com”| -env NO_PROXY“* .test.example.com,.example2.com”`| |


链接

在 Docker 包含用户定义的网络之前,您可以使用 Docker --link功能来允许容器将另一个容器的名称解析为IP地址,并且还允许它访问链接容器的环境变量。在可能的情况下,您应该避免使用遗留--link标志。

当您创建链接时,当您使用默认bridge网络或使用用户定义的网桥时,它们的行为会有所不同。有关详细信息,请参阅默认bridge网络中的链接功能的传统链接以及用户定义网络中的链接容器,以获取用户定义网络中的链接功能。

Docker和iptables

Linux 主机使用调用的内核模块iptables来管理对网络设备的访问,包括路由,端口转发,网络地址转换(NAT)以及其他问题。iptables当您启动或停止发布端口的容器时,当您创建或修改网络或将容器附加到它们或其他与网络相关的操作时,Docker会修改规则。

充分讨论iptables超出了这个话题的范围。要查看哪些iptables规则随时有效,可以使用iptables -L。多个表存在,你可以列出一个特定的表,例如natprerouting或者postrouting,使用命令如iptables -t nat -L。有关完整的文档iptables,请参阅netfilter / iptables。

通常,iptables规则由初始化脚本或守护程序进程创建,例如firewalld。规则不会在系统重新启动时持续存在,因此脚本或实用程序必须在系统引导时运行,通常在运行级别3或在网络初始化之后运行。请查阅您的Linux发行版的网络文档,以获取有关使iptables规则持久化的适当方式的建议。

Docker 动态管理iptables守护进程的规则以及容器,服务和网络。在Docker 17.06及更高版本中,您可以将规则添加到名为的新表中DOCKER-USER,并且这些规则将在 Docker 自动创建任何规则之前加载。如果您需要预先填充iptablesDocker 运行之前需要到位的规则,这会非常有用。

相关信息

  • 使用网络命令

  • 开始使用多主机网络

  • 在容器中管理数据

  • Docker机器概述

  • Docker群集概述

  • 调查LibNetwork项目

网络,网络,iptables,用户定义的网络,网桥,防火墙,端口

上一篇: 下一篇: