Docker容器docker跨主机容器通信通信方案选哪一种

中国领先的IT技术网站
51CTO旗下网站
Docker跨主机通信实现与分析
docker的overlay的网络驱动支持跨主机通信,这个实现在libnetwork中基于内置的VXLAN实现以及docker的libkv库。使用overlay网络需要依赖K-V Store,目前支持的K-V Store包括etcd、Consul、Zookeeper。
作者:付广平| 10:20
docker目前支持以下5种网络模式:
bridge:此时docker引擎会创建一个veth对,一端连接到容器实例并命名为eth0,另一端连接到指定的网桥中(比如docker0),因此同在一个主机的容器实例由于连接在同一个网桥中,它们能够互相通信。容器创建时还会自动创建一条SNAT规则,用于容器与外部通信时。如果用户使用了-p或者-Pe端口端口,还会创建对应的端口映射规则。
host:与宿主机共享网络,此时容器没有使用网络的namespace,宿主机的所有设备,如Dbus会暴露到容器中,因此存在安全隐患。
none:不设置网络,相当于容器内没有配置网卡,用户可以手动配置。
container:指定与某个容器实例共享网络
network:使用自定义网络,可以使用docker network
create创建,并且默认支持多种网络驱动,用户可以自由创建桥接网络或者overlay网络。
默认是桥接模式,网络地址为172.16.0.0/16,同一主机的容器实例能够通信,但不能跨主机通信。本文下面将介绍如何使用gre隧道技术实现跨主机通信。
本文使用两台主机A,B模拟实验,这两台主机其实是virtalbox虚拟机,操作系统为ubuntu14.04,均配置有两张网卡,网卡配置如下:
eth0:与宿主机桥接,连接公网
eth1:host only网卡,分配的ip地址为192.168.56.0/24,连接在同一个host only的网卡能够互相通信
其中A主机网络:
eth0:&172.16.1.24(公司内网IP,能够通外网)&eth1:&192.168.56.4&
B主机网络:
eth0:&172.16.1.178(公司内网IP,能够通外网)&&eth1:&192.168.56.5&
两台主机需要安装以下软件包:
Docker,实验时使用的最新版本1.11,快速安装:
curl&-sSL&/&|&sh&
Openvswitch, 安装方法:
sudo&apt-get&install&openvswitch-switch&
bridge-utils,也可以不安装,使用ovs-vsctl。
Docker配置
两台主机的容器能够通信,不能出现网络重叠,因此设置不同的网络:
A:&10.103.100.0/24&&B:&10.103.200.0/24&
并且为了加速镜像拉取,使用灵雀云镜像。最后A主机配置文件/etc/default/docker如下:
DOCKER_OPTS=&$DOCKER_OPTS&--registry-mirror=http://houchaohann.&--bip=10.103.100.1/24&--fixed-cidr=10.103.100.0/24&&
B主机配置文件/etc/default/docker如下:
DOCKER_OPTS=&$DOCKER_OPTS&--registry-mirror=http://houchaohann.&--bip=10.103.200.1/24&--fixed-cidr=10.103.200.0/24&&
分别重启A、B主机Docker服务:
sudo&service&docker&restart&
此时A主机docker0网桥地址为10.103.100.1,B主机docker0网桥地址为10.103.200.1。
在A主机上ping 10.103.200.1显然不通,同理B主机ping不通A主机网桥。
在A主机上创建一个网桥(使用ovs-vsctl,不要使用brctl):
sudo&ovs-vsctl&add-br&docker_tunnel&
将gre0接口加入到网桥docker_tunnel, 创建一个GRE隧道添加到网桥中并配置远端IP,注意:我们在eth1之上建立隧道,因此需要使用eth1
sudo&ovs-vsctl&add-port&docker_tunnel&gre0&&
fgp@ubuntu-4:~$&sudo&ovs-vsctl&show&2189345f-d4fb-4915-ab97-4c65a8d9ffe0&&&&&Bridge&docker_tunnel&&&&&&&&&Port&&gre0&&&&&&&&&&&&&&Interface&&gre0&&&&&&&&&&&&&&&&&&type:&gre&&&&&&&&&&&&&&&&&options:&{remote_ip=&192.168.56.5&}&&&&&&&&&Port&docker_tunnel&&&&&&&&&&&&&Interface&docker_tunnel&&&&&&&&&&&&&&&&&type:&internal&&&&&ovs_version:&&2.0.2&&
把docker_tunnel加入到docker0网桥中:
sudo&brctl&addif&docker0&docker_tunnel&
增加路由:
sudo&ip&route&add&10.103.200.0/24&via&192.168.56.5&dev&eth1&
此时路由表:
fgp@ubuntu-4:~$&sudo&route&-n&Kernel&IP&routing&table&Destination&&&&&Gateway&&&&&&&&&Genmask&&&&&&&&&Flags&Metric&Ref&&&&Use&Iface&0.0.0.0&&&&&&&&&172.16.1.1&&&&&&0.0.0.0&&&&&&&&&UG&&&&0&&&&&&0&&&&&&&&0&eth0&10.103.100.0&&&&0.0.0.0&&&&&&&&&255.255.255.0&&&U&&&&&0&&&&&&0&&&&&&&&0&docker0&10.103.200.0&&&&192.168.56.5&&&&255.255.255.0&&&UG&&&&0&&&&&&0&&&&&&&&0&eth1&172.16.1.0&&&&&&0.0.0.0&&&&&&&&&255.255.255.0&&&U&&&&&0&&&&&&0&&&&&&&&0&eth0&192.168.56.0&&&&0.0.0.0&&&&&&&&&255.255.255.0&&&U&&&&&0&&&&&&0&&&&&&&&0&eth1&
验证A主机是否能和B通信:
fgp@ubuntu-4:~$&ping&-c&2&-w&1&10.103.200.1&PING&10.103.200.1&(10.103.200.1)&56(84)&bytes&of&data.&64&bytes&from&10.103.200.1:&icmp_seq=1&ttl=64&time=0.339&ms&&&1&packets&transmitted,&1&received,&0%&packet&loss,&time&0ms&rtt&min/avg/max/mdev&=&0.339/0.339/0.339/0.000&ms&
同样在B主机执行相同步骤:
sudo&ovs-vsctl&add-br&docker_tunnel&sudo&ovs-vsctl&add-port&docker_tunnel&gre0&&sudo&brctl&addif&docker0&docker_tunnel&sudo&ip&route&add&10.103.100.0/24&via&192.168.56.4&dev&eth1&
验证B主机是否能够和A通信:
fgp@ubuntu-5:~$&ping&-c&2&-w&1&10.103.100.1&PING&10.103.100.1&(10.103.100.1)&56(84)&bytes&of&data.&64&bytes&from&10.103.100.1:&icmp_seq=1&ttl=64&time=0.336&ms&64&bytes&from&10.103.100.1:&icmp_seq=2&ttl=64&time=0.409&ms&&&2&packets&transmitted,&2&received,&0%&packet&loss,&time&999ms&rtt&min/avg/max/mdev&=&0.336/0.372/0.409/0.041&ms&
验证docker容器跨主机通信
A主机创建ubuntu14.04容器:
docker&run&-t&-i&&
在容器内部查看ip地址:
#&from-A&ifconfig&eth0&|&grep&'inet&addr'&|&cut&-d&':'&-f&2&|&cut&-d&'&'&-f&1&#&10.103.100.2&
B主机创建ubuntu14.04容器:
docker&run&-t&-i&&
在容器内部查看地址:
#&from-B&ifconfig&eth0&|&grep&'inet&addr'&|&cut&-d&':'&-f&2&|&cut&-d&'&'&-f&1&#&10.103.200.2&
在A容器实例上ping B容器实例:
#&from-A&ping&10.103.200.2&
root@from-A:/#&ping&-c&2&-w&1&10.103.200.2&PING&10.103.200.2&(10.103.200.2)&56(84)&bytes&of&data.&64&bytes&from&10.103.200.2:&icmp_seq=1&ttl=62&time=0.510&ms&&&1&packets&transmitted,&1&received,&0%&packet&loss,&time&0ms&rtt&min/avg/max/mdev&=&0.510/0.510/0.510/0.000&ms&
我们发现,在主机A的容器成功ping通主机B的容器,实现了跨主机通信!
使用docker-swarm实现跨主机容器通信
docker的overlay的网络驱动支持跨主机通信,这个实现在libnetwork中基于内置的VXLAN实现以及docker的libkv库。使用overlay网络需要依赖K-V
Store,目前支持的K-V Store包括etcd、Consul、Zookeeper。
本来想直接使用docker启动consul的,后来发现docker
daemon启动依赖consul,因此只能先按照consul。首先到官方下载安装包:下载地址,解压缩后,只有一个二进制文件,直接运行即可:
nohup&./consul&agent&-dev&-advertise&172.16.1.24&-client&0.0.0.0&&&
注意: 该服务在A机器上运行,172.16.1.24务必配成能够连接外网的IP地址,否则后面启动Swarm容器时内部无法通信!
然后修改A、B服务的daemon配置文件/etc/default/docker:
DOCKER_OPTS=&--cluster-store=consul://172.16.1.24:8500&--cluster-advertise=eth0:2375&&DOCKER_OPTS=&$DOCKER_OPTS&--registry-mirror=http://houchaohann.&-H&tcp://0.0.0.0:2375&-H&unix:///var/run/docker.sock&&
重启docker服务:
sudo&service&docker&restart&
执行docker info必须包含以下信息:
Cluster&store:&consul://172.16.1.24:8500&Cluster&advertise:&172.16.1.24:2375&
接着我们需要部署Docker Swarm集群,详细过程参考手动部署docker-swarm集群。
最后创建overlay网络:
docker&network&create&&
其中--dirver指定为overlay,并指定我们需要的子网地址,名称为test,通过docker network
ls可以检查我们创建的网络是否成功:
fgp@ubuntu-5:~$&docker&network&ls&|&grep&test&7eef808f272b&&&&&&&&test&&&&&&&&&&&&&&&&&&&&&&&overlay&
此时overlay网络创建完毕。我们测试其是否支持跨主机通信,首先我们创建一个ubuntu容器,命名为ubuntu-1,并使用我们刚刚创建的网络:
docker&run&-t&-i&-d&&
接着我们创建第一个ubuntu容器,此时为了保证它不和ubuntu-1调度在同一台主机上,我们需要使用docker
swarm的filter,指定affinity,如下:
docker&run&-t&-i&-d&&
运行docker ps:
docker&ps&fgp@ubuntu-5:~$&docker&ps&CONTAINER&ID&&&&&&&&IMAGE&&&&&&&&&&&&&&&COMMAND&&&&&&&&&&&&&CREATED&&&&&&&&&&&&&STATUS&&&&&&&&&&&&&&&&&&PORTS&&&&&&&&&&&&&&&NAMES&ba5018dfe26e&&&&&&&&ubuntu:14.04&&&&&&&&&/bin/bash&&&&&&&&&&2&minutes&ago&&&&&&&Up&Less&than&a&second&&&&&&&&&&&&&&&&&&&&&&&ubuntu-5/ubuntu-1&bedd266cddaa&&&&&&&&ubuntu:14.04&&&&&&&&&/bin/bash&&&&&&&&&&14&hours&ago&&&&&&&&Up&41&seconds&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ubuntu-4/ubuntu-2&
由此可知,两个ubuntu容器运行在不同的主机上,符合我们的测试要求。分别获取ubuntu-1和ubuntu-2的ip地址:
fgp@ubuntu-5:~$&docker&inspect&-f&''&ubuntu-1&10.103.240.2&fgp@ubuntu-5:~$&docker&inspect&-f&''&ubuntu-2&10.103.240.3&
可见ubuntu-1的ip地址为10.103.240.2,ubuntu-2的ip地址为10.103.240.3,我们在ubuntu-1上ping
ubuntu-2地址:
fgp@ubuntu-5:~$&docker&exec&-t&-i&ubuntu-1&ping&-c&2&10.103.240.3&PING&10.103.240.3&(10.103.240.3)&56(84)&bytes&of&data.&64&bytes&from&10.103.240.3:&icmp_seq=1&ttl=64&time=0.559&ms&64&bytes&from&10.103.240.3:&icmp_seq=2&ttl=64&time=0.661&ms&&&2&packets&transmitted,&2&received,&0%&packet&loss,&time&999ms&rtt&min/avg/max/mdev&=&0.559/0.610/0.661/0.051&ms&
结果发现,不在同一主机的ubuntu-1和ubuntu-2能够正常通信!
【本文是51CTO专栏作者&付广平&的原创文章,如需转载请通过51CTO获得联系】
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
云极星创 研发工程师
本周排行本月排行
讲师:218419人学习过
讲师:51812人学习过
讲师:12585人学习过用户名:chilei0411
文章数:15
访问量:2230
注册日期:
阅读量:1297
阅读量:3317
阅读量:455629
阅读量:1140243
51CTO推荐博文
Docker容器的跨主机访问使用网桥实现跨网段访问主机1 :192.168.22.101& 主机2:192.168.22.102安装网桥管理工具#sudo apt-get install bridge-until配置网卡地址# sudo vim /etc/network/interfaces配置其中一块网卡的网络参数,另一块网卡配置参数一样,这里不在演示重新启动网卡# sudo /etc/init.d/networking restart查看网络配置,发现eth0已经没有地址而br1有地址在另一台主机上执行相同的操作,这里我们就不演示了编辑docker的配置文件实现使用br1来启动docker# sudo vim /etc/default/docker--fixed-cidr 限定ip地址的分配范围192.168.22.102配置192.168.22.101配置我们在192.168.22.101上启动一个容器,查看下ip地址,是否在我们分配的范围内我们在192.168.22.102上在启动一个容器,看下ip是否在我们分配的范围内测试一下这两个容器是否可以互联,发现完全没有问题。open-vswitch实现跨网段访问open vswitch是什么?open vswitch是一个高质量的,多层虚拟交换机,简称ovs。拓扑安装open vswitch#sudo apt-get install -y openvswitch-switch建立ovs网桥#sudo ovs-vsctl add-br obr0添加gre连接# sudo ovs-vsctl add-port obr0 gre0配置docker容器虚拟网桥,其中romote_ip指定对方ip#sudo ovs-vsctl set interface gre0 type=gre& options:romote_ip=192.168.22.101查看一下我们的ovs配置#sudo ovs-vsctl show创建br0桥接到obr0sudo brctl addbr br0sudo ifconfig br0 192.168.200.1 netmask255.255.255.0sudo brctl addif br0 obr0编辑docker的配置文件# sudo vim /etc/default/docker向两端添加去对方的默认路由# sudo ip route add 192.168.100.0/24 via192.168.22.101 dev eth0在192.168.22.102上启动一个容器&在192.168.22.101上启动一个容器测试一下网络,发现两端是可以连通的weave实现跨网段访问weave是什么呢?weave创建了一个虚拟网络,用来连接部署在多台机器上的docker容器安装weave#&sudo&wget&-O&/usr/local/bin/weave&/zettio/weave/master/weave#&sudo&chmod&a+x&/usr/local/bin/weave启动weave#&weave&launch主机ip地址192.168.22.102& 192.168.22.105启动第二台主机的weave 并指定对方的ip地址#weavelaunch 192.168.22.102在一台主机上启动一个容器weave run192.168.200.2/24 -it --name dk1 192.168.22.103:5000/ubuntusudo dockerattach dk1在另一台主机上启动一个容器# weave run192.168.200.3/24 -it --name dk2 192.168.22.103:5000/ubuntusudo dockerattach dk2测试一下网络&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)4375人阅读
容器|Windows Container(2)
容器|Docker(28)
前面我们已经针对Docker容器进行了简单介绍,相信感兴趣的朋友已经能在相关帮助下部署一个docker环境感受了容器带给我们的另一种技术进步。
当然,如果你慢慢深入容器的技术研究,你会发现,尽管容器是虚拟机的未来趋势,但是容器还有很多需要进步,特别是关于网络方面,虚拟化技术可以支持非常丰富的网络需求,但是现在容器可能在这一块还需要继续进步和完善,最大的需求就是如果我们构建容器集群,我们可能只在一个宿主机上创建多个容器,可能需要N个宿主机,每个宿主机上又包含M个容器,我们需要N*M个容器组成一个大的容器集群网络,那么如何跨宿主机进行容器的网络连接是需要我们关注的,当然,现在也有非常多的方案供我们去选择:
--------------------------------------------------------------------------------------
宗旨:专注于&GIS+&前沿技术的研究与交流,将云计算技术、大数据技术、容器技术、物联网与GIS进行深度融合,探讨&GIS+&技术和行业解决方案
转载说明:文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
--------------------------------------------------------------------------------------
1、利用容器暴露端口方式
2、LinuxBriage方式
3、例如类似weave方式实现
4、也是本博客介绍的利用OpenvSwitch来实现
关于OpenvSwitch不多介绍,我OpenStack的早期版本(K版本之前),关于网络Neutron的实现都是通过OpenvSwitch。
使用VMWare Workstation12
Ubuntu14.04
Docker 1.9.0
1、构建OpenvSwitch安装包
默认安装的版本不符合需求,也可以在一个新环境执行如下步骤
#获取最新存档
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz
tar xzvf openvswitch-2.3.1.tar.gz
cd openvswitch-2.3.1
sudo apt-get install -y build-essential fakeroot debhelper \
autoconf automake bzip2 libssl-dev \
openssl graphviz python-all procps \
python-qt4 python-zopeinterface \
python-twisted-conch libtool
# 构建(不使用并行检查)
DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary
# 得到最新deb文件并复制到某处
ls -al *deb
执行完毕之后可以看到
openvswitch-2.3.1.tar.gz
openvswitch-common_2.3.1-1_amd64.deb
openvswitch-datapath-dkms_2.3.1-1_all.deb
openvswitch-datapath-source_2.3.1-1_all.deb
openvswitch-dbg_2.3.1-1_amd64.deb
openvswitch-ipsec_2.3.1-1_amd64.deb
openvswitch-pki_2.3.1-1_all.deb
openvswitch-switch_2.3.1-1_amd64.deb
openvswitch-test_2.3.1-1_all.deb
openvswitch-vtep_2.3.1-1_amd64.deb
python-openvswitch_2.3.1-1_all.deb
这也是我们需要的相关版本,然后安装即可(默认认为Docker环境以及安装好)
sudo apt-get install -y bridge-utils
sudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb \
openvswitch-switch_2.3.1-1_amd64.deb
2、配置网络
默认两台机器的IP可以互相ping通,然后,只需要设置网络即可
例如在192.168.12.107机器上设置为
# auto:为了有效地在主机启动时启动它
# br0=br0:防止在`ifquery --list`时被找到
auto br0=br0
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports gre1 gre2
ovs_extra set bridge ${IFACE} stp_enable=true
# 没有auto,这是ovs的一个额外配置
# 两台主机的gre名字必须相符
allow-br0 gre1
iface gre1 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=192.168.12.117
# auto:启动时创建
# 定义docker要使用的docker0,并(在可用时)连接到到OpenVSwitch创建的br0网桥上
# 每台主机需要使用不同的IP地址(不要相互冲突!)
auto docker0=docker0
iface docker0 inet static
address 172.17.1.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
在其他机器上,只需在配对的远程IP修改即可,如果需要更多的宿主机,可以添加更多的gre隧道即可,例如
allow-br0 gre2(新的gre)
iface gre2 inet manual
ovs_type OVSPort
ovs_bridge br0 (都在br0网桥)
ovs_extra set interface ${IFACE} type=gre options:remote_ip=192.168.12.199(新的IP)
生成树协议(Spanning Tree Protocol):如果应用该配置,将在3台服务器中创建一个网络回路,这可不行。给br0网桥添加stp_enable=true将确保一些gre隧道被切断。同时确保网状网络的冗余,允许网络在其中一台主机下线时恢复。MTU:这是一项关键设定!没有这项,你可能获得一些意外“惊喜”:网络看起来工作正常(比如可以ping),但无法支持大数据包(比如BW测试中的iperf、大数据量请求或简单的文件复制)。注意,需要封装多种协议:
以太网:14字节——我们说的是网桥间的第2层;IPv4:20字节——容器/主机间通讯;GRE:4字节——因为,嗯,这是个GRE隧道;也就是物理网卡MTU减去38字节,结果是1462(基于常规的1500 MTU网卡)。
在auto定义中使用“=”:对于具有固定IP的服务器这不是必需的,但有些云服务商(这里就不说是谁了……Digital
Ocean(译者:软广再次乱入))使用了一个依靠ifquery --list --allow auto的init服务(/etc/init/cloud-init-container.conf)。不加上“=”号将包含OpenVSwitch网卡,并延迟整个启动过程直到init脚本失败并超时。docker0网桥:每台服务器都需要自己的IP地址(比如172.17.1.1、172.17.1.2)。由于docker0网桥处在br0网桥之上,它们将(也应该!)可以相互连接。想象一下,要解决IP冲突会有多乱……这也是为什么我们要在启动时定义它,而不依赖docker服务来为我们创建这个网桥。GRE隧道:你可以从gre0(而不是gre1)开始,它能完美工作。但由于某种原因,在输入ifconfig时你可以看到gre0,却看不到其他隧道。这可能是gre0作为的一个副作用。从gre1开始将让所有的gre隧道对ifconfig“隐身”(好过于只能看见一个)。别着急,你还是可以使用ovs-vsctl命令显示隧道/网桥。3台以上主机:你可以遵循相同的逻辑,并且:
添加额外的隧道(iface greX)来连接新主机。在br0网桥定义中更新ovs_ports以包含interfaces文件中定义的所有gre隧道。聪明点……不要将每台服务器跟其他主机一一链接……STP收敛(convergence)将需要更长的时间,并且无法提供任何除了多重额外链路冗余之外的有用价值。
设置完毕之后,建议重启机器,然后可以在任意机器上都可以相互ping通管理IP(192.168.12.xxx)和docker0的IP(172.17.1.xxx)
3、容器添加
现在已经有网络了,需要将各个宿主机的容器都添加到docker0里面
每台主机(192.168.12.107、192.168.17.117)挂接到前面创建的docker0网桥上,其各自的IP地址是172.17.1.1、172.17.1.2;给docker0网卡指定了一个/16的IP范围;给每台主机指定了一小块docker0的IP范围,以/18&fixed-cidr的形式保存在它们的docker服务配置中。分别是172.17.64.0/18、172.17.128.0/18
如果你的主机多于3台,你需要细分一个每个范围,或根据组织需要对整个网络拓扑结构进行重新考虑。
所需,需要为每一个宿主机的docker配置相关IP信息
例如docker1机器(/etc/default/docker)
BRIDGE=docker0
CIDR=172.17.64.0/18
wait_ip() {
address=$(ip add show $BRIDGE | grep 'inet ' | awk '{print $2}')
[ -z &$address& ] && sleep $1 || :
wait_ip 15
DOCKER_OPTS=&
-H unix:///var/run/docker.sock
-H tcp://0.0.0.0:2375
--fixed-cidr=$CIDR
--bridge $BRIDGE
--mtu 1462
其他机器的CIDR参考上述即可。
你可以根据需要修改DOCKER_OPTS配置,添加镜像、不安全的registry、DNS等等。
wait_ip:由于docker0网桥最后被创建,获取IP地址可能需要花点时间。使用wait_ip“功能”,你可以在返回docker
init脚本前安全地等待几秒钟。该配置文件是被真正的init脚本(/etc/init/docker.conf)所引用。mtu:与前面相同原因,只是一个预防措施,用于确保每个网卡被创建时会被指定正确的MTU。-H tcp://……:如果你不想通过0.0.0.0将其“公开”(或绑定到服务器“真实”网卡之一),你也可以将它安全地绑定到……该主机的docker0&IP地址(比如172.17.1.2)!这样,你可以从任何一台主机访问到私有网状网络里的任何一个docker服务。
1、分别在docker1和docker2运行容器实例
我在docker1运行了两个ubuntu 14.04实例,相关IP分别是172.17.64.1和172.17.64.2
我在docker2运行了一个ubuntu 14.04实例,相关IP分别是172.17.128.1
首先测试是否可以ping通
然后,我针对docker1的64.2容器,与docker2的128.1进行测试,分别安装了ssh服务,然后为docker2容器创建ss用户,然后通过docker1的64.2容器,进行ssh远程连接。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:320338次
积分:5014
积分:5014
排名:第5743名
原创:174篇
转载:14篇
评论:101条
(1)(1)(1)(1)(1)(1)(2)(3)(7)(1)(3)(4)(3)(3)(6)(3)(9)(3)(21)(15)(14)(19)(1)(2)(3)(6)(9)(15)(8)(22)用户名:李振良OK
文章数:175
评论数:372
访问量:463542
注册日期:
阅读量:1297
阅读量:3317
阅读量:455629
阅读量:1140243
51CTO推荐博文
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.02、容器默认网络配置过程先创建一个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
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/dockerDOCKER_OPTS="-b=br0"$ sudo service docker restart接下来启动一个容器,先不配置网络信息:$&sudo&docker&run&-itd&--name=ubuntu_test&--net=none&ubuntu &不配置ip的原因是:容器启动后自动随机分配一个网桥段的IP,这个IP不管你宿主机网络中是否已经分配,它都会根据自身的算法来分配IP,docker有自己的一套分配算法。所以既然选择桥接网络,就要事先规划好IP分配。4、创建容器没配置网络,该怎么配置呢?pipework是一个LXC网络管理工具,用shell写的,有200多行代码。可以给容器配置固定IP地址:$ git&clone&/jpetazzo/pipework.git$ sudo&cp&pipework/pipework&/usr/local/bin/$ sudo&pipework&br0 ubuntu_test&192.168.18.29/24@192.168.18.1Warning:&arping&not&&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命名空间的网络参数。博客地址: 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:226、容器跨主机通信由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案。这里利用OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使用。什么是OpenVSwich?OpenVSwich是一种开源软件,通过软件的方式实现二层交换机功能,专门管理多租赁云计算网络环境,提供虚拟网络中的访问策略、网络隔离、流量监控等。既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识。实验环境:操作系统: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&set&dev&kbr0&up#查看网桥信息$ sudo brctl show#添加docker网桥配置信息(18.17宿主机按照这种方式配置自己)$ vi /etc/network/interfacesauto&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
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也可以实现跨主机容器通信,也是类似于一个网络交换机,配置简单,有兴趣朋友可以了解下。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 docker 主机访问容器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信