默认情况下,Container-Optimized OS 主机防火墙允许传出连接,并且仅接受通过 SSH 服务传入的连接。您可以通过在运行 Container-Optimized OS 的虚拟机实例上运行 sudo iptables -L
来查看确切的主机防火墙配置。
请注意,主机防火墙与 Virtual Private Cloud 防火墙规则不同,必须配置该防火墙规则,应用才能正常工作。如需详细了解 Virtual Private Cloud 防火墙规则,请参阅防火墙规则概览。
在 Docker 的默认网络命名空间中运行容器
如果您要在 Container-Optimized OS 上部署必须通过网络访问的容器,并且未使用 Docker 的 --net=host
选项,请使用 Docker 的 -p
选项运行容器。使用此选项,Docker 会自动配置主机防火墙,以在网络上公开您的应用。如需详细了解 Docker 运行选项,请参阅 Docker 运行参考文档。
在以下示例中,nginx
容器可以通过网络在端口 80 上访问:
docker run --rm -d -p 80:80 --name=nginx nginx
在主机的网络命名空间中运行容器
如果您要在 Container-Optimized OS 上部署必须通过网络访问的容器,并使用 Docker 的 --net=host
选项,您必须亲自明确配置主机防火墙。
您可以使用标准 iptables
命令配置主机防火墙。与大多数 GUC/Linux 发行版一样,使用 iptables
命令配置的防火墙规则在重新启动后不会保留。要确保每次启动时主机防火墙的配置都正确无误,请在 cloud-init
配置中配置主机防火墙。请思考以下 cloud-init
示例:
#cloud-config
write_files:
- path: /etc/systemd/system/config-firewall.service
permissions: 0644
owner: root
content: |
[Unit]
Description=Configures the host firewall
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- path: /etc/systemd/system/myhttp.service
permissions: 0644
owner: root
content: |
[Unit]
Description=My HTTP service
After=docker.service config-firewall.service
Wants=docker.service config-firewall.service
[Service]
Restart=always
ExecStart=/usr/bin/docker run --rm --name=%n --net=host nginx
ExecStop=-/usr/bin/docker exec %n -s quit
runcmd:
- systemctl daemon-reload
- systemctl start myhttp.service
如果将此 cloud-init
配置与运行 Container-Optimized OS 的虚拟机一起使用,则在每次启动时会引发以下行为:
- 主机防火墙将配置为允许端口 80 上的传入的 TCP 连接。
nginx
容器将侦听端口 80 并对传入的 HTTP 请求作出响应。
如需详细了解如何在 Container-Optimized OS 上使用 cloud-init
,请参阅创建和配置实例。