docker 网络分为单机和多机,我们来了解一下docker的单机网络

docker单机网络分为以下几种:

1)bridge NetWork,使用--net=bridge指定,默认设置。
2)Host NetWork ,使用--net=host指定。
3)None NetWork,使用--net=none指定。
4)Container NetWork,使用--net=container:NAME_or_ID指定。
5)自定义 NetWork,使用docker network create my_net,使用--net=my_net指定。

1、首先,我们来看看一个比较重要的概念,关于namespace,看看network的namespace到底是怎么回事。

通过实践演示network-namespace。
创建容器:创建两个busybox容器

  1. [root@docker01 ~]# docker run -itd --name test1 busybox
  2. f862152b6631cf28cf041b454ab85f5d190b03029c088a331a64b164900ef331
  3. [root@docker01 ~]# docker run -itd --name test2 busybox
  4. f78690e1e0b820c4fea8af6e4d062f4f6460f68697274e70b0189b5c2ff3386d

启动了2个容器,test1与test2,进入这2个容器查看各自的ip地址

  1. [root@docker01 ~]# docker exec -it test1 sh
  2. / # ip a
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. inet 127.0.0.1/8 scope host lo
  6. valid_lft forever preferred_lft forever
  7. 30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
  8. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  9. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  10. valid_lft forever preferred_lft forever
  11. / # exit
  12. [root@docker01 ~]# docker exec -it test2 sh
  13. / # ip a
  14. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  15. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  16. inet 127.0.0.1/8 scope host lo
  17. valid_lft forever preferred_lft forever
  18. 32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
  19. link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
  20. inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
  21. valid_lft forever preferred_lft forever

可以看出test1的ip为172.17.0.2,test2的ip为172.17.0.3。其实这块就是网络命名空间!
在test2上ping可以ping通test1的namespace。

  1. [root@docker01 ~]# docker exec -it test2 sh
  2. / # ping 172.17.0.2
  3. PING 172.17.0.2 (172.17.0.2): 56 data bytes
  4. 64 bytes from 172.17.0.2: seq=0 ttl=64 time=18.389 ms
  5. 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.084 ms

可以发现命名空间是独立的,容器内的网络命名空间和容器外不同,容器和容器之前的网络命名空间也是相对独立的。

2、那么docker网络究竟是如何配置的?

1. bridge网络模式

我们进入容器内,ping baidu发现可以ping通。这是什么原理呢,肯定是通过可以转接的方式,如:容器--->虚拟机---->宿主机-->baidu。

  1. / # ping www.baidu.com
  2. PING www.baidu.com (115.239.210.27): 56 data bytes
  3. 64 bytes from 115.239.210.27: seq=0 ttl=127 time=15.410 ms
  4. 64 bytes from 115.239.210.27: seq=1 ttl=127 time=7.586 ms

查看docker网络:

  1. [root@docker01 ~]# docker network ls
  2. NETWORK ID NAME DRIVER SCOPE
  3. 99c36d692cac bridge bridge local
  4. ec237fbb8837 host host local
  5. 94e84f3d8354 none null local

这里我们可以看到桥接模式。
对于test1与test2 来讲,他是通过bridge的方式
我们可以看一下其内部网络信息:

  1. [root@docker01 ~]# docker inspect test1
  2. ......
  3. "NetworkSettings": {
  4. "Bridge": "",
  5. "SandboxID": "6f8f2f996e4d5bfeddd179832cc5ffb3cd3f9ee830ce6acfff16fd249e9e0130",
  6. "HairpinMode": false,
  7. "LinkLocalIPv6Address": "",
  8. "LinkLocalIPv6PrefixLen": 0,
  9. "Ports": {},
  10. "SandboxKey": "/var/run/docker/netns/6f8f2f996e4d",
  11. "SecondaryIPAddresses": null,
  12. "SecondaryIPv6Addresses": null,
  13. "EndpointID": "d0a01da2cd1b487c6829518c7bdc01215b66a11b1e79e80862ab81c49e5cb0f7",
  14. "Gateway": "172.17.0.1",
  15. "GlobalIPv6Address": "",
  16. "GlobalIPv6PrefixLen": 0,
  17. "IPAddress": "172.17.0.2",
  18. "IPPrefixLen": 16,
  19. "IPv6Gateway": "",
  20. "MacAddress": "02:42:ac:11:00:02",
  21. "Networks": {
  22. "bridge": {
  23. "IPAMConfig": null,
  24. "Links": null,
  25. "Aliases": null,
  26. "NetworkID": "99c36d692cac8d6be351681e590e0048f6a746fd9e1c88b2e3b7769dfd57fccb",
  27. "EndpointID": "d0a01da2cd1b487c6829518c7bdc01215b66a11b1e79e80862ab81c49e5cb0f7",
  28. "Gateway": "172.17.0.1",
  29. "IPAddress": "172.17.0.2",
  30. "IPPrefixLen": 16,
  31. "IPv6Gateway": "",
  32. "GlobalIPv6Address": "",
  33. "GlobalIPv6PrefixLen": 0,
  34. "MacAddress": "02:42:ac:11:00:02",
  35. "DriverOpts": null
  36. }
  37. }
    ......

查看宿主机ip信息:

  1. [root@docker01 ~]# ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  9. link/ether 00:0c:29:cf:3d:4b brd ff:ff:ff:ff:ff:ff
  10. inet 10.0.0.99/24 brd 10.0.0.255 scope global noprefixroute ens33
  11. valid_lft forever preferred_lft forever
  12. inet6 fe80::20c:29ff:fecf:3d4b/64 scope link
  13. valid_lft forever preferred_lft forever
  14. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  15. link/ether 02:42:1f:f4:29:1a brd ff:ff:ff:ff:ff:ff
  16. inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  17. valid_lft forever preferred_lft forever
  18. inet6 fe80::42:1fff:fef4:291a/64 scope link
  19. valid_lft forever preferred_lft forever
  20. 4: veth3b111e2@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default
  21. link/ether 62:a9:c9:0b:be:d6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
  22. inet6 fe80::60a9:c9ff:fe0b:bed6/64 scope link
  23. valid_lft forever preferred_lft forever
  24. 5: vethdc6d1fa@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
  25. link/ether a2:17:9c:af:d1:d9 brd ff:ff:ff:ff:ff:ff link-netnsid 2
  26. inet6 fe80::a017:9cff:feaf:d1d9/64 scope link
  27. valid_lft forever preferred_lft forever

这个机器有5个网路,除了lo,ens33,docker0,veth3b111e2@if32,vethdc6d1fa@if30,veth其实是连接了2个networknamespace,vethdbcb3a6@if11与vethdc6d1fa@if30负责连接docker0上边的,容器test1与test2里面也应该有个和veth连接的。

  1. [root@docker01 ~]# docker exec test1 ip a
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. 30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
  7. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  8. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  9. valid_lft forever preferred_lft forever

eth0@if31和外边的veth3b111e2@if32 其实是一对。test2同理。

可以通过命令查看他们的关系: yum install -y bridge-utils
#安装后可以运行brctl这个命令了

  1. [root@docker01 ~]# brctl show
  2. docker0 8000.02421ff4291a no veth3b111e2
  3. vethdc6d1fa

因为目前两个容器test1与test2的桥接,所以就显示两个。
test1 和test2 之前通过docker0,docker0 类似test1和test2之前的路由器,docker0 在通过nat的eth0连接互联网。

为了形象理解docker bridge network可以参考下图:

2. host 网络模式

host模式下容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。

  1. [root@docker01 ~]# docker run -itd --name test3 --network host busybox
  2. 2268c2f8eb8ff74b72e521148dc1fe82a9a822857f251abab2368b24924453d6
  3. [root@docker01 ~]# docker exec -it test3 /bin/sh
  4. / # ip a
  5. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  6. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  7. inet 127.0.0.1/8 scope host lo
  8. valid_lft forever preferred_lft forever
  9. inet6 ::1/128 scope host
  10. valid_lft forever preferred_lft forever
  11. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  12. link/ether 00:0c:29:cf:3d:4b brd ff:ff:ff:ff:ff:ff
  13. inet 10.0.0.99/24 brd 10.0.0.255 scope global noprefixroute ens33
  14. valid_lft forever preferred_lft forever
  15. inet6 fe80::20c:29ff:fecf:3d4b/64 scope link
  16. valid_lft forever preferred_lft forever
  17. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  18. link/ether 02:42:1f:f4:29:1a brd ff:ff:ff:ff:ff:ff
  19. inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  20. valid_lft forever preferred_lft forever
  21. inet6 fe80::42:1fff:fef4:291a/64 scope link
  22. valid_lft forever preferred_lft forever
  23. 4: veth3b111e2@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default
  24. link/ether 62:a9:c9:0b:be:d6 brd ff:ff:ff:ff:ff:ff link-netnsid 1
  25. inet6 fe80::60a9:c9ff:fe0b:bed6/64 scope link
  26. valid_lft forever preferred_lft forever
  27. 5: vethdc6d1fa@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
  28. link/ether a2:17:9c:af:d1:d9 brd ff:ff:ff:ff:ff:ff link-netnsid 2
  29. inet6 fe80::a017:9cff:feaf:d1d9/64 scope link
  30. valid_lft forever preferred_lft forever

此容器没有自己的接口,与宿主机ip完全一样,起容器只能起单个,比如nginx。

3. none网络模式:

获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。

  1. [root@docker01 ~]# docker run -itd --name test4 --network none busybox
  2. 7222ec17cd70c1094af5710445bec25bd2a7bd09c86f97348857ad5f70ed21b3
  3. [root@docker01 ~]# docker exec -it test4 /bin/sh
  4. / # ip a
  5. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  6. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  7. inet 127.0.0.1/8 scope host lo
  8. valid_lft forever preferred_lft forever

此容器没有接口ip,与外界无沟通,用于安全性比较高的业务,可自己手动添加网络。

4. container 网络模式:

与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

  1. [root@docker01 ~]# docker run -itd --name test5 --net=container:test1 busybox
  2. af3a29e3171f82ef1a2e827d9307fbd2de6484ec225c6227de5de2fe6e557a90
  3. [root@docker01 ~]# docker exec -it test5 /bin/sh
  4. / # ip a
  5. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  6. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  7. inet 127.0.0.1/8 scope host lo
  8. valid_lft forever preferred_lft forever
  9. 30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
  10. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
  11. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  12. valid_lft forever preferred_lft forever

可以看出 test5 与 test1的网络配置信息是一致的。

5. 自定义网络模式:

与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
通过docker network create 创建自定义的网络:

  1. [root@docker01 ~]# docker network create test
  2. [root@docker01 ~]# docker network ls
  3. NETWORK ID NAME DRIVER SCOPE
  4. 99c36d692cac bridge bridge local
  5. ec237fbb8837 host host local
  6. 94e84f3d8354 none null local
  7. ea714a707d9d test bridge local

创建容器指定自定义网桥:

  1. [root@docker01 ~]# docker run -itd --name test6 --net=test busybox
  2. 6b4add91370de5e9ac727c5d8992e516c7a5e8f75846f55f4c314bc433083998
  3. [root@docker01 ~]# docker run -itd --name test7 --net=test busybox
  4. eb55f38600e725f050dea02d5227516858a4a3c7c6f85fec8bc9932864c811f8

与普通bridge网络不同的是,自定义网络中创建的容器可以通过容器名或者主机名互通。

  1. [root@docker01 ~]# docker exec -it test6 /bin/sh
  2. / # ping test7
  3. PING test7 (172.21.0.3): 56 data bytes
  4. 64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.151 ms
  5. 64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.132 ms
  6. ^C
  7. --- test7 ping statistics ---
  8. 3 packets transmitted, 3 packets received, 0% packet loss
  9. round-trip min/avg/max = 0.083/0.122/0.151 ms
  10. / # exit
  11. [root@docker01 ~]# docker exec -it test7 /bin/sh
  12. / # ping test6
  13. PING test6 (172.21.0.2): 56 data bytes
  14. 64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.139 ms
  15. 64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.087 ms
  16. ^C
  17. --- test6 ping statistics ---
  18. 3 packets transmitted, 3 packets received, 0% packet loss
  19. round-trip min/avg/max = 0.087/0.104/0.139 ms

其原理是各容器内部的hosts文件做了ip与主机名解析。

  1. / # cat /etc/hosts
  2. 127.0.0.1 localhost
  3. ::1 localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. 172.21.0.3 eb55f38600e7

以上就是docker网络的5种模式。

docker 网络的几种模式的更多相关文章

  1. Linux初学之vmware Workstation 网络连接三种模式

    简介: VM(VMware Workstation简称VM,后面都将用VM代替阐述)是一款功能强大的虚拟化软件.VM支持在 单一的桌面上同时运行多款不同的操作系统,能够模拟完整的网络环境,支持pxe功 ...

  2. VMware网络连接三种模式bridged、host-only、NAT

    1. bridged(桥接模式) 在桥接模式下,虚拟机和主机处于同一网段,这样虚拟机才能和主机进行通信 使用桥接模式,就像连接在同一个Hub上的两台电脑 //简单配置ip # ifconfig eth ...

  3. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  4. [转]VMware Workstation网络连接的三种模式

    经常要使用VMWare Workstation来在本地测试不同的操作系统,以前也搞不清楚网络连接三种模式,最近看了几篇文章才算明白.现总结如下: 1. VMware Workstation的虚拟网络组 ...

  5. Docker网络解决方案 - Calico部署记录

    简单来说,实现docker跨主机容器间通信,常用的第三方网络方案是Flannel,Weave,Calico:Flannel会为每个host分配一个subnet,容器从这个subnet中分配ip,这些i ...

  6. Docker 网络原理

    引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖L ...

  7. Linux虚拟网络:Docker网络知识之基础篇

    我们在工作中应用了docker容器化技术,服务的部署.维护和扩展都方便了很多.然而,近期在私有化部署过程中,由于不同服务器环境的复杂多变,常常遇到网络方面的问题,现象为容器服务运行正常,但宿主机.容器 ...

  8. Docker网络及命令

    Docker常用命令 docker version #查看版本 docker search centos #搜索可用docker镜像 docker images 查看当前docker所有镜像 dock ...

  9. docker网络模式----入门docker的难点

    众所周知,现在docker是轻量级虚拟化的典型代表!这段时间想要建立一个分布式系统,但是手头上主机没那么多,所以使用docker进行虚拟化,但是在使用的过程中对网络这一部分是一直不太理解,特别找了一篇 ...

随机推荐

  1. (转)JDK工具-javadoc命令

    背景:最近在学习java基础知识,看到文档注释部分,一种是在dos命令下生成api文件,另一种是在eclipse下生成api文件.dos方式在<疯狂java讲义>中有详细的说明,eclip ...

  2. 图像处理之规则裁剪(Resize)

    1 图像裁剪 在实际工作中,经常需要根据研究工作要求对图像进行裁剪(Subset Image),按照实际图像分幅裁剪的过程,可以将图像分幅裁剪分为两种类型:规则分幅裁剪(Rectangle Subse ...

  3. arcgis10.2连接表xlsx格式失败

    需要安装 2007 Office System 驱动程序(AccessDatabaseEngine.exe)

  4. OpenStack API部分高可用配置(一)

    一.概况与原理  SHAPE  \* MERGEFORMAT 1)所需要的配置组件有:pacemaker+corosync+HAProxy 2)主要原理:HAProxy作为负载均衡器,将对openst ...

  5. HDU 3094 树上删边 NIM变形

    基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...

  6. 【整理】HTML5游戏开发学习笔记(2)- 弹跳球

    1.预备知识(1)在画布上绘制外部图片资源(2)梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度.如createLinearGradient,绘制梯度需要颜色组http://w ...

  7. javascript类式继承最优版

    直接看实例代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...

  8. BZOJ4818 序列计数

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...

  9. Django之模板语法

    Django框架之第三篇模板语法(重要!!!) 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 一.模板语法之变量:语法为 {{ }}: ...

  10. F. Ivan and Burgers(线性基,离线)

    题目链接:http://codeforces.com/contest/1100/problem/F 题目大意:首先输入n,代表当前有n个数,然后再输入m,代表m次询问,每一次询问是询问区间[l,r], ...