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


545

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

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

私はむしろなりません設定し、OpenSSHサービス可能であれば、コンテナを構築します。


7
やってみましたdocker attach [conainer-id]か?
shabbychef 2014

13
@shabbychef docker attachが変更されていない限り、attachコマンドは新しいttyではなく、実行中のttyに接続するため、質問のタイトルは「... with new TTY」です。これが、以下の回答でattachコマンドを使用しない理由です。
Programster

回答:


1061

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

docker exec -it [container-id] bash

30
質問の時点ではなかったこの新しい方法が現在の最良の方法IMOであるため、これを正しい答えに変更しました(私自身のものから)。
Programster

3
ただし、これexecは通常の端末として機能しないことに注意してください。たとえば、コンテナ内でユーザーを変更することはできません。
ピティコス2014年

3
@Pithikos:execを使用してシェルを実行し、su someuserユーザーを変更できます。Docker 1.4.1の実行
lsh

2
この議論を読んでいる人には注意してください。私はdocker exec -it最終的に完全に機能する疑似ttyを提供すると確信していますが、今のところ(Dockerバージョン1.9.1)、いくつかの欠点があります:github.com/docker/docker/issues/8755
blong

18
エラー「exec: "bash":$ PATHに実行可能ファイルが見つかりません」が表示された場合、これを試すことができます:docker exec -it [container-id] / bin / sh
Dai Kaixian

42

SSHを使用せずにコンテナーに入るには、「nsenter」というJérômePetazzoniのツールを使用する必要があります。参照:https : //github.com/jpetazzo/nsenter

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

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


これが正しい方法です。ブログを参照してください。
Jesse Glick 2014

5
docker 1.3では、新しいコマンドがありdocker execます。これにより、実行中のDockerに入ることができます:(docker exec -it <container-id> bash下記の私の回答を参照)
Michael_Scharf 2014年

5
docker-enterまだ存在?それは私を与えますcommand not found
Snowcrash 2016年

22

更新

docker 0.9以降、以下の手順が機能するようにするには、デーモンを再起動する前に、/etc/default/dockerファイルを'-e lxc'dockerデーモンの起動オプションに更新する必要があります(ホストを再起動してこれを行いました)。

/ etc / default / dockerファイルを更新します

これはすべてです...

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

ソース

これにより、Docker 0.11の新しいホストのみのネットワークオプション機能が「機能」しなくなり、ループバックインターフェイスのみが表示されることに注意してください。バグレポート


それは解決策ことが判明した別の質問は、この1の解決策でした。

... ps -notruncDockerを使用して完全なlxcコンテナーIDを取得し、lxc-attach -n <container_id>そのコンテナーでrootとしてrun bashを使用できます。

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

ここに画像の説明を入力してください 完全なコンテナIDを見つける

ここに画像の説明を入力してください lxc attachコマンドを入力します。

ここに画像の説明を入力してください 上は、Dockerが起動した私のApacheプロセスを示しています。


それで、Dockerだけでこれを行う方法はありませんよね?個人的には自分でLXCを混ぜない方が好きです。
qkrijger 2014年

bashを起動する代わりにlxc-attachでコマンドを実行する方法はありますか?THX!!
joselo 2014年

@qkrijgerは私が知っている限りでは正しいです。LXCの「混合」が心配なのはなぜですか。dockerがLXCの上に構築されていることに気付きましたか?
Programster

@joselo私はあなたの質問を理解していませんが、より詳細な新しい投稿を作成することをお勧めしますか?このようbashの持つまたは-dなどとデーモンのようにドッカプロセスを開始する多くの方法があります
Programster

@programsterはい、私はそれを理解しています:)それでも、Dockerと直接組み合わせてLXCを使用することは、ハッキングのように感じます。楽しいですが、実際にはメンテナンスできません。一般に、作業するために選択した抽象化レイヤーでコーディングする必要があります。本当にLXC自体が必要な場合は、Dockerへのプルリクエストの時期かもしれません:)
qkrijger

7

コンテナ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です。

次に、dockerに入ります:

docker exec -it [container_id] bash

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


5

コンテナー内でtmux / GNU Screenを実行するのはどうですか?簡単な方法で、必要な数のvtyにスムーズにアクセスできるようです。

$ docker attach {container id}

これは、コンテナーへのアクセスを取得する(たとえば、デバッグする)ことがわかっている場合は問題ありませんが、既存のコンテナーを調べたいと述べているOPには役立ちません。
Luca Spiller、2014

1
この答えに関する私の問題は、人々がすでに使用について質問していることでdocker attachあり、私はそれを指摘しました:...the attach command attaches to the running tty, not a new one, hence the question title is "...with new TTY"
Programster

まあ、コンテナーが既にこのソリューションを実行している場合は役に立ちませんが、以前にマルチプレクサーを実行したままにしておけば、追加のttyは必要ありません...実際、私はtmuxを使い始めて以来、1つのttyを使用します一度にtmuxに入ると、好きなだけvtyを生成できるので、必要なすべてのことを実行できます。
cig0

4

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

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

使い方は簡単です

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

試してみました、とてもクールです!ubuntuではsudo apt-get build-essential -y gcc docker-enter.c -o docker-enter sudo ./docker-enter <short-container-id>を実行する必要がありました。 lxc-attach -nコードベースは短いので、全体をすばやくスキャンして悪意のあるものを探すことができます。
Programster

gentooのgithub.com/steveeJ/personal-portage-overlayで、ebuild をapp-emulation / docker - enterとして利用できるようにしました。
stefanjunker 14

私はubuntuユーザー向けにこれを自動化するためのチュートリアル/スクリプトをprogramster.blogspot.co.uk/2014/01/…に
Programster

2

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

nsinitをインストールする

git clone git@github.com: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
docker exec -t -i container_name /bin/bash

コンテナーコンソールに移動します。


私も同じ問題を抱えていたので、この質問にたどり着きました。私が変更するまで、似ていると思われる答えは私にとってはうまくいきませんでした。これは削除できます。
ダンスタン


1

実行中のmicrosoft / iisでpowershellをデーモンとして実行して起動しました

docker exec -it <nameOfContainer> powershell

質問がLinuxベースのコンテナーに関するものであるかのように見えます。この答えはおそらく、Windowsベースのコンテナーがある場合、またはPowerShellの.NET Coreバージョン(たとえばPowerShell 6以降)がインストールされている場合にのみ機能します。
Manfred

0

のWindows 10、私はドッキングウィンドウがインストールされています。コンテナでJnekinsを実行していますが、同じエラーメッセージが表示されました。この問題を解決するためのステップバイステップガイドは次のとおりです。

ステップ1: gitbashを開き、docker run -p 8080:8080 -p 50000:50000 jenkinsを実行します。

ステップ2:新しいターミナルを開きます。

ステップ3:「docker ps」を実行して、実行中のコンテナのリストを取得します。コンテナIDをコピーします。

ステップ4:ここで、「docker exec -it {container id} sh」または「docker exec -it {container id} bash」を実行すると、「入力デバイスがTTYではありません。」のようなエラーメッセージが表示されます。 minttyを使用して、コマンドの前に 'winpty'を付けてみてください "

ステップ5:コマンド「$ winpty docker exec -it {container id} sh」を実行します

ボラ!! これでターミナル内にいます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.