根據預設,Container-Optimized OS 主機防火牆僅允許連出連線,並且僅透過 SSH 服務接受連入連線。您可以在執行 Container-Optimized OS 的 VM 執行個體上執行 sudo iptables -L
,查看確切的主機防火牆設定。
請注意,主機防火牆與虛擬私有雲防火牆規則不同,您也必須設定防火牆規則,才能讓應用程式正常運作。如要進一步瞭解虛擬私人雲端防火牆規則,請參閱防火牆規則總覽。
在 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
指令設定主機防火牆。與大多數 GNU/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 的 VM,每次啟動時都會產生以下行為:
- 主機防火牆會設定為允許通訊埠 80 上的 TCP 連線。
nginx
容器會監聽通訊埠 80,並回應傳入的 HTTP 要求。
如要進一步瞭解如何在 Container-Optimized OS 上使用 cloud-init
,請參閱「建立及設定執行個體」。