问题描述
在使用 docker-compose
时,将容器端口9300发布到主机端口9307。通过 docker-compose ps
命令确认主机端口9307在0.0.0.0上处于打开状态。通过 netstat -tulpan | grep LISTEN
命令确认主机正在监听0.0.0.0:9307。然而,尝试访问该端口时,IPTables 阻止了访问(使用 telnet 连接时会出现 “connection refused” 错误)。
当发布的端口也是9300时,不会出现这个问题。但在这种情况下,用户必须发布到另一个端口,因为9300已被占用。用户观察到 Docker 和 IPTables 之间有一种”通信”,因为如果更改容器的 CIDR,IPTables 规则会反映这种更改。然而,对于发布的端口,情况并非如此。
用户想知道,为了使 IPTables 规则允许访问 DOCKER_HOST:PUBLISHED_PORT
,应该采取什么措施?
解决方案
请注意以下操作可能涉及对网络配置进行更改,确保在操作前备份并了解可能的风险。
检查防火墙规则
首先,确保检查并更新防火墙规则,以便允许流量通过发布的端口。以下是可能的步骤:
- 查看当前的 IPTables 规则,以确认是否存在针对9307端口的阻止规则。使用以下命令查看规则列表:
bash
sudo iptables -L -n
- 如果存在针对9307端口的拒绝规则,您需要删除它。使用以下命令删除规则,将其中的
rule_number
替换为实际规则的编号:
bash
sudo iptables -D INPUT rule_number
更新 Docker 配置
如果您更改了容器的 CIDR,您可能需要更新 Docker 的配置,以确保 Docker 和 IPTables 之间的通信得以正确反映。您可以尝试以下步骤:
- 停止正在运行的容器和服务:
bash
docker-compose down
- 修改您的 Docker 配置文件(通常是
/etc/docker/daemon.json
),添加或更新"iptables": false
配置,以禁用 Docker 自己的 IPTables 规则管理。
json
{
"iptables": false
}
- 重新启动 Docker 服务:
bash
sudo systemctl restart docker
检查端口映射配置
确保在您的 docker-compose.yml
文件中正确配置了端口映射。确认容器端口9300正确映射到了主机端口9307。
示例 docker-compose.yml
文件片段:
version: '3'
services:
your_service:
image: your_image_name
ports:
- "9307:9300"
# 其他配置项
检查网络模式
确保您的容器使用了正确的网络模式。在某些情况下,使用 bridge
网络模式可能会导致端口访问问题。您可以尝试将网络模式更改为 host
或者其他适合您需求的模式。
验证连接
在完成以上步骤后,您可以尝试重新启动容器并验证访问主机端口9307是否正常:
- 启动容器:
bash
docker-compose up -d
- 尝试使用
telnet
命令连接到DOCKER_HOST:9307
,确认连接是否成功:
bash
telnet DOCKER_HOST 9307
如果一切正常,您应该能够成功连接到主机端口9307,而不再遇到 “connection refused” 错误。
请根据您的实际情况逐步执行上述操作,并确保在每个步骤之后进行测试。如果问题仍然存在,您可能需要进一步检查防火墙规则、Docker 配置和容器设置,以排除可能的问题。