私はdockerでいくつかの初期テストを行っています。現時点では、画像があり、いくつかのコンテナを実行できます。
docker ps
私がやります docker attach container_id
およびApache2サービスを開始します。
次に、メインコンソールからコンテナーをイメージにコミットします。
コンテナを終了した後、コンテナを起動しようとしたり、コミットされたイメージから新しいコンテナを1つ実行しようとすると、サービスは常に停止します。
Apacheなどのサービスが開始された1つのコンテナを作成または再起動するにはどうすればよいですか?
編集:もともとこの回答を投稿して以来、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が実行されます。
使用できるオプションは、Supervisordなどのプロセスマネージャーを使用して複数のプロセスを実行することです。誰かがsshdとmongodbでこれを達成しました: https://github.com/justone/docker-mongodb
できないと思います。 Dockerfileを使用してイメージを作成し、その中にCMDを定義すると、コンテナーの起動時に実行されます。基本についてはビルダーのドキュメントを参照してください( https://docs.docker.com/reference/builder/ )および Dockerコンテナでサービスを自動的に実行する を参照してくださいサービスを実行し続けます。
Dockerfileを使用してこれを自動化する必要はありません。また、手動コミットでイメージを作成し、コマンドラインで実行することもできます。次に、実行するコマンドを指定します(これは、Dockerfile CMDが実際に実行するものです)。この方法でDockerfiles CMDをオーバーライドすることもできます。最新のCMDのみが実行されます。これは、それを使用してコンテナーを起動する場合のコマンドラインコマンドです。ドキュメントの基本的なdocker run -i -t base /bin/bash
コマンドは一例です。コマンドが長くなりすぎる場合は、もちろん便利なスクリプトを作成できます。
仕様により、コンテナの実行に使用されたルートプロセスが終了すると、コンテナは分離モードで終了します。 FOREGROUNDモードでApacheサービスを開始する必要があります。
docker run -p 8080:80 -d ubuntu/Apache apachectl -D FOREGROUND
リファレンス: https://docs.docker.com/engine/reference/run/#detached-vs-foreground