docker 网络_初探Docker的网络模式
![](/assets/blank.gif)
xiaohang
一个写不好代码的年轻人
钢铁侠的铁杆粉丝;I am Iron Man!
刚接触Docker的时候,你是否好奇容器之间是怎么通信的呢?
今天我们就一起来认识一下docker的网络吧~
Docker的网络模块是可插拔式的,默认有五种网络模式可以选择。
通过docker network ls这个命令来查看本机中所有的网络模式。
[root@VM_0_14_centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c79756cf9cde bridge bridge local
204025a5abbc host host local
9b9024f5ac40 macvlan macvlan local
6478888548d8 none null local
p2e02u1zhn8x 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 busybox
24d88c0b3af9df06c367e9991c7628a2eaeb54e4f40a5326585fcf1274ea2f8f
[root@VM_0_14_centos ~]# docker exec -it box1 sh
/ # ip addr show eth0
68: 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 busybox
f3980be667731ae36aa567910f4a7e80fcc877c33dec59b70f7dc6e49f8fe3f2
[root@VM_0_14_centos ~]# docker exec -it box2 sh
/ # ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.146 ms
64 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 eth0
2: 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 eth0
2: 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 busybox
77436b9c2c1638c498396ff765c27ffec885ff62d892c2064f41497460037156
[root@VM_0_14_centos ~]# docker exec box ip addr show eth0
67: 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 route
default via 172.16.86.1 dev eth0
172.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 ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
sa3m7r6m1lg4iz6dcfvyggr6s * VM_0_14_centos Ready Active Leader 19.03.11
azpq5fgozz5rd9y4lm11u69wq VM_0_15_centos Ready Active 19.03.11
5mbf4l9k0y8zg69il7pk5ztxw 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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1bf24ed438cf 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 busybox
f431bffbd88712f940aee745d7a1e6795f3ef545f79bb2151628f9198c9b1c1e
[root@VM_0_14_centos ~]# docker exec -it box3 sh
/ # ifconfig
lo 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 ·
记得文末点个在看鸭~
![](/assets/blank.gif)
点就完事儿了!
docker 网络_初探Docker的网络模式相关推荐
- 深度学习深度前馈网络_深度学习前馈网络中的讲义第4部分
深度学习深度前馈网络 FAU深度学习讲义 (FAU Lecture Notes in Deep Learning) These are the lecture notes for FAU's YouT ...
- docker用gpu的参数_初探Docker调用GPU
前一阵子写了一篇docker的学习笔记[1],但是当时没有gpu,所以没法做显卡调用相关的内容.最近机房的电脑启动了,有了实验环境,打算把docker调用gpu相关的内容测试一下.实验环境依然为Ubu ...
- docker使用_使用Docker正确的姿势
通过VS Code和Docker扩展成为Docker高级用户. > Photo by Michał Parzuchowski on Unsplash 您可以使用选择的语言来实施服务. 现在,您想 ...
- docker初识_初识 docker 搭建自己的开发环境
换了一台设备,程序猿嘛第一件事肯定是先把开发环境搭建起来,以前为了方便都是搞的集成环境,这次准备下载集成环境的时候,突然想起 docker 这个东西,在下虽然了解一些概念性的东西但一直为曾实践.人嘛, ...
- windows docker 卸载_安装Docker(Docker Toolbox)与Splash库
想要安装Splash库,先安装Docker. 1.Docker安装 但是面对windows运行环境,大部分的情况来看,需要先安装Docker Toolbox才可以. 我是win10系统,安装了Dock ...
- ubuntu docker慢_基于docker搭建MulVAL攻击图
拥抱docker,经常做了一些好玩的东西,想在别人的电脑上运行,都发现一堆问题,不是少一个依赖,就是缺一个环境变量,好不郁闷.于是,将目光锁定在了docker上,只要大家都有docker,自己本地能跑 ...
- 打docker镜像_使用docker构建自己的镜像
在docker中,我们使用docker build构建一个新的镜像,构建镜像之前需要去编写Dockerfile这个文件才能否建一个新的镜像. 官方文档:https://docs.docker.com/ ...
- python docker实战_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3
从上篇docker commit学习可以了解到,镜像的定制其实每一层添加的配置和文件,如果把每一层的修改配置,修改文件,都写入脚本,用这个脚本构建定制镜像,无法重复的问题,镜像构建透明性的问题,体积的 ...
- centos7 docker端口_使用Docker部署Python应用
0 引言 在linux系统部署Python应用需要安装较多依赖,在内网环境下十分繁琐,而且有时候还需要在其他服务器运行,则需要重复搭建环境和部署应用,因此本文介绍利用docker容器技术来部署.鉴于本 ...
最新文章
- JBDC更新计数行以及调用存储过程返回多个结果集
- atcode062D(预处理&优先队列)
- 纯干货,Spring-data-jpa详解,全方位介绍。
- 让zabbix图像中文不再是乱码
- 网红奶茶雪糕高价背后,到底是真好吃还是智商税
- 你会换吗?报告称将有大批iPhone用户升级苹果5G新机
- Java基础学习总结(88)——线程创建与终止、互斥、通信、本地变量
- mysqldump导出insert带字段
- PAT 乙级 1042. 字符统计(20) Java版
- 西方主要管理思想简介
- Casbin之基于角色的控制访问RBAC
- 互联网常见的大数据分析指标
- python---之struck.pack()和struct.unpack
- 基于springboot+jsp的服装穿搭信息管理系统
- 下载文件到本地解压压缩包出现文件损坏,报错问题已解决
- 00后表示真干不过,部门新来的00后网络安全工程师已把我卷崩溃,想离职了...
- Smart3D(ContextCapture)跑三维到底要啥配置?!40000元来组建建模集群
- 青龙面板 Bot配置教程
- 13年android手机top,2013年1月安卓热门机型Top20
- 如何找回OneNote 误删、丢失的笔记
热门文章
- Python函数学习
- 9_less中的层级结构
- 车场系统服务器内存莫名急速下降,宝德工控机在停车场监控系统的解决方案
- ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)
- mjorm java_MongoDB 的 ORM框架 MJORM
- jssdk信息验证失败_阿里云环境中TLS/SSL握手失败的场景分析
- oracle创建目录的命令,使用create database命令手工创建Oracle数据库
- java 反射调用set方法_java反射调用set方法时如果让参数做自动类型转换
- windows2008r2补丁_我偶然发现一个严重 0day,影响 Win7 和 Server 2008 R2,微软未发补丁(详情)...
- android 手机铃声设置铃声设置,Android 修改系统来电铃声