Docker 网络管理及容器跨主机通信
1、网络模式
docker支持四种网络模式,使用--net选项指定:
host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个。容器将不会虚拟出自己的网卡,IP等,而是使用宿主机的IP和端口,也就是说如果容器是个web,那直接访问宿主机:端口,不需要做NAT转换,跟在宿主机跑web一样。容器中除了网络,其他都还是隔离的。
container,--net=container:NAME_or_ID,与指定的容器共同使用网络,也没有网卡,IP等,两个容器除了网络,其他都还是隔离的。
none ,--net=none,获得独立的network namespace,但是,并不为容器进行任何网络配置,需要我们自己手动配 置。
bridge,--net=bridge,默认docker与容器使用nat网络,一般分配IP是172.17.0.0/16网段,要想改为其他网段,可以直接修改网桥IP地址,例如:
$ sudo ifconfig docker0 192.168.10.1 netmask 255.255.255.0
2、容器默认网络配置过程
先创建一个docker0的网桥,使用Veth pair创建一对虚拟网卡,一端放到新创建的容器中,并重命名eth0,另一端放到宿主机中,以veth+随机7个字符串名字命名,并将这个网络设备加入到docker0网桥中,网桥自动为容器分配一个IP,并设置docker0的IP为容器默认网关。同时在iptables添加SNAT转换网桥段IP,以便容器访问外网。
Veth par是用于不同network namespace间进行通信的方式,而network namespace是实现隔离网络。
3、容器桥接宿主机网络
关闭docker并设置桥接模式:
$ sudo apt-get install bridge-utils
$ sudo service docker stop
#关闭默认网桥
$ sudo ip link set dev docker0 down
#删除默认网桥
$ sudo brctl delbr docker0
创建桥接网卡:
$ sudo brctl addbr br0 #创建网桥
$ sudo vi /etc/network/interfaces #将原有宿主机IP配置到新创建的网桥上
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.10.10 #宿主机IP
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 192.168.10.1
$ sudo /etc/init.d/networking restart
重启网卡后,再通过ifconfig命令查看,多了br0网桥,并且IP地址也绑定在了上面。
#修改docker桥接网桥并重启
$ sudo vi /etc/default/docker
DOCKER_OPTS="-b=br0"
$ sudo service docker start
接下来启动一个容器,先不配置网络信息:
$ sudo docker run -itd --name=ubuntu_test --net=none ubuntu
不配置ip的原因是:容器启动后自动随机分配一个网桥段的IP,这个IP不管你宿主机网络中是否已经分配,它都会根据自身的算法来分配IP,docker有自己的一套分配算法。
所以既然选择桥接网络,就要事先规划好IP分配。
4、创建容器没配置网络,该怎么配置呢?
pipework是一个LXC网络管理工具,用shell写的,有200多行代码。可以给容器配置固定IP地址:
$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp pipework/pipework /usr/local/bin/
$ sudo pipework br0 ubuntu_test 192.168.18.29/24@192.168.18.1
Warning: arping not found; interface may not be immediately reachable
这一步是给配置容器网络并连接网桥,@左边是与宿主机同网段IP,右边是网关。
提示arping命令没发现,可以通过apt-get install arping来安装。
$ sudo brctl show #查看虚拟网卡veth开头的已加入网桥
$ sudo docker attach ubuntu_test
#进入容器用ifconfig命令查看,IP信息已经配置上,通过ping百度及同网段IP是相通的,配置成功。
pipework工具怎么实现配置的IP呢?
pipework是通过ip netns exec进入容器的net命名空间,来配置容器net命名空间的网络参数。
博客地址: http://lizhenliang.blog.51cto.com
5、简单讲下怎么SSH连接容器
根据上面的配置后,简单配置下SSH服务即可实现SSH远程登录:
#进入容器
$ sudo docker attach ID/NAME
#安装SSH
$ sudo apt-get update
$ sudo apt-get install openssh-server
#修改SSH配置文件(/etc/ssh/sshd_config)
PermitRootLogin yes #运行root登录
UsePAM no #不使用验证模块
#启动SSH
/etc/init.d/ssh restart
#查看是否启动成功
ps -ef |grep ssh
此时已经可以像连接虚拟机那样SSH连接容器了!
在docker默认网络模式情况下,由于容器是docker分配docker0网段的IP,这时又该怎么SSH连接容器呢?
当创建新容器时有选项可以指定宿主机到容器端口,那就是-p选项。
例如:$ sudo docker run -itd --name=ubuntu_test -p 2222:22 ubuntu
2222是宿主机端口,22是容器内部ssh服务端口。这样就可以通过"ssh -p 2222 root@宿主机IP"连接容器了。不但ssh服务可以这样做,比如web、mysql等服务也同样方式实现容器对外提供服务。
当使用-p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看,出现最下面的一条记录:
知道了docker容器网络通信原理,那么,就可以自定义添加规则实现端口映射。
例如:将来自宿主机的2222端口转发到容器的22端口
$ sudo iptables -t nat -A PREROUTING -d 192.168.18.231 -p tcp --dport 2222 -j DNAT --to 172.17.0.1:22
6、容器跨主机通信
由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案实现。这里利用OpenVSwich即开放式虚拟交换机实现容器跨主机通信。
什么是OpenVSwich?
OpenVSwich是一种开源软件,通过软件的方式实现交换机功能,专门管理多租赁云计算网络环境,提供VM直接通信和控制。
既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识。
实验环境:
操作系统:ubuntu14.04_x64
宿主机1:192.168.18.16 容器网段:172.17.1.0/24
宿主机2:192.168.18.17 容器网段:172.17.2.0/24
开始创建网络环境(两台宿主机做相同的操作,部分要适当修改,已注明):
#安装openvswitch
$ sudo apt-get install openvswitch-switch bridge-utils
#添加网桥obr0(理解为添加了一个交换机)
$ sudo ovs-vsctl add-br obr0
#将gre0接口加入到网桥obr0, 远程IP写对端IP(创建一个GRE隧道并添加到网桥中)
$ sudo ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.18.17
#查看ovs信息
$ sudo ovs-vsctl show
#添加docker网桥
$ sudo brctl addbr kbr0
#将obr0网桥加入kbr0网桥,并启动
$ sudo brctl addif kbr0 obr0
$ sudo ip link dev kbr0 up
$ sudo ip link set dev kbr0 up
#查看网桥信息
$ sudo brctl show
#添加docker网桥配置信息(18.17宿主机按照这种方式配置自己)
$ vi /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.18.16
netmask 255.255.255.0
gateway 192.168.18.1
dns-nameservers 192.168.18.1
auto kbr0
iface kbr0 inet static
address 172.17.1.1
netmask 255.255.255.0
gateway 172.17.1.0
#删除默认docker网桥
$ sudo ip link set dev docker0 down
$ sudo ip link delete dev docker0
#关键一点,添加路由条目,否则无法通讯(同样在18.17上面这样添加路由,写对端IP)
#via从哪个网关出去,写对端IP。dev由哪个设备出去
$ sudo ip route add 172.17.2.0/24 via 192.168.18.17 dev eth0
至此容器跨主机通信配置完成,两边各创建一个容器来验证吧!
里面涉及到一个GRE隧道,什么是GRE隧道呢?
GRE即通用路由协议封装,隧道技术是一种封装技术,将网络层协议(如IP)的数据报文进行封装,使这些封装的数据报文能够在另一个网络层协议中传输。可以看作是一个虚拟点到点连接,所以建立隧道时,要配置好隧道源地址和目的地址。
另外,weave也可以实现跨主机容器通信,也是类似于一个网络交换机,配置简单,有兴趣朋友可以了解下。
Docker 网络管理及容器跨主机通信的更多相关文章
- overlay实现容器跨主机通信
本节内容: Docker容器跨主机通信方案 环境信息 升级内核 安装docker 防火墙设置和开启内核转发 安装启动consul 启动Docker 创建overlay network 创建容器 测试容 ...
- Docker容器跨主机通信
默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信: 除此之外我们还可以通过 ...
- Docker:macvlan实现容器跨主机通信 [十四]
一.什么是macvlan 1.macvlan 本身是 linux kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址, 2.即多个 interface,每个 interface ...
- Docker容器跨主机通信之:直接路由方式
一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...
- Docker 网络模式和跨主机通信
Docker的四种网络模式 Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上.虚拟网桥的工作方式和物理交 ...
- Docker-Docker容器跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信.这种端口映射方式对很多集群应用来说极 ...
- Docker容器跨主机通信--overlay网络
一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...
- Docker容器跨主机通信之:OVS+GRE
一.概述 由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案 OVS OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使 ...
- Docker:使用Ambassador进行跨主机间容器通信
转载请注明出处:点我 由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主 ...
随机推荐
- NLP︱高级词向量表达(二)——FastText(简述、学习笔记)
FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...
- JAVA代码发送邮件示例和解释(二)
之前有使用过一次在程序中发邮件的功能,也写了一篇相关的笔记,当时使用的是163邮箱,经过测试多个163账号都是可行的.但是最近把账号换成中国移动@chinamobilesz.com这种结尾的时候,却一 ...
- mysql数据库常用数据类型
1.整数:TINYINT.SMALLINT.MEDIUMINT.INT(INTEGER).BIGINT,比较常用的是INT,这五种类型只是取值范围不一样,具体的范围可以在mysql shell界面使用 ...
- vxworks下文件读写示例
dev 1.create file on floopy disk and write contents: -> pdev=fdDevCreate(0,0,0,0) /* A:,1.44M ...
- 标准的SQL语句类型
标准的SQL语句类型 1.查询语句:主要是由select关键字完成 2.事务控制语句:主要由commit.rollback和savepoint三个关键字完成 3.DML(数据操作语言)语句:主要由in ...
- Netty的并发编程实践1:正确使用锁
很多刚接触多线程编程的开发者,虽然意识到了并发访问可变变量需要加锁,但是对于锁的范围.加锁的时机和锁的协同缺乏认识,往往会导致出现一些问题.下面笔者就结合Netty的代码来讲解下这方面的知识. 打开F ...
- CSDN博客添加量子恒道统计代码步骤
CSDN博客添加量子恒道统计代码步骤. 1. 去量子恒道网站统计 注册账户: 2. 添加已有的CSDN博客地址: 3. 添加博客后恒道代码里面会给你一个JavaScript脚本,记下里面的一串数字: ...
- Linux显示目前登入系统的用户信息
Linux显示目前登入系统的用户信息 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ who youhaidong :0 2015-01-26 22:43 (: ...
- ubuntu14.04 64位 安装JDK1.7
ubuntu14.04 64位 安装JDK1.7 1 新建文件夹 youhaidong@youhaidong:~$ sudo mkdir /usr/lib/jvm 2 解压文件 youhaidong@ ...
- 芝麻HTTP:代理的基本原理
我们在做爬虫的过程中经常会遇到这样的情况,最初爬虫正常运行,正常抓取数据,一切看起来都是那么美好,然而一杯茶的功夫可能就会出现错误,比如403 Forbidden,这时候打开网页一看,可能会看到&qu ...