docker
CLIプログラムは、コンテナーを実行するDockerデーモンから独立しています。通常、両方のコンポーネントはローカルマシンで実行されますが、docker
を実行できます。 リモートDockerホストに対するコマンド。
リモートホストの使用は、いくつかのシナリオで役立つ場合があります。小規模な開発チーム用に共有DockerEngineインストールをセットアップする場合があります。その後、各開発者は、ローカルのdocker exec
を使用してリモートコンテナに接続できます。 コマンド。
強力なサーバーが使用されていない場合、リモートホストはより頻繁に価値があります。ノートパソコンの速度が遅い、またはストレージが不足している場合は、ネットワークで専用のDockerホストを使用すると、パフォーマンスが大幅に向上する可能性があります。あなたはまだ地元のdocker
のすべての便利さを手に入れます ターミナルのCLI。
リモートホストとなるシステムにDockerがインストールされていることを確認してください。必要なのはdocker-cli
だけです Docker Engineを実行しないため、ローカルマシンでパッケージ化します。
Dockerを新しくインストールすると、デフォルトでUnixソケットが提供されます。リモートアクセスにはTCPソケットが必要です。 dockerd
を実行します (Dockerデーモン実行可能ファイル)-H
バインドするソケットを定義するフラグ。
sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
このコマンドは、DockerをマシンのループバックアドレスのデフォルトのUnixソケットとポート2375にバインドします。 -H
を繰り返すことで、追加のソケットとIPアドレスにバインドできます。 フラグ。
dockerd
を実行するたびにフラグを渡す必要があります 。再起動後もそれらを保持する場合は、シェルエイリアスを作成するか、Dockerサービス定義を変更します。 systemd
を使用して後者を実現する方法は次のとおりです。 、ほとんどのLinuxディストリビューションがサービス管理に使用します。
/etc/systemd/system/docker.service.d/options.conf
を編集します (または、存在しない場合は作成します)。 [Service]
を見つけます セクションを作成し、ExecStart
を変更します 行:
[Service] ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
systemd
をリロードします 変更を適用するための構成:
sudo systemctl daemon-reload
Dockerがすでに実行されている場合は、sudo systemctl restart docker
を使用します サービスを再開します。 Dockerデーモンは、起動するたびにTCPポート2375にバインドするようになりました。ポートへのトラフィックがファイアウォール構成で許可されていることを確認してください。 ufwを使用している場合は、ufw allow 2375
を実行します ポートを開きます。
DockerCLIはDOCKER_HOST
を使用します 接続するホストを決定するための環境変数。変数が設定されていない場合は、ローカルデーモンのUnixソケットが使用されます。
1つのdocker
にリモートホストを使用できます DOCKER_HOST
の前にコマンドを追加します 変数:
DOCKER_HOST=tcp://192.168.0.1:2375 docker run httpd:latest -d
これにより、httpd:latest
から新しいコンテナが開始されます 192.168.0.1:2375
でDockerエンジンを使用したイメージ 。
1つのセッションで複数のコマンドを実行する場合は、DOCKER_HOST
をエクスポートします。 シェルへの変数:
export DOCKER_HOST=tcp://192.168.0.1:2375 docker run httpd:latest -d --name httpd docker ps docker rm httpd --force
docker
を作成できます DOCKER_HOST
を設定して、常にリモートホストを使用してください シェルの構成ファイルでグローバルに。 Bashでこれを行う方法は次のとおりです。
echo "export DOCKER_HOST=tcp://192.168.0.1:2375" >> ~/.bashrc
ここで、DOCKER_HOST
環境変数は、シェルが起動するたびに設定されます。
基本的なTCPソケットは保護されていません。ネットワーク経由でマシンにアクセスできる人は誰でも、Dockerソケットを使用してコンテナを制御できます。
DockerはTCPではなくSSHをサポートしています。ホストにSSHサーバーが使用可能な場合、これは通常、より適切なオプションです。認証されていないユーザーがアクセスするのを防ぎます。 SSHを使用する場合、追加の構成は必要ありません。 DOCKER_HOST
SSH接続文字列を渡すことができます:
DOCKER_HOST=ssh://user@hostname docker run -d --name httpd
または、SSHバインディングを使用して、リモートホストのDockerUnixソケットをローカルマシンに直接バインドすることもできます。
ssh -L /var/run/docker.sock:/var/run/docker.sock
これで、DOCKER_HOST
を使用する必要はありません。 まったく。リモートのdocker.sock
ローカルの対応物にバインドされます。 Dockerはこれを標準のUnixソケットとして自動検出します。
SSHベースのソリューションの1つを使用することは、Dockerデーモンのセキュリティにアプローチするための推奨される方法です。認証局とサーバーおよびクライアントキーを提供する場合、DockerはTLSもサポートします:
dockerd --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=0.0.0.0:2375
これで、認証局ca.pem
によって信頼された有効なSSL証明書を提示すれば、クライアントはポート2375で接続できるようになります。 。
関連: PEMファイルとは何ですか。どのように使用しますか?
Dockerを使用すると、さまざまなホストに接続するためのいくつかの「コンテキスト」を設定できます。 DOCKER_HOST
の代わりにコンテキストを使用できます 環境変数。複数のリモートホストを簡単に切り替えることができます。
docker context create --docker host=tcp://192.168.0.1:2375 --description remote docker context create --docker host=unix:///var/run/docker.sock --description local>
これらのコマンドは、2つの異なるコンテキストを作成します。1つはローカルのdocker.sock
用です。 1つはリモート接続用です。
docker context use
を使用してコンテキストを切り替えることができます コマンド:
docker context use remote # Container is started on "remote" docker run httpd:-latest -d docker context use local # Lists containers running on "local" docker ps
コンテキストは、複数のDockerホストを操作するときに役立ちます。 DOCKER_HOST
を継続的にリセットするよりも面倒ではありません。 ホスト間を移動すると変化します。
リモートホストはビルドのパフォーマンスを向上させることができることを前述しました。このステートメントは、DockerEngineを実行しているマシンがローカルハードウェアよりも高速である場合にのみ当てはまります。リモートホストの最大の欠点は、ネットワークを介した対話の余分なオーバーヘッドです。また、ネットワークに依存するようになります。接続が失われると、コンテナを管理できなくなります。
メインビルドサーバーとしてリモートホストを使用する場合は、信頼性の高い高速ネットワーク接続が必要です。最初のdocker build
stageは、イメージのビルドコンテキスト(通常は作業ディレクトリ)のコンテンツをDockerEngineに送信します。これは、Dockerがローカルで実行されている場合は高速ですが、リモートマシンへのアップロードにははるかに時間がかかる場合があります。
ネットワークを介してDockerデーモンインスタンスを公開することは、セキュリティ上のリスクです。アクセスが許可されたユーザーとデバイスに制限されていることを確認する必要があります。 Dockerデーモンソケットが意図せずに公開されると、攻撃者はホストに無制限にアクセスできるようになる可能性があります。 Dockerは通常、root
として実行されます したがって、信頼できる個人だけがコンテナを開始できることが重要です。
リモートDockerホストを設定すると、コンテナインスタンスをローカル開発マシンから分離できます。専用のDockerビルドサーバーは、パフォーマンスの向上とイメージストレージスペースの拡大を実現します。
実装のセキュリティを監査するように注意する必要があります。プレーンTCPソケットは、プライベートネットワークでは安全な場合がありますが、機密性の高い環境では展開しないでください。 SSHを使用すると、必須のキーベースの認証など、SSHのセキュリティを適切に管理する場合のリスクを軽減できます。