配置主机防火墙

默认情况下,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,请参阅创建和配置实例