docker内部访问其他端口_如何解决docker内部访问不了宿主

在防火墙开启的状态下,docker容器内部无法访问宿主机服务(能够访问非宿主机的其他局域网计算机的服务),解决方法:1. 配置防火墙规则firewall-cmd --zone=public --add-port={port}/tcp --permanent,并重载防火墙规则firewall-cmd --reload

2. 启动容器时使用--net host模式

3. 关闭防火墙

_补充:由于容器内请求的源地址是使用的docker0网段的内网地址,宿主机防火墙无法识别来源为非宿主机网段的docker0网段的内网地址请求,将其标记为未知来源,于是对请求进行了拦截,可通过添加防火墙来源规则(docker容器默认内网网段为172.17.0.0/16):

进行解决或直接更改防火墙开放端口规则,即解决方法中的第1点进行解决,当然为了更方便,特别时服务个数特别多且端口变化比较快的时候,为了降低维护成本,在保证服务器安全的情况下推荐使用第2或第3点解决方法

这也是微服务docker容器化部署时经常会遇到的坑,A服务访问B服务,当A、B服务同时位于一台宿主机时无法访问,当A、B服务位于不同宿主机时,访问正常。案例如下:同一宿主机微服务之间通信异常的血案:

微服务A能够正常请求AR

微服务B能够正常请求BR

但是微服务A某请求OR,内部访问BR,始终无法调用成功

原因:

centos的firewalld为开启状态时,微服务A内部发起请求时,请求无法从容器发出,即出现了调用不成功的情况(No route to host)

矛盾点:

spring cloud config 启动缓慢导致在测试的时候config服务启动后的一段时间内无法访问,让我们误以为关闭firewalld后无法接收请求,但又和其他服务又能正常访问出现了矛盾

验证:

docker创建四个nginx(8120、8787、8083、8084)容器,并创建ubuntu容器安装curl。

开启iptables,关闭firewalld,重启docker,启动五个容器,外部四个nginx访问成功,进入ubuntu容器使用curl访问,均成功

开启iptables,开启firewalld,重启docker,启动五个容器,外部四个nginx访问成功,进入ubuntu容器使用curl访问,均不成功

开启iptables,开启firewalld,重启docker,启动五个容器,外部四个nginx访问成功,宿主机配置firewall-cmd --zone=public --add-port=8120/tcp --permanent,进入ubuntu容器使用curl访问,8120访问,其他均不成功

宿主机配置端口使用iptables转发规则配置无效:

iptables -A INPUT -p tcp --dport 8120 -j ACCEPT

iptables -A OUTPUT -p tcp --dport 8120 -j ACCEPT

iptables -A FORWARD -p tcp --dport 8120 -j ACCEPT

结论:

无论firewalld开启还是关闭,均不影响外部访问,宿主机需配置firewall-cmd --zone=public --add-port=8120/tcp --permanent(删除端口去掉--zone=public)同一宿主机才能相互访问成功

生产解决方案:

开启iptables,关闭firewalld

开启iptables,开启firewalld并配置开放端口

(开启或关闭firewalld后,需要重启docker)

iptables->ufw(ubuntu)iptables->firewalld(centos)

相关推荐:docker教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,对于你的问题,我可以给出以下步骤: 1. 安装 Docker 首先,你需要安装 Docker。你可以去 Docker 官网下载适合你系统的安装包进行安装。 2. 下载 MySQL 镜像 在 Docker 中使用 MySQL,首先需要下载 MySQL 镜像。执行以下命令: ``` docker pull mysql:latest ``` 3. 启动 MySQL 容器 使用以下命令启动 MySQL 容器: ``` docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql:latest ``` 其中,`--name` 表示容器名字,`-p` 表示端口映射,`-e` 表示设置 MySQL 的 root 密码。 4. 创建 WordPress 数据库 使用以下命令进入 MySQL 容器: ``` docker exec -it mysql bash ``` 进入 MySQL 后,执行以下命令创建 WordPress 数据库: ``` mysql -u root -p ``` 输入你设置的 MySQL root 密码后,执行以下命令: ``` create database wordpress; ``` 5. 下载 WordPress 镜像 执行以下命令下载 WordPress 镜像: ``` docker pull wordpress:latest ``` 6. 启动 WordPress 容器 使用以下命令启动 WordPress 容器: ``` docker run --name wordpress -p 80:80 -e WORDPRESS_DB_HOST=宿主机IP地址:3306 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=yourpassword -e WORDPRESS_DB_NAME=wordpress -d wordpress:latest ``` 其中,`--name` 表示容器名字,`-p` 表示端口映射,`-e` 表示设置 WordPress 数据库连接信息。 7. 访问 WordPress 现在,你可以通过浏览器访问 `http://localhost` 来访问 WordPress 了。 需要注意的是,在启动 WordPress 容器时,`WORDPRESS_DB_HOST`应该设置为宿主机的 IP 地址。如果你不知道宿主机的 IP 地址,可以在宿主机上执行以下命令查看: ``` ifconfig ``` 以上就是使用 Docker 安装 WordPress 的步骤,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值