为什么我ping不通我的docker容器间ping不通

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我是win10系统,我给docker其中一个容器做了端口映射,如图,但是我在win10主机上C:Userstentou&telnet localhost 32786正在连接localhost...无法打开到主机的连接。 在端口 32786: 连接失败这是为什么呢??
来源: Docker 技术问答
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
防火墙关了,试试
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
首先我不清楚你配置是否对,但是感觉概念搞混了吧?
ping 是测试ip或者域名是否通?
telnet 才是测试端口是否通?
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。posts - 300,&
comments - 1548,&
trackbacks - 0
通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性。
两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下:
可见同一网络中的容器、网关之间都是可以通信的。
my_net2&与默认 bridge 网络能通信吗?
从拓扑图可知,两个网络属于不同的网桥,应该不能通信,我们通过实验验证一下,让 busybox 容器 ping httpd 容器:
确实 ping 不通,符合预期。
“等等!不同的网络如果加上路由应该就可以通信了吧?”我已经听到有读者在建议了。
这是一个非常非常好的想法。
确实,如果 host 上对每个网络的都有一条路由,同时操作系统上打开了 ip forwarding,host 就成了一个路由器,挂接在不同网桥上的网络就能够相互通信。下面我们来看看 docker host 满不满足这些条件呢?
ip r&查看 host 上的路由表:
172.17.0.0/16 dev docker0 &proto kernel &scope link &src 172.17.0.1
172.22.16.0/24 dev br-5d863e9f78b6 &proto kernel &scope link &src 172.22.16.1
172.17.0.0/16 和 172.22.16.0/24 两个网络的路由都定义好了。再看看 ip forwarding:
# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
ip forwarding 也已经启用了。
条件都满足,为什么不能通行呢?
我们还得看看 iptables:
# iptables-save
-A DOCKER-ISOLATION -i br-5d863e9f78b6 -o docker0 -j DROP
-A DOCKER-ISOLATION -i docker0 -o br-5d863e9f78b6 -j DROP
原因就在这里了:iptables DROP 掉了网桥 docker0 与 br-5d863e9f78b6 之间双向的流量。
从规则的命名&DOCKER-ISOLATION&可知 docker 在设计上就是要隔离不同的 netwrok。
那么接下来的问题是:怎样才能让 busybox 与 httpd 通信呢?
答案是:为 httpd 容器添加一块 net_my2 的网卡。这个可以通过docker network connect&命令实现。
我们在 httpd 容器中查看一下网络配置:
容器中增加了一个网卡 eth1,分配了 my_net2 的 IP 172.22.16.3。现在 busybox 应该能够访问 httpd 了,验证一下:
busybox 能够 ping 到 httpd,并且可以访问 httpd 的 web 服务。当前网络结构如图所示:
下一节我们讨论容器间通信的三种方式。
阅读(...) 评论()一.Docker容器的网络基础
通过ifconfig查看docker0的网络设备,docker守护进程就是通过docker0为docker的容器提供网络连接的各种服务。
docker0是Linux虚拟网桥。
Linux虚拟网桥的特点:
可以设置IP地址
相当于拥有一个隐藏的虚拟网卡
docker0的地址划分:
IP:172.17.42.1 子网掩码: 255.255.0.0
MAC: 02:42:ac:11:00:00 到 02:42:ac:11:ff:ff
总共提供65534个地址
docker守护进程在一个容器启动时,实际上它要创建网络连接的两端。一端是在容器中的网络设备,而另一端是在运行docker守护进程的主机上打开一个名为veth*的一个接口,用来实现docker这个网桥与容器的网络通信。
需要查看网桥,需要linux的网桥管理程序,在Ubuntu中通过 apt-get install bridge-utils。
$ sudo brctl show
bridge name
interfaces
<span style="color: #00.
运行一个docker容器,在容器中查看它的网络设备(如果没有ifconfig命令,通过apt-get install -y net-tools)
root@b2a:/# ifconfig
eth0 Link encap:Ethernet HWaddr <span style="color: #:<span style="color: #:ac:<span style="color: #:<span style="color: #:<span style="color: #
inet addr:<span style="color: #2.17.<span style="color: #.2 Bcast:<span style="color: #.0.<span style="color: #.0 Mask:<span style="color: #5.255.<span style="color: #.0
UP BROADCAST RUNNING MULTICAST MTU:<span style="color: #00 Metric:<span style="color: #
RX packets:<span style="color: #5 errors:<span style="color: # dropped:<span style="color: # overruns:<span style="color: # frame:<span style="color: #
TX packets:<span style="color: # errors:<span style="color: # dropped:<span style="color: # overruns:<span style="color: # carrier:<span style="color: #
collisions:<span style="color: # txqueuelen:<span style="color: #
RX bytes:<span style="color: #4985 (<span style="color: #4.9 KB) TX bytes:<span style="color: #58 (<span style="color: #.7 KB)
lo Link encap:Local Loopback
inet addr:<span style="color: #7.0.<span style="color: #.1 Mask:<span style="color: #5.0.<span style="color: #.0
UP LOOPBACK RUNNING MTU:<span style="color: #536 Metric:<span style="color: #
RX packets:<span style="color: # errors:<span style="color: # dropped:<span style="color: # overruns:<span style="color: # frame:<span style="color: #
TX packets:<span style="color: # errors:<span style="color: # dropped:<span style="color: # overruns:<span style="color: # carrier:<span style="color: #
collisions:<span style="color: # txqueuelen:<span style="color: #
RX bytes:<span style="color: # (<span style="color: #.0 B) TX bytes:<span style="color: # (<span style="color: #.0 B)
docker已经自动创建了eth0的网卡,注意观察ip地址和mac地址。不要退出容器,再运行如下查看网桥的状态
$ sudo brctl show
bridge name
interfaces
<span style="color: #00.
  veth95521e6
我们看到在interface中多了一个veth*的这样一个接口。通过ifconfig命令同样可以看到这个网络接口。
自定义docker0
修改docker0默认分配的ip地址:
sudo ifconfig docker0 <span style="color: #2.168.<span style="color: #0.1 netmask <span style="color: #5.255.<span style="color: #5.0
修改完后,重启docker服务 sudo service docker restart. 新运行的容器地址就变成了新的ip地址了。
添加虚拟网桥
sudo brctl addbr br0
sudo ifconfig br0 <span style="color: #2.168.<span style="color: #0.1 netmask <span style="color: #5.255.<span style="color: #5.0
更改docker守护进程的启动配置:
vim /etc/default/docker 中添加 DOCKER_OPS的值 -b=br0.
重启docker服务即可。
二.Docker容器的互联
用于测试的Docker镜像 Dockerfile:
FROM ubuntu:<span style="color: #.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE <span style="color: #
CMD /bin/bash
1.允许所有容器互联
在同一宿主机下,docker的容器是通过虚拟网桥来进行连接的。那么在默认情况下,在同一宿主机中运行的容器都是可以互相连接的。
--icc=true 默认
容器的ip地址实际上是一个不可靠的连接,因为它会随着容器的启动而改变。
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
CONTAINER_NAME: 需要连接的容器名字
ALIAS: 在容器中连接的代号
docker -run -it --link=container01:webtest nginx
ping webtest
查看在容器中产生的哪些影响
查看环境变量,可以看到大量以WEBTEST*开头的环境变量,这些环境变量是在容器启动时,由docker添加的。我们还可以查看在/ect/host文件,这里添加了webtest的地址映射。当docker重启启动容器时 /ect/host所对应的ip地址发生了变化。也就是说,针对于指定了link选项的容器,在启动时docker会自动修改ip地址和我们指定的别名之间的映射。环境变量也会做出相应的改变。
2.拒绝所有容器间互联
Docker守护进程的启动选项
--icc=false
修改vim /etc/default/docker,在末尾添加配置 DOCKER_OPTS="--icc=false"。
需要重启docker的服务 sudo service docker restart.即使是link也ping不通。
3.允许特定容器间的连接
Docker守护进程的启动选项
--icc=false --iptables=true
--link 在容器启动时添加link
docker利用iptables中的机制,在icc=false时,阻断所有的docker容器间的访问,仅仅运行利用link选项配置的容器进行相互的访问。
注: 如果出现ping不通的情况,可能为iptables的问题(DROP规则在docker之前了)。
sudo iptables -L -n
查看iptables规则的情况
sudo iptables -F
清空iptables规则设置
sudo service docker restart 重新启用docker的服务
sudo iptables -L -n 再来查看iptables的设置,docker的规则链已经在第一位
重新启动容器即可
三.Docker容器与外部网络的连接
ip_forward
    --ip-forward=true
sysctl net.ipv4.conf.all.forwarding
ip_forward本身是Linux系统中的一个变量,它的值决定了系统是否会转发流量。在Docker守护进程的默认参数中也有ip_forward选项,默认值是true.&
iptables是与linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含iptables的功能。
每一个大的方块中,就是iptables中的一个链(chain),每一个链实际上就是数据处理中的一个环节,而在每个环节中又包含了不同的操作。
允许端口映射访问
限制IP访问容器
实质都是通过iptables的规则来控制的。
阅读(...) 评论()为什么我ping不通我的docker容器_百度知道
为什么我ping不通我的docker容器
我有更好的答案
Docker搭建了lnmp环境后,如果需要访问安装在宿主机上的数据库或中间件,是不能直接使用127.0.0.1这个ip的,这个ip在容器中指向容器自己,那么应该怎么去访问宿主机呢
采纳率:94%
来自团队:
ifconfig 查看一下docker0网桥,ping 一下网桥试试。
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。docker使用pipework固定ip问题 ,ping不通我创建一个容器docker run -idt&&--net=none --name test1 ubuntu /bin/bash然后用pipework docker0 test1 192.168.2.20/24@192.168.2.1再进入容器ifconfig发现ip已经设置上了,但是ping不通192.168.2.1和自己的物理机(ip 192.168.2.45),求助!docker0是我物理机ipeth1是容器中的ip之前好像找到下面这个命令,试了一下可以ping通,但是主机和容器都不能上外网了,我网络不懂啊,请老师们告诉我解决办法,谢谢在主机执行下面这2个就能ping同容器的2.20了,但是不能上外网啊。。brctl&&addif docker0&&eth0ip addr add 192.168.2.45/24 dev docker0我qq 回答邀答8回答&
系统运维工程师
, 游戏公司赞同了此回答
没办法上网的可能有2个原因,一个是宿主机或者容器的ip_forward没有设置为1,另外还可能是宿主机的iptables的nat没有设置正确。没办法上网的可能有2个原因,一个是宿主机或者容器的ip_forward没有设置为1,另外还可能是宿主机的iptables的nat没有设置正确。赞同1浏览1862&
测试工程师
, 北京回复 2# dl528888 & &我在执行最后那2条命令前是可以访问外网的,能给出这2个原因解决办法吗,我试试,我是ubuntu回复
dl528888 & &我在执行最后那2条命令前是可以访问外网的,能给出这2个原因解决办法吗,我试试,我是ubuntu赞同浏览1904&
测试工程师
, 北京回复 2# dl528888 & & 我看了一下我的forward是1,我就没动过,nat那个我也没动过,要怎么设置?回复
dl528888 & & 我看了一下我的forward是1,我就没动过,nat那个我也没动过,要怎么设置?赞同浏览1935&
系统运维工程师
, 游戏公司、、等赞同了此回答
回复 4# 北京IT菜鸟 & & 既然你没有特殊设置,那就不需要设置了,默认docker是允许修改宿主机的nat链表,你可以参考一下我下面的pipework操作默认docker的桥接是docker0,我在重新弄一个新的桥接网卡br0
先查看当前的桥接信息
14:28:48 # brctl show
bridge name& &...回复
北京IT菜鸟 & & 既然你没有特殊设置,那就不需要设置了,默认docker是允许修改宿主机的nat链表,你可以参考一下我下面的pipework操作默认docker的桥接是docker0,我在重新弄一个新的桥接网卡br0
先查看当前的桥接信息
14:28:48 # brctl show
bridge name& && &&&bridge id& && && && && & STP enabled& && &&&interfaces
docker0& && && && && & 8000.fe& && &&&no& && && && && & veth9kJoy8
& && && && && && && && && && && && && && && && && && &&&vethpbsrWJ
可以看到只有docker0
brctl addbr br0
ip link set dev br0 up
ip addr add 192.168.2.1/24 dev br0
在看看
14:28:48 # brctl show
bridge name& && &&&bridge id& && && && && & STP enabled& && &&&interfaces
br0& && && && && & de1d1139& && &&&no& && && && && & veth1pl28636
docker0& && && && && & 8000.fe& && &&&no& && && && && & veth9kJoy8
& && && && && && && && && && && && && && && && && && &&&vethpbsrWJ
14:26:35 # docker run -d -p 22&&--name="test" centos6:3.0 /usr/sbin/sshd -D
891c11fcba4ffe1f61a2f6b12c3d5ca151df
root@ip-10-10-10-10:~/test/pipework
14:26:42 # ./pipework br0 -i eth1 test 192.168.2.202/24
root@ip-10-10-10-10:~/test/pipework
14:27:16 # docker ps -a
CONTAINER ID& && &&&IMAGE& && && && && &COMMAND& && && && & CREATED& && && && & STATUS& && && && && && &&&PORTS& && && && && && && && && && && && && &NAMES
891c11fcba4f& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &40 seconds ago& && &Up 35 seconds& && && && & 0.0.0.0:49163->22/tcp& && && && && && && &&&test& && && && && &
df86c911f79f& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &6 days ago& && && & Up 6 days& && && && && &&&0.0.0.0:80->80/tcp, 0.0.0.0:49157->22/tcp& &passport& && && && &
3b42ee07ecd2& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &8 weeks ago& && && &Exited (255) 6 days ago& && && && && && && && && && && && && && && &&&mysql-tpcc& && && &
dfec766fbaa7& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &10 weeks ago& && &&&Exited (255) 6 days ago& && && && && && && && && && && && && && && &&&redis-slave& && && &
c& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &10 weeks ago& && &&&Exited (255) 6 days ago& && && && && && && && && && && && && && && &&&redis-master& && &&&
846efb9e4d7a& && &&&ubuntu:3.0& && && & /usr/sbin/sshd -D& &12 weeks ago& && &&&Exited (0) 6 days ago& && && && && && && && && && && && && && && && & ubuntu-test1& && &&&
b9a9e6f2caed& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &3 months ago& && &&&Exited (255) 6 days ago& && && && && && && && && && && && && && && &&&zabbix-server& && &
978fff134b18& && &&&centos6:3.0& && && &/usr/sbin/sshd -D& &3 months ago& && &&&Exited (255) 6 days ago& && && && && && && && && && && && && && && &&&centos6-test5& && &
root@ip-10-10-10-10:~/test/pipework
14:27:48 # ssh 127.0.0.1 -p 49163
root@127.0.0.1's password:
root@891c11fcba4f:~
14:27:56 # ifconfig
eth0& && &Link encap:Ethernet&&HWaddr 9E:46:FC:84:E6:83&&
& && && & inet addr:172.17.0.3&&Bcast:0.0.0.0&&Mask:255.255.0.0
& && && & inet6 addr: fe80::9c46:fcff:fe84:e683/64 Scope:Link
& && && & UP BROADCAST RUNNING&&MTU:1500&&Metric:1
& && && & RX packets:43 errors:0 dropped:0 overruns:0 frame:0
& && && & TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
& && && & collisions:0 txqueuelen:1000
& && && & RX bytes: KiB)&&TX bytes: KiB)
eth1& && &Link encap:Ethernet&&HWaddr FE:38:31:11:B4:97&&
& && && & inet addr:192.168.2.202&&Bcast:0.0.0.0&&Mask:255.255.255.0
& && && & inet6 addr: fe80::fc38:31ff:fe11:b497/64 Scope:Link
& && && & UP BROADCAST RUNNING MULTICAST&&MTU:1500&&Metric:1
& && && & RX packets:6 errors:0 dropped:0 overruns:0 frame:0
& && && & TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
& && && & collisions:0 txqueuelen:1000
& && && & RX bytes:468 (468.0 b)&&TX bytes:510 (510.0 b)
lo& && &&&Link encap:Local Loopback&&
& && && & inet addr:127.0.0.1&&Mask:255.0.0.0
& && && & inet6 addr: ::1/128 Scope:Host
& && && & UP LOOPBACK RUNNING&&MTU:16436&&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:0
& && && & RX bytes:0 (0.0 b)&&TX bytes:0 (0.0 b)
root@891c11fcba4f:~
14:27:57 # route -n
Kernel IP routing table
Destination& &&&Gateway& && && &Genmask& && && &Flags Metric Ref& & Use Iface
192.168.2.0& &&&0.0.0.0& && && &255.255.255.0& &U& &&&0& && &0& && &&&0 eth1
172.17.0.0& && &0.0.0.0& && && &255.255.0.0& &&&U& &&&0& && &0& && &&&0 eth0
0.0.0.0& && && &172.17.42.1& &&&0.0.0.0& && && &UG& & 0& && &0& && &&&0 eth0
root@891c11fcba4f:~
赞同4浏览2153&
测试工程师
, 北京回复 5# dl528888 & & 我用你这个可以了,谢谢你啦,不过就是每次重启后IP就没了,还要重新设置,还有这个的解决办法吗回复
dl528888 & & 我用你这个可以了,谢谢你啦,不过就是每次重启后IP就没了,还要重新设置,还有这个的解决办法吗赞同浏览1885&
系统运维工程师
, 游戏公司回复 6# 北京IT菜鸟 & & 请参考http://www.aixchina.net/club/thread--1.html回复
北京IT菜鸟 & & 请参考赞同浏览1857&
测试工程师
, 北京回复 5# dl528888 & & 我用了你说的这个方法,但是容器里上不了外网,主机可以访问外网,这是怎么回事啊?大神帮帮忙回复
dl528888 & & 我用了你说的这个方法,但是容器里上不了外网,主机可以访问外网,这是怎么回事啊?大神帮帮忙赞同浏览2097&
系统架构师
, 百度游戏回复 8# 北京IT菜鸟 & & 检查一下你容器的dns设置, 国内用google的dns不起作用,除非你有vpn. /etc/resolv.conf回复
北京IT菜鸟 & & 检查一下你容器的dns设置, 国内用google的dns不起作用,除非你有vpn. /etc/resolv.conf赞同浏览1865回答问题测试工程师, 北京评论15&
— talk with trend,talk with technologist
京ICP备号-30

我要回帖

更多关于 docker容器间ping不通 的文章

 

随机推荐