问题
在一台centos7的服务器上 安装了nginx容器, -p 8080:80
由8080端口代理到内部80端口,外部无法访问,提示超时。
处理方法
- 服务器内部本地 curl看下是否能够获取数据
curl http:127.0.0.1:8080 // 如果无法访问 可以认为是container没有启动成功
- 查看防火墙端口是否开启
firewall-cmd --list-ports
# 未开启 使用下面命令开启端口
firewall-cmd --zone=public --add-port=8080/tcp
- 如果开启后依旧无法访问尝试 关闭整个防火墙试下是否能够成功
systemctl stop firewalld
- ip转发没有打开
sysctl net.ipv4.ip_forward // 0 是未打开 1 是打卡
# 打开步骤
vi /etc/sysctl.conf
# 或者
vi /usr/lib/sysctl.d/00-system.conf
# 添加如下代码:
net.ipv4.ip_forward=1
# 重启network服务
systemctl restart network
# 查看是否修改成功
sysctl net.ipv4.ip_forward
- 最后定位到的问题
启动docker并进行端口映射后,docker会在iptables中添加DNAT规则,将收到的对应端口的包转换ip并进行转发,同时添加规则将所有来自docker网域的ip进行转换。
但是在Centos7上出现docker可以正常访问外网,但是外网发出的请求在经过eth1接收转发后送达不到docker0,或者送到却出现(oui Unknown)的状况。暂时不清楚这到底是为什么经过DNAT后无法送达docker0.
- 关闭docker的iptables配置 (采用方法)
vim /etc/default/docker
# 写入 -iptables=false
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -iptables=false"
# 修改文件/etc/docker/daemon.json
vim /etc/docker/daemon.json
# 写入
{
"iptables": false
}
# 重启docker
systemctl restart docker
- 或者直接尝试 关闭iptables
service iptables stop
网友评论