前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初探Docker的网络模式

初探Docker的网络模式

作者头像
腾讯云TStack
发布2020-06-15 09:40:32
7890
发布2020-06-15 09:40:32
举报
文章被收录于专栏:腾讯云TStack专栏

xiaohang

一个写不好代码的年轻人

钢铁侠的铁杆粉丝;I am Iron Man!

刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢?

今天我们就一起来认识一下docker的网络吧~

Docker的网络模块是可插拔式的,默认有五种网络模式可以选择。

通过docker network ls这个命令来查看本机中所有的网络模式。

代码语言:javascript
复制
[root@VM_0_14_centos ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEc79756cf9cde        bridge              bridge              local204025a5abbc        host                host                local9b9024f5ac40        macvlan             macvlan             local6478888548d8        none                null                localp2e02u1zhn8x        overlay             overlay             swarm

下面就让我们来动手实践一下这五种模式吧!

bridge

bridge模式是docker的默认网络模式,此模式会为每一个容器设置network namespace、ip地址等,在docker启动时候,就会在主机上创建一个名为docker0的虚拟网桥,在该主机上启动的docker容器都会连接到这个虚拟网桥上,这样就可以和同一宿主机上桥接模式的其它容器进行通信啦。

代码语言:javascript
复制
#运行一个名为box1的busybox容器,网络模式是bridge[root@VM_0_14_centos ~]# docker run -itd --name box1 busybox24d88c0b3af9df06c367e9991c7628a2eaeb54e4f40a5326585fcf1274ea2f8f[root@VM_0_14_centos ~]# docker exec -it box1 sh/ # ip addr show eth068: eth0@if69: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0       valid_lft forever preferred_lft forever
#运行一个名为box2的busybox容器,网络模式是bridge       [root@VM_0_14_centos ~]# docker run -itd --name box2 busyboxf3980be667731ae36aa567910f4a7e80fcc877c33dec59b70f7dc6e49f8fe3f2[root@VM_0_14_centos ~]# docker exec -it box2 sh/ # ping 172.18.0.2PING 172.18.0.2 (172.18.0.2): 56 data bytes64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.146 ms64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.120 ms...

从上面的示例可以看出,同一节点下的容器默认都是可以彼此交流哒~

host

host模式下,容器不会设置自己的network namespace、ip等,而是和宿主机共用,通过--network host可以将容器直接绑定在Docker主机的网络,没有网络隔离,但是其它方面,比如文件系统、进程列表还是与宿主机隔离的。外界也可以直接访问容器。

代码语言:javascript
复制
#运行一个名为box3的busybox容器,网络模式是host[root@VM_0_14_centos ~]# docker run -itd --network host --name box3 busybox

busybox

接下来我们来比较一下宿主机和容器box3的网络,不用怀疑,肯定是一样的啦。

代码语言:javascript
复制
[root@VM_0_14_centos ~]# ip addr show eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000    link/ether 52:54:00:26:bb:53 brd ff:ff:ff:ff:ff:ff    inet 172.17.0.14/20 brd 172.17.15.255 scope global eth0       valid_lft forever preferred_lft forever    inet6 fe80::5054:ff:fe26:bb53/64 scope link       valid_lft forever preferred_lft forever
[root@VM_0_14_centos ~]# docker exec -it box3 sh/ # ip addr show eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000    link/ether 52:54:00:26:bb:53 brd ff:ff:ff:ff:ff:ff    inet 172.17.0.14/20 brd 172.17.15.255 scope global eth0       valid_lft forever preferred_lft forever    inet6 fe80::5054:ff:fe26:bb53/64 scope link       valid_lft forever preferred_lft forever

macvlan

对于某一些应用程序,比如需要监视网络流量,期望直接连接到物理网络,这种情况下,可以使用macvlan的网络模式,docker会为容器的虚拟网络接口分配MAC地址。

创建一个macvlan网络

代码语言:javascript
复制
$ docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eth0 macvlann

启动一个busybox容器,网络模式是macvlan

代码语言:javascript
复制
[root@VM_0_14_centos ~]# docker run -itd --network macvlan --name box busybox77436b9c2c1638c498396ff765c27ffec885ff62d892c2064f41497460037156
[root@VM_0_14_centos ~]# docker exec box ip addr show eth067: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue    link/ether 02:42:ac:10:56:03 brd ff:ff:ff:ff:ff:ff    inet 172.16.86.3/24 brd 172.16.86.255 scope global eth0       valid_lft forever preferred_lft forever
[root@VM_0_14_centos ~]# docker exec box ip routedefault via 172.16.86.1 dev eth0172.16.86.0/24 dev eth0 scope link  src 172.16.86.3

overlay

overlay网络是使用在swarm集群中,用于连接不同主机上的docker容器,允许不同宿主机上的容器相互通信。

代码语言:javascript
复制
#通过此命令我们可以创建集群中的manager,在输出信息中会包含一个token[root@VM_0_14_centos ~]# docker swarm init

然后执行以下命令将工作节点加入集群

代码语言:javascript
复制
$ docker swarm join --token <token> <manager_host>:2377

新建一个overlay网络

代码语言:javascript
复制
[root@VM_0_14_centos ~]# docker network create --driver=overlay --attachable overlay
#列出docker swarm中所有节点,其中VM_0_14_centos这个节点是leader,其它两个节点是工作节点[root@VM_0_14_centos ~]# docker node lsID                            HOSTNAME                  STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSIONsa3m7r6m1lg4iz6dcfvyggr6s *   VM_0_14_centos             Ready               Active              Leader              19.03.11azpq5fgozz5rd9y4lm11u69wq     VM_0_15_centos             Ready               Active                                  19.03.115mbf4l9k0y8zg69il7pk5ztxw     VM_0_16_centos             Ready               Active                                  19.03.7

分别在manager节点和work节点上启动一个busybox容器,并连接到overlay网络

代码语言:javascript
复制
$ docker run -it --network overlay --name box4 sh

然后我们在同一个overlay网络下的容器中互相去ping对方,是可以连接哒~

我们也可以利用overlay网络去创建一个集群服务,使用docker swarm去管理我们的集群服务。现在创建一个五副本的连接到overlay网络的nginx服务,暴露端口为80;

代码语言:javascript
复制
$ docker service create --name my-nginx --publish target=80,published=80 --replicas=5 --network overlay nginx

利用docker ps命令我们可以发现工作节点上也启动了nginx应用,这个就是通过overlay来实现不同主机中容器之间的通信。细心的小伙伴还会发现在任一节点结束一个副本,集群服务就会重启一个新的副本,会一直保持节点内的nginx副本数量为五个,有木有觉得还蛮有意思的!

代码语言:javascript
复制
[root@VM_0_15_centos ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES1bf24ed438cf        nginx:latest        "/docker-entrypoint.…"   16 minutes ago      Up 16 minutes       80/tcp                 my-nginx.3.lcrhn4eelu1d5z4ln1ss9dczq

overlay网络模型在docker集群节点间的加入了一层虚拟网络,它有独立的虚拟网段,因此docker容器发送的内容,会先发送到虚拟子网,再由虚拟子网包装为宿主机的真实网址进行发送。

none

使用的none模式后,这个容器就是封闭的,不会去参与网络通信,这样就能够保证容器的安全性。

代码语言:javascript
复制
#启动一个名为box3的busybox容器,网络模式是none[root@VM_0_14_centos ~]# docker run -itd --network none --name box3 busyboxf431bffbd88712f940aee745d7a1e6795f3ef545f79bb2151628f9198c9b1c1e[root@VM_0_14_centos ~]# docker exec -it box3 sh/ # ifconfiglo        Link encap:Local Loopback          inet addr:127.0.0.1  Mask:255.0.0.0          UP LOOPBACK RUNNING  MTU:65536  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

总 结

docker网络就介绍到这啦,通过上面的实践我们不难发现:

1、在需要多个docker容器在同一个宿主机上进行通信,最好就直接使用默认的bridge模式;

2、当多个应用程序需要组成集群提供高可用服务时候,overlay肯定是最佳的选择;

3、host模式对于优化性能以及在容器需要处理大量端口的情况下很有用,因为它不需要NAT,并且也不会为每个端口创建“ userland-proxy”。当想要容器对网络传输效率有较高要求,就可以选择host模式,但是要注意端口占用的问题哦~

关于docker网络,欢迎童鞋们评论区一起讨论~

●Ceph RGW整体结构,最全干货在这!

还在为容器时区困扰?送你一剂良药!

学会这3招,分分钟迁移业务繁忙虚拟机!

OpenStack Policy鉴权大解密!

· END ·

记得文末点个在看鸭~


点就完事儿了!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云TStack 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档