xiaohang

一个写不好代码的年轻人

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

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

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

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

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

[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容器都会连接到这个虚拟网桥上,这样就可以和同一宿主机上桥接模式的其它容器进行通信啦。

#运行一个名为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:  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主机的网络,没有网络隔离,但是其它方面,比如文件系统、进程列表还是与宿主机隔离的。外界也可以直接访问容器。

#运行一个名为box3的busybox容器,网络模式是host[root@VM_0_14_centos ~]# docker run -itd --network host --name box3 busybox

busybox

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

[root@VM_0_14_centos ~]# ip addr show eth02: eth0:  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:  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网络

$ docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eth0 macvlann

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

[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:  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容器,允许不同宿主机上的容器相互通信。

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

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

$ docker swarm join --token :2377

新建一个overlay网络

[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网络

$ docker run -it --network overlay --name box4 sh

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

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

$ docker service create --name my-nginx --publish target=80,published=80 --replicas=5 --network overlay nginx

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

[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模式后,这个容器就是封闭的,不会去参与网络通信,这样就能够保证容器的安全性。

#启动一个名为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 · 

记得文末点个在看鸭~


点就完事儿了!

docker 网络_初探Docker的网络模式相关推荐

  1. 深度学习深度前馈网络_深度学习前馈网络中的讲义第4部分

    深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...

  2. docker用gpu的参数_初探Docker调用GPU

    前一阵子写了一篇docker的学习笔记[1],但是当时没有gpu,所以没法做显卡调用相关的内容.最近机房的电脑启动了,有了实验环境,打算把docker调用gpu相关的内容测试一下.实验环境依然为Ubu ...

  3. docker使用_使用Docker正确的姿势

    通过VS Code和Docker扩展成为Docker高级用户. > Photo by Michał Parzuchowski on Unsplash 您可以使用选择的语言来实施服务. 现在,您想 ...

  4. docker初识_初识 docker 搭建自己的开发环境

    换了一台设备,程序猿嘛第一件事肯定是先把开发环境搭建起来,以前为了方便都是搞的集成环境,这次准备下载集成环境的时候,突然想起 docker 这个东西,在下虽然了解一些概念性的东西但一直为曾实践.人嘛, ...

  5. windows docker 卸载_安装Docker(Docker Toolbox)与Splash库

    想要安装Splash库,先安装Docker. 1.Docker安装 但是面对windows运行环境,大部分的情况来看,需要先安装Docker Toolbox才可以. 我是win10系统,安装了Dock ...

  6. ubuntu docker慢_基于docker搭建MulVAL攻击图

    拥抱docker,经常做了一些好玩的东西,想在别人的电脑上运行,都发现一堆问题,不是少一个依赖,就是缺一个环境变量,好不郁闷.于是,将目光锁定在了docker上,只要大家都有docker,自己本地能跑 ...

  7. 打docker镜像_使用docker构建自己的镜像

    在docker中,我们使用docker build构建一个新的镜像,构建镜像之前需要去编写Dockerfile这个文件才能否建一个新的镜像. 官方文档:https://docs.docker.com/ ...

  8. python docker实战_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3

    从上篇docker commit学习可以了解到,镜像的定制其实每一层添加的配置和文件,如果把每一层的修改配置,修改文件,都写入脚本,用这个脚本构建定制镜像,无法重复的问题,镜像构建透明性的问题,体积的 ...

  9. centos7 docker端口_使用Docker部署Python应用

    0 引言 在linux系统部署Python应用需要安装较多依赖,在内网环境下十分繁琐,而且有时候还需要在其他服务器运行,则需要重复搭建环境和部署应用,因此本文介绍利用docker容器技术来部署.鉴于本 ...

最新文章

  1. JBDC更新计数行以及调用存储过程返回多个结果集
  2. atcode062D(预处理&优先队列)
  3. 纯干货,Spring-data-jpa详解,全方位介绍。
  4. 让zabbix图像中文不再是乱码
  5. 网红奶茶雪糕高价背后,到底是真好吃还是智商税
  6. 你会换吗?报告称将有大批iPhone用户升级苹果5G新机
  7. Java基础学习总结(88)——线程创建与终止、互斥、通信、本地变量
  8. mysqldump导出insert带字段
  9. PAT 乙级 1042. 字符统计(20) Java版
  10. 西方主要管理思想简介
  11. Casbin之基于角色的控制访问RBAC
  12. 互联网常见的大数据分析指标
  13. python---之struck.pack()和struct.unpack
  14. 基于springboot+jsp的服装穿搭信息管理系统
  15. 下载文件到本地解压压缩包出现文件损坏,报错问题已解决
  16. 00后表示真干不过,部门新来的00后网络安全工程师已把我卷崩溃,想离职了...
  17. Smart3D(ContextCapture)跑三维到底要啥配置?!40000元来组建建模集群
  18. 青龙面板 Bot配置教程
  19. 13年android手机top,2013年1月安卓热门机型Top20
  20. 如何找回OneNote 误删、丢失的笔记

热门文章

  1. Python函数学习
  2. 9_less中的层级结构
  3. 车场系统服务器内存莫名急速下降,宝德工控机在停车场监控系统的解决方案
  4. ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)
  5. mjorm java_MongoDB 的 ORM框架 MJORM
  6. jssdk信息验证失败_阿里云环境中TLS/SSL握手失败的场景分析
  7. oracle创建目录的命令,使用create database命令手工创建Oracle数据库
  8. java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换
  9. windows2008r2补丁_我偶然发现一个严重 0day,影响 Win7 和 Server 2008 R2,微软未发补丁(详情)...
  10. android 手机铃声设置铃声设置,Android 修改系统来电铃声