web-dev-qa-db-ja.com

停止したコンテナを別のコンテナから開始することは可能ですか

コンテナーAとコンテナーBの2つがあります。コンテナーAが開始すると、1つのプロセスが実行され、コンテナーは停止します。コンテナBは単なるWebアプリケーションです(たとえば、expressjs)。コンテナーBからAをキックスタートすることは可能ですか?

13
tony.0919

コンテナーにdockerへのアクセスを許可して、ホスト上の他のコンテナーを生成できるようにすることができます。これを行うには、コンテナー内のdockerソケットを公開します。例:

docker run -v /var/run/docker.sock:/var/run/docker.sock --name containerB myimage ...

これで、dockerクライアントをコンテナー内で使用できる場合、ホスト上のdockerデーモンを制御し、それを使用して「コンテナーA」を生成できます。

このアプローチを試す前に、セキュリティの考慮事項に注意する必要があります。Dockerへのアクセスは、ホストでのrootアクセス権と同じです。つまり、Webアプリケーションにリモートの侵害がある場合、キーを渡しただけです。ホストを攻撃者に。これについて詳しく説明します この記事

23
larsks

ドッカーソケットを装着することで可能です。

コンテナA
標準出力(およびそのログ)に時刻を出力して終了します。

docker run --name contA ubuntu date

コンテナB
コツは、ホストのDockerソケットをマウントしてから、Dockerクライアントをコンテナーにインストールすることです。その後、ホストからdockerを使用しているかのようにデーモンと対話します。 dockerをインストールすると、コンテナーAが5秒ごとに再起動されます。

docker run --name contB -v /var/run/docker.sock:/var/run/docker.sock ubuntu bash -c "
apt-get update && apt-get install -y curl &&
curl -sSL https://get.docker.com/ | sh && 
watch --interval 5 docker restart contA"

ログを見ると、contAが呼び出されていることがわかります。

docker logs contA

とはいえ、Dockerは実際には長時間実行されるサービスを対象としています。 Docker githubの問題で、メンテナンスやcronジョブなどの短期間の「ジョブ」サービスを指定することについていくつかの話し合いがありますが、何も決定されておらず、はるかにコード化されていません。そのため、コンテナが稼働し続けるようにシステムを構築するのが最善です。

10
Bernard