现象
1. 最初始现象是发现docker容器里使用apt-get更新(update)时失败, 由于容器里没有ping等一系列工具软件, 无法确认问题具体情况
2. 接着就找image里有ping的包, 用docker search发现pentest-tools里有, 但pull下来后发现运行错误, 报错信息如下:
standard_init_linux.go:211: exec user process caused "exec format error"
查了下, 有人说是因为不兼容引起的错误: docker运行容器报错standard_init_linux.go:211: exec user process caused “exec format error“的可能解决办法
3. 在查找中突然发现有说centos的image里有ping, 想着操作系统可能都会有整套网络工具软件, 就找了个ubutu的包pull下来, 结果里面还是没有.
虽然centos不熟, 都是linux应该也差不太多, 回头就pull了centos.
用docker运行并进入到容器里
# docker run -it centos /bin/bash
[root@a688b8f2101e /]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 26ms
[root@a688b8f2101e /]# ping 192.168.1.7
PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data.
64 bytes from 192.168.1.7: icmp_seq=1 ttl=64 time=0.361 ms
[root@a688b8f2101e /]# ping www.sina.com
PING spool.grid.sinaedge.com (123.126.55.41) 56(84) bytes of data.
^C
--- spool.grid.sinaedge.com ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 27ms
现象是除了本宿主机的IP(192.168.1.7), 其它地址都不能ping通
[root@a688b8f2101e /]# tracepath www.sina.com
1?: [LOCALHOST] pmtu 1500
1: 119.167.237.233 2.100ms reached
1: 119.167.237.233 0.436ms reached
Resume: pmtu 1500 hops 1 back 1
用tracepath跟踪路由也看不出什么
测试的结论是:
a. 除了本宿主机地址外, 其它地址都不能ping通
b. 虽然ping不通, 但是dns解析还是可以的.
4. 怀疑是宿主机的防火墙挡住了, 把防火墙关了
# /etc/init.d/firewall stop
再进入容器测试, 发现依然ping不通其它设备网址, 而且dns解析也不行了
[root@88a5cfa727dc /]# ping www.sina.com
ping: www.sina.com: Name or service not known
这只能说明, 宿主机的防火墙至少还帮着把DNS解析的包给双向转发了.
问题不是要不要开防火墙, 而是防火墙必须得开, 但是防火墙的规则写的少了点东西.
要不要处理
本来如果凑合对付着用也行, 但看了下素版的wordpress好象东西还是有点少, 据说很多插件都需要从网上下载, 没法忍, 必须得处理这个问题.
怎么处理:
iptables我也不熟, 要不先来个简单的思路?
处理方式一 docker网络改用host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口.
这样就不会有包转发的问题了.
在docker启动时, Host模式需要使用"--network=host"参数.
测试Host模式:
还是用centos的包来做测试
# docker run --network=host -it centos /bin/bash
[root@Q7Op /]# ping www.sina.com
PING ww1.sinaimg.cn.w.alikunlun.com (119.167.237.230) 56(84) bytes of data.
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=1 ttl=55 time=15.4 ms
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=2 ttl=55 time=15.4 ms
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=3 ttl=55 time=15.4 ms
64 bytes from 119.167.237.230 (119.167.237.230): icmp_seq=4 ttl=55 time=15.3 ms
^C
--- ww1.sinaimg.cn.w.alikunlun.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 15.308/15.348/15.363/0.023 ms
网络就可以正常访问了.
把现有的容器改成host模式:
docker启动容器时, 如果设置network模式, 容器就会以bridge模式运行.
1. 在portainer.io(web管理)界面里, 试着把已经运行的bridge模式的容器改为host模式, 好像不行, 再试一下, 一样的报错:
failure container sharing cannot be connected to any other network
即使暂停或停止容器, 也是报一样的错误.
看来不可能简单的用管理界面搞定这个事.
文章有点复杂,没看懂
3. 在portainer.io(web管理)界面里, 想用复制容器的方式, 在复制时, 修改网络为host模式.
但是, 复制的容器就一直有问题, 试图连接时报错:
# docker exec -it WordPressHostNet /bin/bash
Error response from daemon: Container 0dd20f7ed6587ba9900acbef9f7da926974c49bebc0fa076d19cbae573c5116c is restarting, wait until the container is running
说是始终在重启状态
web端口也连不上, 原因不清楚.
两个方法:
1. docker update --network=host ……
2. 设置网桥,连接不同网段
或者,docker有nat桥?
和当前现象相似
测试:
1. 参考 Docker 容器内无法通过 HTTP 访问外网
# service dockerd stop
# killall dockerd
# 检查点: 检查网络
# ifconfig
# ifconfig docker0 down
# brctl delbr docker0
# service dockerd start
# 测试:
# docker run --rm -it centos /bin/bash
测试结果: 失败
# docker update --network=host -it e7d3c1eca2fb
unknown flag: --network
See 'docker update --help'.
结果: update不支持修改network
测试结果: 失败
3. 测试用已有的容器作镜像, 用host模式运行生成的镜像, 发现会自动退出
再测试用wordpress以host模式运行, 也同样会自动退出
原因可能是某个端口被宿主机占了, 谁知道
结论: wordpress在当前系统上, 只能以bridge方式运行.
看来应该是网桥的问题, 估计最终还是iptables的问题
估计一时半会也搞不定了, 先准备手动安装wp包和插件吧:
评论