web-dev-qa-db-ja.com

新しいTTYで既に実行されているDockerコンテナに入る方法

フォアグラウンドでApacheサービスを実行しているコンテナがあります。私は他のシェルからそのコンテナーにアクセスしてその中を「突き回し」てファイルを調べることができるようにしたいと思います。現時点では、コンテナーに接続すると、Apacheデーモンを見たままになり、コマンドを実行できなくなります。

実行中のコンテナに別のttyを接続することは可能ですか?おそらく、Dockerが実際には単にLXCコンテナーをラップしているという事実を利用することができますか?私はSudo lxc-console -n [container-id] -t [1-4]を試しましたが、利用可能にされるのは1つのttyだけであり、それはApacheデーモンを実行しているものです。おそらくビルド中に複数のlxcコンソールを有効にする方法はありますか?

可能であれば、opensshサービスを使って not configureしてコンテナを構築したいと思います。

456
Programster

Docker 1.3では、新しいコマンド docker exec があります。これにより、実行中の港湾労働者を入力することができます。

docker exec -it [container-id] bash
893
Michael_Scharf

SSHを使わずにコンテナに入るには、JérômePetazzoniの 'nsenter'というツールを使うべきです。参照してください: https://github.com/jpetazzo/nsenter

単純に実行してインストールします。docker run -v /usr/local/bin:/target jpetazzo/nsenter

その後、コマンドdocker-enter <container-id>を使用してコンテナに入ります。

40
Hyperfocus

更新

Docker 0.9から、以下のステップがうまくいくためには、デーモンを再起動する前に/etc/default/dockerファイルを'-e lxc'起動オプションに更新する必要があります(これはホストを再起動することで行いました)。

update to the /etc/default/docker file

これがすべての理由です...

... [docker 0.9]には、コンテナを起動するためのLXC以外のAPIの使用を可能にするための新しい「エンジンドライバ」抽象化が含まれています。また、LXCツールを使用せずにコントロールグループを処理できる新しいAPIライブラリ(libcontainer)に基づく新しいエンジンドライバも提供します。主な問題は、コンテナ内でシェルを起動するなど、lxc-attachを使用してコンテナ上でアクションを実行している場合、開発環境にはめったに役に立ちません...

ソース

これは新しい docker 0.11のホストオンリーネットワークオプション機能 を妨げ、ループバックインターフェースだけが見えることに注意してください。 バグ報告


別の質問 への解決策もこれに対する解決策であることがわかります。

... docker ps -notruncを使って完全なlxcコンテナIDを取得してから、そのコンテナのrootとしてlxc-attach -n <container_id> run bashを使うことができます。

更新: 廃止予定のps --no-truncの代わりにps -notruncを使用する必要があります。

enter image description here フルコンテナIDを探す

enter image description here lxc attachコマンドを入力してください。

enter image description here 上は、そのdockerを実行している私のApacheプロセスを示しています。

18
Programster

最初 stepコンテナIDを取得する:

docker ps

これはあなたに何かを示すでしょう

コンテナID画像コマンド作成ステータスポート名

1170fe9e9460 localhost:5000/python:env-7e847468c4d73a0f35e9c5164046ad88 "./run_notebook.sh" 26秒前最大25秒0.0.0.0:8989-> 9999/tcp SLURM_TASK-303337_0

この場合、1170fe9e9460はコンテナIDです。

2番目 、港湾労働者を入力します。

docker exec -it [container_id] bash

だから上記の場合:docker exec -it 1170fe9e9460 bash

5
patapouf_ai

コンテナー内でtmux/GNU Screenを実行することについてはどうですか?シンプルであなたが欲しいだけ多くのvtyにアクセスするためのよりスムーズな方法のようです:

$ docker attach {container id}
4
cig0

nsenterはそれを行います。しかし、私も簡単な方法でコンテナを入力する必要があり、nsenterは私のニーズには十分ではありませんでした。いくつかの状況でバグがありました(黒い画面と-wdフラグが機能していません)。さらに、私は特定のユーザーとしてそして特定のディレクトリにログインしたいと思いました。

私はコンテナに入るための自分の道具を作ってしまいました。あなたはそれを見つけることができます: https://github.com/Pithikos/docker-enter

その使い方は同じくらい簡単です

./docker-enter [-u <user>] [-d <directory>] <container ID>
4
Pithikos

"nsinit"方法は次のとおりです。

nsinitをインストール

git clone [email protected]:dotcloud/docker.git
cd docker
make Shell

コンテナの内側から:

go install github.com/dotcloud/docker/pkg/libcontainer/nsinit/nsinit

外から

docker cp id_docker_container:/go/bin/nsinit /root/

これを使って

cd /var/lib/docker/execdriver/native/<container_id>/
nsinit exec bash
2
Ivailo Bardarov
docker exec -t -i container_name /bin/bash

コンテナコンソールに連れて行ってくれるでしょう。

1
Zemuldo

実行中のMicrosoft/iisをデーモンとして実行してPowerShellを起動しました。

docker exec -it <nameOfContainer> powershell
1
Ahmed Samir

港湾労働者の停止

docker start -i container_name

これはUbuntuにログインしているリモート端末で私のために働きました

0
Flavio