Dockerデーモンのリモートアクセスを設定する
デフォルトでは、DockerデーモンはUnixソケットでの接続をリッスンして、ローカルクライアントからのリクエストを受け付けます。Dockerを構成して、Unixソケットだけでなく、IPアドレスとポートでリモートクライアントからのリクエストを受け付けるようにすることができます。
Dockerをリモートクライアントからの接続を受け入れるように構成すると、ホストへの不正アクセスやその他の攻撃に対して脆弱になる可能性があります。
Dockerをネットワークに公開する際のセキュリティ上の影響を十分に理解することが非常に重要です。接続を保護するための対策が取られない場合、リモートの非rootユーザーがホストのrootアクセスを取得する可能性があります。
TLSなしでのリモートアクセスは推奨されません。今後のリリースでは、明示的なオプトインが必要になる予定です。
この接続を保護するためにTLS証明書を使用する方法については、Dockerデーモンソケットを保護するを参照してください。
リモートアクセスを有効にする
リモートアクセスを有効にするには、docker.service
systemdユニットファイルを使用するか、daemon.json
ファイルを使用して構成できます。systemdを使用していないディストリビューションの場合は、daemon.json
ファイルを使用します。
systemdユニットファイルとdaemon.json
ファイルの両方を使用して接続をリッスンするようにDockerを構成すると、Dockerの起動が妨げられる競合が発生します。
systemdユニットファイルでリモートアクセスを構成する
-
sudo systemctl edit docker.service
コマンドを使用して、docker.service
のオーバーライドファイルをテキストエディタで開きます。 -
次の行を追加または変更します。値は自身の環境に合わせて置き換えてください。
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
-
ファイルを保存します。
-
systemctl
の設定をリロードします。
$ sudo systemctl daemon-reload
- Dockerを再起動します。
$ sudo systemctl restart docker.service
- 変更が反映されたかを確認します。
$ sudo netstat -lntp | grep dockerd
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
daemon.json
でリモートアクセスを構成する
/etc/docker/daemon.json
ファイルのhosts
配列を設定し、UnixソケットとIPアドレスに接続するようにします。
{
"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}
-
Dockerを再起動します。
-
変更が反映されたかを確認します。
$ sudo netstat -lntp | grep dockerd
tcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
ファイアウォールを通じてリモートAPIへのアクセスを許可する
Docker Remote APIに他のリモートホストからアクセスしたい場合、同じホスト上でファイアウォールを実行している場合は、Dockerポートへの着信接続を許可するようにファイアウォールを構成する必要があります。TLSで暗号化されたトランスポートを使用している場合、デフォルトのポートは2376
、それ以外の場合は2375
です。
よく使用される2つのファイアウォールデーモンは次のとおりです:
- Uncomplicated Firewall (ufw) は、Ubuntuシステムでよく使用されます。
- firewalld は、RPMベースのシステムでよく使用されます。
ご利用のOSとファイアウォールのドキュメントを参照してください。以下の情報は、設定を開始するための参考になるかもしれません。この手順で使用される設定は緩やかであり、システムをより厳密にロックダウンする別の構成を検討することをお勧めします。
- ufwでは、設定で
DEFAULT_FORWARD_POLICY="ACCEPT"
を指定します。 - firewalldでは、次のようなルールをポリシーに追加します。1つは着信リクエスト用、もう1つは送信リクエスト用です。`
<direct>
[ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -i zt0 -j ACCEPT </rule> ]
[ <rule ipv="ipv6" table="filter" chain="FORWARD_direct" priority="0"> -o zt0 -j ACCEPT </rule> ]
</direct>
インターフェース名とチェーン名が正しいことを確認してください。
追加情報
デーモンへのリモートアクセスの構成オプションについて詳しくは、dockerd CLIリファレンスを参照してください。