4

我有带有 nginx 的 centos7 docker 容器。

尽管此端口未在 firewalld 中打开,但端口 80 仍可从外部使用。这里公共区域的规则:

# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eno3
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  sourceports:
  icmp-blocks:
  rich rules:

但在链 DOCKER 中有一个针对此端口的自动规则:

# iptables -L DOCKER
Chain DOCKER (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http

如何从外部关闭此端口?我已经运行了命令,但没有帮助:

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
Warning: NOT_ENABLED: 80:tcp
success

我已阅读文档 - https://docs.docker.com/engine/userguide/networking/ 但仍然不明白。实际上我只需要为我指定的网络 1.2.3.4/24 打开此端口 80。

4

2 回答 2

1

Docker 默认设置 iptables 规则。有关更多信息,请参阅Docker 的了解容器通信。您也可以在 Docker 守护程序中使用--iptables=false.

或者,使用 docker-compose 文件版本 2+,您可以使用expose关键字而不是ports仅在docker-compose.yml文件中的 Docker 网络内打开此端口。

也就是说,如果你想使用 firewalld,你可能应该禁用 iptables。

于 2017-07-05T13:23:35.967 回答
1

也许有点迟到了,但是:

您可能正在使用类似3000:3000. 这非常等价于0.0.0.0:3000:3000.

您想要的只是映射到您的本地主机。您可以通过侦听特定的 IP 地址来实现此目的,例如127.0.0.1(localhost)。

将您的配置更改为127.0.0.1:[host_port]:[container_port].

于 2021-05-29T00:30:13.043 回答