デフォルトでは、Container-Optimized OS のホスト ファイアウォールを使用すると SSH サービスのみを介した発信接続と受信接続が許可されます。Container-Optimized OS を実行している VM インスタンスで sudo iptables -L
を実行することで、正確なホスト ファイアウォール構成を確認できます。
ホスト ファイアウォールは、Virtual Private Cloud ファイアウォール ルールとは異なり、アプリケーションが正しく機能するように構成する必要があります。Virtual Private Cloud ファイアウォール ルールの詳細については、ファイアウォール ルールの概要をご覧ください。
Docker のデフォルトのネットワーク名前空間でコンテナを実行する
ネットワーク経由でアクセス可能になる必要がある Container-Optimized OS にコンテナをデプロイする一方で Docker の --net=host
オプションを使用しない場合は、-p
オプションを使用してコンテナを実行します。このオプションを使用すると、Docker はネットワーク上でアプリケーションを公開するためのホスト ファイアウォールを自動的に構成します。Docker の実行オプションの詳細については、Docker の実行リファレンスをご覧ください。
次の例では、ポート 80 でネットワーク上の nginx
コンテナにアクセスできます。
docker run --rm -d -p 80:80 --name=nginx nginx
ホストのネットワーク名前空間でコンテナを実行する
Container-Optimized OS にコンテナをデプロイし、ネットワーク経由でアクセス可能になる必要があり、Docker の --net=host
オプションを使用している場合、ホスト ファイアウォールを明示的に構成する必要があります。
ホスト ファイアウォールは、標準の iptables
コマンドで構成できます。ほとんどの 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
Container-Optimized OS を実行している VM でこの cloud-init
構成を使用すると、起動するたびに次のように動作します。
- ホスト ファイアウォールは、ポート 80 で受信 TCP 接続を許可するように構成されます。
nginx
コンテナはポート 80 をリッスンし、受信 HTTP リクエストに応答します。
Container-Optimized OS で cloud-init
を使用する方法については、インスタンスの作成と構成をご覧ください。