Docker——网络管理+docker跨主机通信

当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识。Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后介绍一些自定义网络模式。

一、Docker的原生网络

当你安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host。

host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
None:该模式关闭了容器的网络功能,相当于一个回环网络。
Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个叫docker0的虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。

[root@localhost ~]# docker network ls   //查看docker的默认网络
NETWORK ID          NAME                DRIVER              SCOPE
f64e7741ddeb        bridge              bridge              local
31fc84169e4d        host                host                local
60e0b58a3983        none                null                local
[root@localhost ~]# 

Docker内置这三个网络,运行容器时,你可以使用该“–network”选项来指定容器应连接到哪些网络。如果没有指定则默认使用bridge模式。
比如:

host模式:使用 --net=host 指定;
none模式:使用 --net=none 指定;
bridge模式:使用 --net=bridge 指定(默认设置);

1.host模式
如果启动容器时使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

使用场景:
由于网络配置与docker宿主机完全一样,性能较好,但是不便之处就是灵活性不高,容易和宿主机出现端口冲突的问题。最好是单个容器时使用,一般情况下不建议使用。

创建使用host网络模式的容器示例:

[root@localhost ~]# docker run -it --name host --network host busybox:latest 
//使用busybox镜像创建一个名为host的容器,网络采用host模式
/ # ip a  
//进入容器后可以看出容器中的网络与docker主机的网络一模一样

在这里插入图片描述
2.none模式
在none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器只有一个回环地址,不能与外界通信,称为被隔离的网络。

使用场景:
none模式被称为隔离的网络,隔离便意味着安全,不能与外部通信,同样外部也不可以访问到使用none模式的容器,使用这种网络模式的容器可以运行于关于安全方面的验证码、校验码等服务。一般用于对安全性要求较高的场景中!

创建使用none网络模式的容器示例:

[root@localhost ~]# docker run -it --name none --network none busybox:latest 
//使用busybox镜像创建一个名为none的容器,网络采用none模式
/ # ip a            
//可以看到容器中只有一个lo网卡

在这里插入图片描述
3.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网桥。

[root@localhost ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:b5:09:74:e8  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]# brctl show    //查看桥接网络
bridge name	     bridge id		    STP enabled	   interfaces
docker0		   8000.0242b50974e8	no	
//如果没有创建桥接模式的容器,默认是空的。

创建使用bridge网络模式的容器示例:

[root@localhost ~]# docker run -itd --name bridge busybox:latest    
//创建一个名为bridge的容器,如果没有指定网络模式,默认便是bridge模式
1ac9cc74dd30ec9fc9171f9b4e4aafeb86e3dc7f9b3631589babbdda513dde9e
[root@localhost ~]# docker exec -it bridge /bin/sh   
//进入bridge容器中
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
6: eth0@if7: <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@if7这块虚拟网卡上的地址与docker宿主机的docker0网络属于同一网段
在这里插入图片描述

[root@localhost ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242b50974e8	no		vethe0de146
//可以看到桥接模式的接口下出现了一个新的接口,当创建一个容器便会出现一个接口
//这个接口便是容器在docker宿主机创建一个虚拟网卡,用于容器与docker通信
[root@localhost ~]# ifconfig vethe0de146
vethe0de146: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20af:48ff:fe3b:8eed  prefixlen 64  scopeid 0x20<link>
        ether 22:af:48:3b:8e:ed  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 24  bytes 2618 (2.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

当使用bridge网络模式,docker的工作步骤大致为:
(1)在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备;
(2)Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以vethe0de146这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看(上述实例已经验证);
(3)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关;

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

[root@localhost ~]#  docker exec -it web5 /bin/sh
[root@localhost ~]# docker run -itd --name web6 --network container:web5 busybox:latest
[root@localhost ~]#  docker exec -it web6 /bin/sh
/ #  echo 123456 > /tmp/index.html
/ #  httpd -h /tmp/
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
6: eth0@if7: <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

[root@localhost ~]#  docker exec -it web5 /bin/sh
/ # wget -O - -q 127.0.0.1 
123456
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
6: eth0@if7: <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<
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker —— 从入门到实践》是一本介绍Docker技术的书籍。Docker是一个开源的容器化平台,可以帮助开发者更方便地构建、部署和运行应用程序。这本书从入门到实践的角度,详细介绍了Docker的基本概念、原理和使用方法。 书中首先介绍了Docker的背景和发展历程,包括为什么需要容器化技术以及Docker的优势。接着,作者详细讲解了Docker的安装和配置,包括在不同操作系统上的安装方法。然后,书中以一个个实例来引导读者学习如何使用Docker进行应用程序的容器化和部署。这些实例包括创建镜像、构建容器、管理数据卷等。 在实践部分,书中介绍了如何使用Docker搭建开发环境和测试环境,以及如何使用Docker进行持续集成和持续部署。另外,还介绍了Docker的监控和日志管理、网络配置以及安全性等方面的内容。 这本书的优点在于它结合了理论和实践,既对Docker的原理和概念进行了深入讲解,又提供了丰富的实践案例。通过学习这本书,读者可以系统地掌握Docker的基础知识,并能够利用Docker来管理和部署应用程序。 总的来说,《Docker —— 从入门到实践》是一本很好的Docker入门书籍,适合有一定编程和系统管理基础的读者。它的内容丰富有趣,通俗易懂,通过读这本书,读者可以快速上手使用Docker,并能够在实践中不断深化对容器化技术的理解和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值