web-dev-qa-db-ja.com

Dockerコンテナでサービスを自動的に開始する

私はdockerでいくつかの初期テストを行っています。現時点では、画像があり、いくつかのコンテナを実行できます。

docker ps

私がやります docker attach container_idおよびApache2サービスを開始します。

次に、メインコンソールからコンテナーをイメージにコミットします。

コンテナを終了した後、コンテナを起動しようとしたり、コミットされたイメージから新しいコンテナを1つ実行しようとすると、サービスは常に停止します。

Apacheなどのサービスが開始された1つのコンテナを作成または再起動するにはどうすればよいですか?

12
Pedro

編集:もともとこの回答を投稿して以来、Dockerについて多くのことを学びました。 「Dockerコンテナでのサービスの自動開始」は、Dockerの使用パターンとしては適切ではありません。代わりに、 フリートKubernetes 、またはMonit/SystemD/Upstart/Init.d/Cronのようなものを使用して、Dockerコンテナー内で実行されるサービスを自動的に開始します。

元の回答:コマンド/bin/bashを使用してコンテナを開始する場合、ここで説明する方法でこれを実現できます。 https://stackoverflow.com/a/19872810/2971199

したがって、docker run -i -t IMAGE /bin/bashでコンテナを起動し、コンテナの起動時にApache2を自動的に起動する場合は、コンテナの/etc/bash.bashrcを編集し、/usr/local/Apache2/bin/apachectl -f /usr/local/Apache2/conf/httpd.conf(またはApache2コマンドは)ファイルの最後の改行に。

イメージへの変更を保存し、docker run -i -t IMAGE /bin/bashで再起動すると、アタッチするとApache2が実行されます。

27
damick

使用できるオプションは、Supervisordなどのプロセスマネージャーを使用して複数のプロセスを実行することです。誰かがsshdとmongodbでこれを達成しました: https://github.com/justone/docker-mongodb

5
bacongobbler

できないと思います。 Dockerfileを使用してイメージを作成し、その中にCMDを定義すると、コンテナーの起動時に実行されます。基本についてはビルダーのドキュメントを参照してください( https://docs.docker.com/reference/builder/ )および Dockerコンテナでサービスを自動的に実行する を参照してくださいサービスを実行し続けます。

Dockerfileを使用してこれを自動化する必要はありません。また、手動コミットでイメージを作成し、コマンドラインで実行することもできます。次に、実行するコマンドを指定します(これは、Dockerfile CMDが実際に実行するものです)。この方法でDockerfiles CMDをオーバーライドすることもできます。最新のCMDのみが実行されます。これは、それを使用してコンテナーを起動する場合のコマンドラインコマンドです。ドキュメントの基本的なdocker run -i -t base /bin/bashコマンドは一例です。コマンドが長くなりすぎる場合は、もちろん便利なスクリプトを作成できます。

4
qkrijger

仕様により、コンテナの実行に使用されたルートプロセスが終了すると、コンテナは分離モードで終了します。 FOREGROUNDモードでApacheサービスを開始する必要があります。

docker run -p 8080:80 -d ubuntu/Apache apachectl -D FOREGROUND

リファレンス: https://docs.docker.com/engine/reference/run/#detached-vs-foreground

2
Rodrigo Lima