単純な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の場合)。または、私は完全にポイントを逃していますか?
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
を使用して最初に設定をセットアップする必要があります。
この記事 は、コンテナでノードアプリケーションを実行する素敵な完全な例を提供します。
Dockerのユーザーは、コンテナーが完全なVMであると想定する傾向がありますが、Dockerの設計コンセプトは、コンテナー内でVMを模倣するのではなく、最適なコンテナー化に重点を置いています。
どちらも正しいですが、実装の詳細の一部は最初は簡単に理解できません。私は理解しやすい方法で実装の違いのいくつかを要約しようとしています。
SSHはLinux VM(またはコンテナ)の中に入る最も簡単な方法ですが、多くのdockerizedテンプレートにはsshサーバーがインストールされていません。これは最適化とセキュリティ上の理由によると思いますコンテナ用。
そのまま使用する場合は、Docker接続が便利です。しかし、執筆時点では安定していません- https://github.com/docker/docker/issues/8521 。 SSHセットアップに関連付けられている場合がありますが、いつ完全に修正されるかはわかりません。
このプラクティスでは、基本的に、コンテナから可変要素を分離し、それらをドッカーホストのいくつかの場所にマッピングして、コンテナの外部から操作したり、永続化したりできるようにします。本番環境では良い習慣かもしれませんが、現在では、docker関連のプロジェクトが開発環境やステージング環境にある場合はそうではありません。
「docker exec -it {container id} bash」クラウドは、マシンにアクセスするための非常に便利で実用的なツールです。
いくつかの基本
元の質問に、あなたが述べたように、プロセスを実行し続けるためにいくつかのファイルをテーリングすることができます。
「アタッチ」の代わりにシェルに到達するには、2つのオプションがあります。
docker exec -it <container_id> /bin/bash
または