非常教程

Docker 17参考手册

引擎 | Engine

了解容器通信(引擎) | Understand container communication (Engine)

本节中的信息解释了Docker默认网桥中的容器通信。这是一个在安装Docker时自动创建的bridge网络bridge

注意:通过Docker网络功能,您可以创建除默认网桥以外的用户定义网络。

与外界沟通

一个容器是否可以与世界交流受两个因素控制。第一个因素是主机是否转发其IP数据包。其次是主机是否iptables允许这种特定的连接。

IP数据包转发由ip_forward系统参数管理。如果此参数是数据包,则只能在容器之间传递数据包1。通常你会简单地离开了码头工人服务器的默认设置--ip-forward=true和码头工人会去设置ip_forward,以1在服务器启动时你。如果您设置--ip-forward=false并且您的系统内核已启用该--ip-forward=false选项,则该选项不起作用。要检查内核上的设置或手动打开它:

  $ sysctl net.ipv4.conf.all.forwarding

  net.ipv4.conf.all.forwarding = 0

  $ sysctl net.ipv4.conf.all.forwarding=1

  $ sysctl net.ipv4.conf.all.forwarding

  net.ipv4.conf.all.forwarding = 1

注意:此设置不会影响使用主机网络堆栈(--network=host)的容器。

许多使用Docker的人都希望ip_forward开启,至少可以在容器和更广泛的世界之间进行通信。如果您处于多个桥接设置中,也可能需要进行集装箱间通信。

如果您设置--iptables=false守护进程启动时,Docker将永远不会更改您的系统规则iptables。否则,Docker服务器会将转发规则附加到DOCKER过滤器链中。

Docker将刷新任何预先存在的规则,从DOCKERDOCKER-ISOLATION过滤器链,如果存在的话。出于这个原因,需要在Docker启动后添加任何需要进一步限制对容器访问的规则。

Docker的转发规则默认允许所有外部源IP。要仅允许特定的IP或网络访问容器,请在DOCKER过滤器链的顶部插入否定规则。例如,要限制外部访问,以便只有源IP 8.8.8.8才能访问容器,可以添加以下规则:

$ iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP

其中ext_if是提供到主机的外部连接的接口的名称。

容器之间的通信

两个容器是否可以通信在操作系统级别由两个因素决定。

  • 网络拓扑是否连接了容器的网络接口?默认情况下,Docker会将所有容器附加到一个docker0桥,为数据包之间的传输提供路径。有关其他可能的拓扑,请参阅本文档的后面部分。
  • 你的iptables是否允许这个特定的连接?如果您设置--iptables=false守护进程启动时,Docker将永远不会更改您的系统规则iptables。否则,如果保留缺省值,则Docker服务器将FORWARD使用一揽子ACCEPT策略向该链添加默认规则--icc=true,否则会将该策略设置为DROP如果--icc=false

这是一个战略性问题,是否要保留--icc=true或改变,--icc=false以便iptables保护其他容器和主要主机不受任何受到攻击的容器探测或访问的端口的限制。

如果您选择最安全的设置--icc=false,那么在您希望他们提供对方服务的情况下,容器如何通信?答案就是--link=CONTAINER_NAME_or_ID:ALIAS选项,因为它对名称服务的影响,在前一节中提到了这个选项。如果Docker守护进程正在运行--icc=false并且--iptables=true随后运行,当它看到docker run使用该--link=选项调用时,Docker服务器将插入一对iptables ACCEPT规则,以便新容器可以连接到其他容器公开的端口 - 它提到的端口它的EXPOSE线Dockerfile

CONTAINER_NAME值的--link=必须是自动分配的Docker的名字一样stupefied_pare,或者你用指定的名称--name=,当你跑了docker run。它不能是主机名,Docker在该--link=选项的上下文中不会识别。

您可以在Docker主机上运行Fiptables命令,以查看该ORWARD链是否具有默认策略为ACCEPTDROP

# When --icc=false, you should see a DROP rule:

$ sudo iptables -L -n

...
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0
...

# When a --link= has been created under --icc=false,
# you should see port-specific ACCEPT rules overriding
# the subsequent DROP policy for all other packets:

$ sudo iptables -L -n

...
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0

Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  172.17.0.2           172.17.0.3           tcp spt:80
ACCEPT     tcp  --  172.17.0.3           172.17.0.2           tcp dpt:80

注意:Docker非常小心它的主机范围iptables规则完全将容器暴露给彼此的原始IP地址,因此从一个容器到另一个容器的连接总是应该来自第一个容器自己的IP地址。

主机间的容器通信

出于安全原因,Docker配置iptables规则以防止容器在Linux主机上从主机外部转发流量。Docker将FORWARD链的默认策略设置为DROP

要覆盖此默认行为,您可以手动更改默认策略:

$ sudo iptables -P FORWARD ACCEPT

iptables当系统重新启动设置都将丢失。如果您希望更改是永久的,请参阅您的Linux发行版的文档。

注意:在Docker 1.12及更早版本中,默认FORWARD链策略是ACCEPT。当您升级到Docker 1.13或更高版本时,此默认值会自动为您更改。如果您以前的工作配置包含跨多个主机的多个容器,则此更改可能会导致现有设置停止工作,如果您不介入。

为什么你需要将默认值更改DROPACCEPT

假设你有两台主机,每台主机都有以下配置

host1: eth0/192.168.7.1, docker0/172.17.0.0/16
host2: eth0/192.168.8.1, docker0/172.18.0.0/16

如果运行在容器host1需要与容器直接沟通的能力host2,你需要从路线host1host2。路由存在后,host2需要能够接受去往其运行容器的数据包,并将其转发。设置政策来ACCEPT完成这一点。

docker,集装箱,通信,网络

引擎 | Engine相关

1..NET核心应用程序(引擎) | .NET Core application (Engine)
2.关于图像,容器和存储驱动程序(引擎) | About images, containers, and storage drivers (Engine)
3.向swarm添加节点(Engine) | Add nodes to the swarm (Engine)
4.应用自定义元数据(引擎) | Apply custom metadata (Engine)
5.应用滚动更新(引擎) | Apply rolling updates (Engine)
6.apt-cacher-ng
7.编写Dockerfiles(引擎)的最佳实践 | Best practices for writing Dockerfiles (Engine)
8.二进制(引擎) | Binaries (Engine)
9.将容器端口绑定到主机(引擎) | Bind container ports to the host (Engine)
10.突破性变化(引擎) | Breaking changes (Engine)
11.建立自己的网桥 | Build your own bridge (Engine)
12.CentOS (Engine)
13.CentOS (Engine)
14.配置容器DNS(引擎) | Configure container DNS (Engine)
15.在用户定义的网络中配置容器DNS(引擎) | Configure container DNS in user-defined networks (Engine)
16.CouchDB (Engine)
17.创建基本映像(引擎) | Create a base image (Engine)
18.创建群(引擎) | Create a swarm (Engine)
19.自定义docker0网桥(引擎) | Customize the docker0 bridge (Engine)
20.Debian (Engine)
21.默认桥接网络 | Default bridge network
22.删除服务(引擎) | Delete the service (Engine)
23.部署服务(引擎) | Deploy a service (Engine)
24.将服务部署到一个群(引擎) | Deploy services to a swarm (Engine)
25.不推荐的引擎功能 | Deprecated Engine features
26.Docker容器网络(引擎) | Docker container networking (Engine)
27.Docker概述(引擎) | Docker overview (Engine)
28.Docker运行参考(引擎) | Docker run reference (Engine)
29.Dockerfile引用(引擎) | Dockerfile reference (Engine)
30.Dockerize应用程序 | Dockerize an application
31.排空节点(引擎) | Drain a node (Engine)
32.引擎 | Engine
33.FAQ(引擎) | FAQ (Engine)
34.Fedora (Engine)
35.开始 | Get started (Engine)
36.开始使用macvlan网络驱动程序 | Get started with macvlan network driver (Engine)
37.开始使用多主机网络 | Get started with multi-host networking (Engine)
38.节点如何工作 | How nodes work (Engine)
39.服务如何运作(引擎) | How services work (Engine)
40.图像管理 | Image management (Engine)
41.检查服务(引擎) | Inspect the service (Engine)
42.安装Docker(引擎) | Install Docker (Engine)
43.IPv6与Docker(引擎) | IPv6 with Docker (Engine)
44.将节点加入群集(引擎) | Join nodes to a swarm (Engine)
45.旧容器链接(引擎) | Legacy container links (Engine)
46.锁定你的群(引擎) | Lock your swarm (Engine)
47.管理群中的节点(引擎) | Manage nodes in a swarm (Engine)
48.使用Docker机密管理敏感数据(引擎) | Manage sensitive data with Docker secrets (Engine)
49.使用PKI管理swarm安全性(引擎) | Manage swarm security with PKI (Engine)
50.管理群体服务网络(引擎) | Manage swarm service networks (Engine)
51.迁移到引擎1.10 | Migrate to Engine 1.10
52.可选的Linux安装后步骤(引擎) | Optional Linux post-installation steps (Engine)
53.总览 | Overview (Engine)
54.总览 | Overview (Engine)
55.PostgreSQL(引擎) | PostgreSQL (Engine)
56.群集模式中的筏共识(引擎) | Raft consensus in swarm mode (Engine)
57.Riak (Engine)
58.以群集模式运行Docker Engine | Run Docker Engine in swarm mode
59.扩展服务(引擎) | Scale the service (Engine)
60.SDKs (Engine)
61.选择一个存储驱动 | Select a storage driver (Engine)
62.设置教程(引擎) | Set up for the tutorial (Engine)
63.SSHd (Engine)
64.存储驱动总览 | Storage driver overview (Engine)
65.存储服务配置数据(引擎) | Store service configuration data (Engine)
66.Swarm管理指南(引擎) | Swarm administration guide (Engine)
67.Swarm模式关键概念(引擎) | Swarm mode key concepts (Engine)
68.Swarm模式覆盖网络安全模型(引擎) | Swarm mode overlay network security model (Engine)
69.群模式概述(引擎) | Swarm mode overview (Engine)
70.Ubuntu (Engine)
71.Ubuntu (Engine)
72.使用多阶段构建(引擎) | Use multi-stage builds (Engine)
73.使用swarm模式路由网格(引擎) | Use swarm mode routing mesh (Engine)
74.使用AUFS存储驱动程序(引擎) | Use the AUFS storage driver (Engine)
75.使用Btrfs存储驱动程序(引擎) | Use the Btrfs storage driver (Engine)
76.使用设备映射器存储驱动程序(引擎) | Use the Device mapper storage driver (Engine)
77.使用OverlayFS存储驱动程序(引擎) | Use the OverlayFS storage driver (Engine)
78.使用VFS存储驱动程序(引擎) | Use the VFS storage driver (Engine)
79.使用ZFS存储驱动程序(引擎) | Use the ZFS storage driver (Engine)
80.处理图像 | Work with images
81.使用网络命令(引擎) | Work with network commands (Engine)
Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06