docker使集装箱港口向公众开放

Tra*_*rse 5 port containers docker centos7 firewalld

我在 centos7 docker 容器上安装了 nginx。

端口 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:
Run Code Online (Sandbox Code Playgroud)

但是 DOCKER 链中这个端口有一条自动规则:

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

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

# firewall-cmd --zone=public --remove-port=80/tcp --permanent
Warning: NOT_ENABLED: 80:tcp
success
Run Code Online (Sandbox Code Playgroud)

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

小智 1

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

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

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