web-dev-qa-db-ja.com

Dockerコンテナをサーバーとして起動する方法

単純なWebアプリケーションをホストするdockerコンテナーを実行したいのですが、サーバーとしてイメージを設計/実行する方法がわかりません。例えば:

docker run -d -p 80:80 ubuntu:14.04 /bin/bash

これにより、コンテナが開始され、すぐにシャットダウンされます。代わりに、対話形式で開始できます。

docker run -i -p 80:80 ubuntu:14.04 /bin/bash

これは動作しますが、実行中のすべてのコンテナに対してインタラクティブなシェルを開いたままにする必要がありますか?ただ起動してバックグラウンドで実行したいです。ハックは決して返さないコマンドを使用します:

docker run -d -p 80:80 {image} tail -F /var/log/kern.log

しかし、今はシェルに接続できなくなり、アプリケーションが動作している場合に何が起こっているかを調べることができません。

ホストからシェルをアタッチ/デタッチできるように、コンテナをバックグラウンドで起動する方法はありますか(vmの場合)。または、私は完全にポイントを逃していますか?

21
Jeroen

docker runの最後の引数は、コンテナ内で実行するコマンドです。 docker run -d -p 80:80 ubuntu:14.04 /bin/bashを実行すると、コンテナでbashが実行され、それ以上は実行されません。実際には、コンテナでWebアプリケーションを実行し、そのコンテナを存続させたいので、docker run -d -p 80:80 ubuntu:14.04 /path/to/yourappを実行する必要があります。

しかし、おそらくアプリケーションは実行するために何らかの構成に依存しています。環境変数から設定を読み取る場合は、-e key=value引数とともにdocker runを使用できます。アプリケーションに設定ファイルを配置する必要がある場合は、おそらくDockerfileを使用して最初に設定をセットアップする必要があります。

この記事 は、コンテナでノードアプリケーションを実行する素敵な完全な例を提供します。

21
Ben Whaley

Dockerのユーザーは、コンテナーが完全なVMであると想定する傾向がありますが、Dockerの設計コンセプトは、コンテナー内でVMを模倣するのではなく、最適なコンテナー化に重点を置いています。

どちらも正しいですが、実装の詳細の一部は最初は簡単に理解できません。私は理解しやすい方法で実装の違いのいくつかを要約しようとしています。

  1. SSH

SSHはLinux VM(またはコンテナ)の中に入る最も簡単な方法ですが、多くのdockerizedテンプレートにはsshサーバーがインストールされていません。これは最適化とセキュリティ上の理由によると思いますコンテナ用。

  1. ドッカーアタッチ

そのまま使用する場合は、Docker接続が便利です。しかし、執筆時点では安定していません- https://github.com/docker/docker/issues/8521 。 SSHセットアップに関連付けられている場合がありますが、いつ完全に修正されるかはわかりません。

  1. dockerの推奨プラクティス(nsenterなど)

https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/でDockerが推奨する代替案(またはある意味でのベストプラクティス)

このプラクティスでは、基本的に、コンテナから可変要素を分離し、それらをドッカーホストのいくつかの場所にマッピングして、コンテナの外部から操作したり、永続化したりできるようにします。本番環境では良い習慣かもしれませんが、現在では、docker関連のプロジェクトが開発環境やステージング環境にある場合はそうではありません。

  1. bashコマンドライン

「docker exec -it {container id} bash」クラウドは、マシンにアクセスするための非常に便利で実用的なツールです。

  1. いくつかの基本

    • 「docker run」は新しいコンテナを作成するため、以前の変更は保存されません。
    • 「docker start」は既存のコンテナーを開始するため、以前の変更はコンテナー内に残りますが、同じimage-idを持つ多くの中から正しいcontainer-idを見つける必要があります。必要に応じて、バージョンを抑制するために「docker commit」する必要があります。
    • Ctrl-Cは、終了時にコンテナを停止します。コンテナがバックグラウンドで実行できるように最後に「&」を追加し、Enterキーを押すとプロンプトが表示されるようにします。
8
Michael Kim

元の質問に、あなたが述べたように、プロセスを実行し続けるためにいくつかのファイルをテーリングすることができます。

「アタッチ」の代わりにシェルに到達するには、2つのオプションがあります。

  1. docker exec -it <container_id> /bin/bash

または

  1. コンテナでsshデーモンを実行し、sshをポートマップしてから、sshをコンテナにマップします。
4
Guruprasad GV