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容器

[root@docker01 ~]# docker run -itd --name test1 busybox
f862152b6631cf28cf041b454ab85f5d190b03029c088a331a64b164900ef331
[root@docker01 ~]# docker run -itd --name test2 busybox
f78690e1e0b820c4fea8af6e4d062f4f6460f68697274e70b0189b5c2ff3386d

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

[root@docker01 ~]# docker exec -it test1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # exit
[root@docker01 ~]# docker exec -it test2 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

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

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

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

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

1. bridge网络模式

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

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

查看docker网络:

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

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

[root@docker01 ~]# docker inspect test1
......
"NetworkSettings": {
"Bridge": "",
"SandboxID": "6f8f2f996e4d5bfeddd179832cc5ffb3cd3f9ee830ce6acfff16fd249e9e0130",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/6f8f2f996e4d",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "d0a01da2cd1b487c6829518c7bdc01215b66a11b1e79e80862ab81c49e5cb0f7",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "99c36d692cac8d6be351681e590e0048f6a746fd9e1c88b2e3b7769dfd57fccb",
"EndpointID": "d0a01da2cd1b487c6829518c7bdc01215b66a11b1e79e80862ab81c49e5cb0f7",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
......

查看宿主机ip信息:

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

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

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

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

[root@docker01 ~]# brctl show
docker0 8000.02421ff4291a no veth3b111e2
vethdc6d1fa

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

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

2. host 网络模式

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

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

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

3. none网络模式:

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

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

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

4. container 网络模式:

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

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

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

5. 自定义网络模式:

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

[root@docker01 ~]# docker network create test
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
99c36d692cac bridge bridge local
ec237fbb8837 host host local
94e84f3d8354 none null local
ea714a707d9d test bridge local

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

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

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

[root@docker01 ~]# docker exec -it test6 /bin/sh
/ # ping test7
PING test7 (172.21.0.3): 56 data bytes
64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.151 ms
64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.132 ms
^C
--- test7 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.083/0.122/0.151 ms
/ # exit
[root@docker01 ~]# docker exec -it test7 /bin/sh
/ # ping test6
PING test6 (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.139 ms
64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.087 ms
^C
--- test6 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.087/0.104/0.139 ms

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

/ # cat /etc/hosts
127.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
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. POJ 3436 ACM Computer Factory (网络流,最大流)

    POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...

  2. 目标检测评价指标(mAP)

    常见指标 precision 预测出的所有目标中正确的比例 (true positives / true positives + false positives). recall 被正确定位识别的目标 ...

  3. 三次握手---TCP/IP

    首先由Client发出请求连接即 SYN=1 ACK=0  (请看头字段的介绍), TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x 然后 Server 进行回复 ...

  4. NodeJS 笔记 path模块

    path 模块,本模块包含一系列处理和转换文件路径的工具集. path.normalize(path)   normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还 ...

  5. Oracle DBMS_RANDOM

    DBMS_RANDOM.VALUE -- [0,1)的38位精度小数 SELECT DBMS_RANDOM.VALUE FROM DUAL; -- [10,20)的38位精度小数 SELECT DBM ...

  6. <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible' />

    代码一:<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> http-eq ...

  7. mybatis 不整合spring 入门小例子

    先上一个搭建完的项目结构截图: 相对比较重要的配置文件有 db.properties , SqlMappingConfig.xml , mapper/User.xml , log4j.properti ...

  8. js深复制

    一般来讲深复制主要是为了复制js对象中的引用类型,引用类型在普通的赋值操作下相当于是引用,修改复制对象也会影响原对象,简单的方法的话可以使用JSON.parse(JSON.stringify(obj) ...

  9. ZYNQ. Interrupt(1)Private Timer

    Interrupt zynq的中断. The PS is based on ARM architecture, utilizing two Cortex-A9 processors(CPUs) and ...

  10. Hibernate5总结

    1. 明确Hibernate是一个实现了ORM思想的框架,它封装了JDBC,是程序员可以用对象编程思想来操作数据库. 2. 明确ORM(对象关系映射)是一种思想,JPA(Java Persistenc ...