一、概述

以下内容参考:https://docs.docker.com/network/#network-drivers

Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连接到非Docker工作负载。Docker容器和服务甚至不需要知道它们部署在Docker上,或者它们的对等体是否也是Docker工作负载。无论您的Docker主机是运行Linux,Windows还是两者兼而有之,您都可以使用Docker以与平台无关的方式管理它们。

网络驱动程序

Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:

  • bridge:默认网络驱动程序。如果未指定驱动程序,则这是您要创建的网络类型。当您的应用程序在需要通信的独立容器中运行时,通常会使用桥接网络。见 桥接网络

  • host:对于独立容器,移除了容器和Docker主机之间的网络隔离,并直接使用主机的网络。host 仅适用于Docker 17.06及更高版本上的群集服务。请参阅 使用主机网络

  • overlay:overlay网络将多个Docker守护程序连接在一起,并使群集服务能够相互通信。您还可以使用overlay网络来促进群集服务和独立容器之间的通信,或者在不同Docker守护程序上的两个独立容器之间进行通信。此策略无需在这些容器之间执行OS级别的路由。请参阅overlay网络

  • macvlan:Macvlan网络允许您为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan 在处理期望直接连接到物理网络的传统应用程序时,使用驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由。见 Macvlan网络

  • none:对于此容器,禁用所有网络。通常与自定义网络驱动程序一起使用。none不适用于群组服务。请参阅 禁用容器网络

  • 网络插件:您可以使用Docker安装和使用第三方网络插件。这些插件可从 Docker Store 或第三方供应商处获得。有关安装和使用给定网络插件的信息,请参阅供应商的文档。

网络驱动选择

  • 当您需要多个容器在同一个Docker主机上进行通信时,用户定义的桥接网络是最佳选择。
  • 当网络环境不需要与Docker主机隔离时,主机网络最佳,但您希望隔离容器的其他方面,如果文件、系统。
  • 当您需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用swarm服务协同工作时,overlay网络是最佳选择。
  • 当您从VM设置迁移或需要您的容器看起来像网络上的物理主机(每个都具有唯一的MAC地址)时,Macvlan网络是最佳的。
  • 第三方网络插件允许您将Docker与专用网络环境集成。

Docker EE网络功能

只有在使用Docker EE并使用通用控制平面(UCP)管理Docker服务时,才能实现以下两个功能:

  • HTTP路由网格 可以让你分享多个服务之间的相同的网络IP地址和端口。根据客户端的请求,UCP使用主机名和端口的组合将流量路由到适当的服务。

  • 会话粘性允许您在HTTP标头中指定信息,UCP用于将后续请求路由到同一服务任务,适用于需要有状态会话的应用程序。

网络教程

现在您已了解Docker网络的基础知识,请使用以下教程加深理解:

二、单机Docker网络模式

在单机docker环境下,网络模式主要有4种。

  1. bridge模式:使用–net =bridge指定,默认设置;
  2. host模式:使用–net =host指定;
  3. none模式:使用–net =none指定;
  4. container模式:使用–net =container:NAMEorID指定。
  5. 自定义网络

1、Bridge模式

Bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将并将一个主机上的Docker容器连接到一个虚拟网桥上。

当Docker server启动时,会在宿主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

2、自定义模式

a、创建一个bridge:test-bs

docker network create test-bs

 

b、创建2个container连接到test-bs

docker run -itd --name bs3 --net test-bs busybox
docker run -itd --name bs4 --net test-bs busybox

  

c、查看test-bs

[root@localhost mnt]# docker network inspect test-bs
[
{
"Name": "test-bs",
"Id": "ddad9fadb9d2defb77fc104afe38864bda800f24badbcc3200cd811fd491d31e",
"Created": "2018-11-18T20:51:35.991550414+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"01229f1d1846d95c28c24e4495c2b341536e4b0eb03e85edb2e0a8a4e9fb2761": {
"Name": "bs3",
"EndpointID": "2c3a2fecda6097f5478fa46b97f59e11b02d7d1ed38235d93d0f5cc03a225af4",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"da62f9854b9577dca817d73695388e1e4c5aaf695da87deb0bd5189e6a660582": {
"Name": "bs4",
"EndpointID": "3b692c438994636144eb3646338bc748935e5967b538185bcac9cfadf28a763c",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]

  

从上面可以看到,test-bs下面有2个容器,bs3和bs4,ip地址分别为172.18.0.2/16和172.18.0.3/16。

3、host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

创建一个容器,host模式:

docker run -itd --name bs5 -h bs5 --net=host busybox

  

进入容器后,查看网络:

发现网络环境和宿主机一模一样。

4、none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等

创建一个none模式的容器:

从上图可以看出,none模式不会配置任何网络,需要自己配置。

5、Container模式

container模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

原理图如下:

创建一个container模式的容器:

进入容器查看,发现新建的容器和容器bs4一模一样!

三、容器访问网络的原理

Docker主要通过netfilter/iptables实现网络通信。

1、 容器访问网络的原理主要依赖docker0(宿主机)和veth pair(容器)以及防火墙的SNAT和DNAT来实现和外部网络的交流。

2、容器要出外网,通过veth pair设备先进入到宿主机,然后在宿主机中通过SNAT,将源IP替换为Docker0的出口ip路由出去。

3、外界要访问容器,先会到达容器的eth0,然后容器会根据要访问的目标地址进行DNAT,通过宿主机上的路由进行转发到内部容器,返回给外界。

容器通过将服务的实际端口在宿主机上进行端口映射,外部客户端通过连接宿主机的映射端口来访问容器内的服务。

5、Docker网络配置(单机)的更多相关文章

  1. docker网络配置

    Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用--net去指定,其他三种模式需 ...

  2. Docker网络配置、Docker部署分布式项目

    目标 1.Docker网络配置 2.Docker部署SpringCloud项目 Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/cont ...

  3. docker网络配置方法总结

    docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...

  4. Docker(六):Docker网络配置进阶

    1.Docker集群网络配置之Weave Weave是Github上一个比较热门的Docker容器网络方案,具有非常良好的易用性且功能强大.仓库地址:https://github.com/weavew ...

  5. docker——网络配置

    一.网络启动与配置参数 Docker启动时会在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥,可以理解为一个软件交换机,它会在挂载其上的接口之间进行数据转发.同时,Docker随 ...

  6. Docker网络配置进阶

    Docker启动会默认创建docker0虚拟网桥,是Linux的一个bridge,可以理解成一个软件交换机.它会在挂载到它的网口之间进行转发. 之后所有容器都是在172.17.0.x的网段上,并且可以 ...

  7. docker网络配置之自定义网桥

    使用特定范围的 IP (仅适用于v1.x)不适用于新版的v1.1x Docker 会尝试寻找没有被主机使用的 ip 段,尽管它适用于大多数情况下,但是它不是万能的,有时候我们还是需要对 ip 进一步规 ...

  8. docker 网络配置

    先随便写几行命令 随后一点点的补充 端口映射实现访问容器. run -d -P training/webapp python app.py run -d -p 5000:5000 training/w ...

  9. Docker网络配置概述

    Overview One of the reasons Docker containers and services are so powerful is that you can connect t ...

随机推荐

  1. Python之密度聚类

    # -*- coding: utf-8 -*- """ Created on Tue Sep 25 10:48:34 2018 @author: zhen "& ...

  2. Oracle EBS OPM 发放生产批

    --发放生产批 --created by jenrry DECLARE x_return_status VARCHAR2 (1); l_exception_material_tbl gme_commo ...

  3. 转:jQuery插件开发全解析

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  4. selenium-键盘和鼠标事件

    常见的键盘操作 from selenium.webdriver.common.keys import Keys 模拟enter键:send_keys(Keys.ENTER)键盘F1~F12: send ...

  5. October 27th, 2017 Week 43rd Friday

    The only thing predictable about life is its unpredictability. 人生唯一可以预知的,就是它的变化莫测. Is it really unpr ...

  6. django复习-2-配置、静态文件与路由

    一.配置文件 1. BASE_DIR BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) __file__指当 ...

  7. 【PyCharm疑问】在pycharm中带有中文时,有时会导致程序判断错误,是何原因?

    1.会导致程序打印false错误的代码如下: # -*- coding:utf-8 -*- import os import sys from uiautomator import device as ...

  8. Netty 聊天小程序

    这节讲解基于 Netty 快速实现一个聊天小程序. 一.服务端 1. SimpleChatServerHandler(处理器类) 该类主要实现了接收来自客户端的消息并转发给其他客户端. /** * 服 ...

  9. 腾讯课堂老师qq号码转换成 teacherid

    result = 215696775^858006833 if(result){ result=4294967296+result; } alert(result);

  10. C#启动另一个应用程序并传参数

    第一个程序: try { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "Windows ...