@931876502
2016-05-27T17:20:36.000000Z
字数 5034
阅读 3050
docker
docker ping不通域名 也ping不通ip 解决办法
docker容器跑起来,进入容器ping任何域名或者IP地址都ping不通,而宿主主机可以ping通
解决办法1
:
网络桥接原文地址:http://gdlwolf.blog.51cto.com/343866/1740977
DNS设置原文地址:https://yeasy.gitbooks.io/docker_practice/content/advanced_network/dns.html
centos 6 Docker桥接到主机所在的内网
1、docker网络介绍
Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求。本文首先介绍了Docker自身的4种网络工作方式,然后通过3个样例 —— 将Docker容器配置到本地网络环境中、单主机Docker容器的VLAN划分、多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pipework是如何工作的
Docker的4种网络模式
我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
※host模式,使用--net=host指定。
※container模式,使用--net=container:NAME_or_ID指定。
※none模式,使用--net=none指定。
※bridge模式,使用--net=bridge指定,默认设置。
下面分别介绍一下Docker的各个网络模式。
1.1 host模式
众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,MountNamespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的NetworkNamespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
1.2 container模式
在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
1.3 none模式
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
1.4 bridge模式
bridge模式是Docker默认的网络设置,此模式会为每一个容器分配NetworkNamespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。
1.4.1 bridge模式的拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。
Docker完成以上网络配置的过程大致是这样的:
在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctlshow命令查看。
2、安装相关工具包
安装pipework
git clone https://github.com/jpetazzo/pipework
cd pipework/
cp pipework /usr/bin/
chmod +x /usr/bin/pipework
yumlocalinstall iproute-2.6.32-130.el6ost.netns.2.x86_64.rpm -y
ifconfig -a
说明:docker在启动之后就会创建一个名为docker0的虚拟网卡,以此来和生成的容器进行通信的,而容器则默认情况下是通过docker0 nat方式访问外网,而外网想访问docker容器,则默认情况下需要端口映射。
所以此实验为了避免这种必须端口映射的问题,将docker容器的虚拟网卡桥接到你其他主机所在的公司内网,方便互访,且能以此实现跨主机间的docker容器的访问。
注意:虽然这种方法能解决很多麻烦事,和实现跨主机的访问,但是随着docker数量的不断增加也会伴随着广播风暴的问题,这里一定要注意。
4、停止docker服务
[root@localhosthome]# service docker stop
Stoppingdocker: [ OK ]
5、创建自定义桥接网卡br0
yum install bridge-utils -y
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0_bak
cp ifcfg-eth0 ifcfg-br0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0 #注意添加此项
#不要奇怪,这里没有BOOTPROTO项是完全正常的,请继续操作。
DEVICE=br0
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.0.1.21 #原先eth0的IP
NETMASK=255.255.0.0 #原先eth0的子网掩码
GATEWAY=10.0.0.254 #宿主主机网关
DNS1=223.5.5.5
[root@localhost~]# brctl show
echo"ifup br0" >> /etc/rc.d/rc.local
$ more /etc/default/docker
DOCKER_OPTS="-b=br0"
我这里使用的是centos6.6_64_mini
操作如下:
vim/etc/sysconfig/docker
将other_args=后面添加'-b=br0',最后为:
other_args='-b=br0'
原内容:
修改后的内容:
7、启动docker
service docker start
8、检查docker运行参数是否有-b=br0
下图中显示为第6步的操作已经启效果。
ps -ef |grep docker
9、以--net=none方式启动一个容器
我这里为了演示方便,没有让其进入后台-d模式,都是另起一个shell在宿主上进行其他操作。
dockerrun --name test1 --net=none -i -t centos66-base /bin/bash
10、查看当前容器网络情况
11、查看主机上的网桥状态
brct lshow
12、使用pipework给容器test1设置ip及网关信息。
pipework br0 -i eth0 test1 10.0.1.50/16@10.0.0.254
没有报错及成功,到test1容器去看看吧。
13、第2次查看test1容器的ip、路由情况
ping测试
ping 10.0.0.254
ping www.baidu.com
提示:我的外网路由器有mac地址绑定,所以我先要去绑定以下10.0.1.50(容器的IP地址),如 果你再测试到这里时,切记你自己的外网路由是否有什么限制
好了,可以再自行ping下内容的其他主机测试。
14、第2次看下宿主的网桥状态
15、删除docker0网桥
停止docker默认网桥
ifconfigdocker0 down
删除docker默认网桥
brctldelbr docker0
查看物理机上有哪些网桥
brctl show
16、重启test1容器再观察
pipework方式设置的ip,当容器重启之后ip也会随之丢失
重新设置刚才相同的ip地址之后观察
pipework br0 -i eth0 test110.0.1.50/16@10.0.0.254
-h HOSTNAME or --hostname=HOSTNAME
设定容器的主机名,它会被写到容器内的/etc/hostname和/etc/hosts。但它在容器外部看不到,既不会在docker ps中显示,也不会在其他的容器的/etc/hosts 看到。
--link=CONTAINER_NAME:ALIAS
选项会在创建容器的时候,添加一个其他容器的主机名到 /etc/hosts 文件中,让新容器的进程可以使用主机名 ALIAS 就可以连接它。
--dns=IP_ADDRESS
添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
--dns-search=DOMAIN
设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索host,还会搜索 host.example.com。
注意: 如果没有上述最后 2 个选项,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。