バックグラウンドモードで実行中のコンテナにbashまたはsshを取得する方法は?


933

実行中のdockerコンテナーにsshまたはbashしたい。例を参照してください:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

今、私はこのようなものを取得したいです(実行中のコンテナに入ります):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

Vagrantを使用しましたが、同様の動作を取得したいと思いvagrant sshます。


あるいはsudo docker exec -i -t 665b4a1e17b6 /bin/sh、aptプログラムとパッケージをインストールできるようにするために
-fonjeekay

1
SSHを使用して実行中のコンテナにbashすることは不十分な方法であることに注意してください。ここの根拠を参照してください。sudo docker exec -i -t container-name /bin/bash行く方法です。
patryk.beza

回答:


1307

答えはDockerのattachコマンドです。上記の私の例では、ソリューションは次のようになります。

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Dockerバージョン1.3以降の場合:コンテナーのシェルを取得する別の方法を提案してくれたユーザーWiR3Dに感謝します。使用する場合attach、シェルのインスタンスは1つしか使用できません。そのため、コンテナのシェルの新しいインスタンスで新しいターミナルを開く場合は、次を実行するだけです。

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

または

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#

5
または、実行sudo docker attach loving_heisenberg
チアゴペロッタ14

51
attachコマンドが機能しないため、Dockerがフリーズします。
Mo J.ムグラビ14年

10
boot2dockerユーザーへのリマインダー:sudoを削除します:)
Henno 14

17
-i -t等しい-it
pasha.zhukov

47
これは選択すべき危険な答えであり、非常に投票されます。 docker attachたとえば、MongoDBインスタンスにアクセスすると、インスタンスが強制終了されます。でより詳細に説明するように、この質問 attachexec異なる動物です。
fwc

675

Docker 1.3以降:

docker exec -it <containerIdOrName> bash

基本的に、/bin/bashコマンドを使用してDockerコンテナーが開始された場合は、を使用してアクセスできますattach。そうでない場合は、コマンドを実行して、を使用してコンテナ内にBashインスタンスを作成する必要がありますexec

また、Bashを不正なプロセスで実行したままにせずにBashを終了するには:

exit

うん、それは簡単です。


ナノを動作させる方法をまだ理解していない。phusionのdocker-sshが関係する可能性があると考える
WiR3D

Dockerでデフォルトでbashを設定する方法はありますか?
ipeacocks

@ipeacocksはい、dockerfileのRUNコマンドがの場合/bin/bash。しかし、あなたの意味に依存します。コンテナを実行し、その同じターミナルでbashをすぐに使用できるようにしたい場合は、実行する-it必要があります
-WiR3D

10
dockerグループを使用するのは悪い習慣です。Dockerグループに属するユーザーは、基本的にsudoを使用せずにルート権限で使用されます。projectatomic.io/blog/2015/08/...
Maiku森

1
ホストセキュリティの観点から、sudovs dockerグループを使用するかどうかに大きな違いはないと思います。いずれにしても、dockerグループを使用するかsudo、コンテナを起動するかに関係なく、ゲストからホストファイルシステムに完全な権限を提供できるセキュリティホールがdockerに組み込まれています。
-nobar

123

質問の著者は具体的には、実行中のコンテナに興味があると述べましたが、コンテナが実行されていない場合でも、実行するために実行したいことに注意してください:

docker run -i -t --entrypoint /bin/bash <imageID>


10
@kraxorの答えと同じように、異なるコンテナーを提供します。
ブレイザーブレード


19

@Timurの回答に基づいて、次の便利なスクリプトを作成しました

セットアップ

次の内容でdocker-sshファイルをあなたに入れてください$PATH

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

:一部のコンテナにはが含まれていませんbashashshなどです。これらの場合bash、上記のスクリプトで置き換えられます。

使用法

実行中のインスタンスが1つしかない場合は、単に実行します

$> docker-ssh 

それ以外の場合は、取得するdocker idパラメーターを指定しますdocker ps(最初の列)

$> docker-ssh 50m3r4nd0m1d

最後に-lが必要な理由を知っていますか?
ナムG VU

ログインシェルとしてbashを起動し、環境パラメーターを読み取ります(コマンドの上の行で説明)
Matyas

13

コンテナにbashがインストールされていない場合は、shを試すことができます。

docker exec -it CONTAINER /bin/sh

または、最初に/ binでシェルを探します:

docker export CONTAINER|tar -t|egrep ^bin/

「consul」とは何ですか?参照先はありますか?「コンソール」という意味ですか?
ピーターモーテンセン

9

実行中のコンテナにSSH機能を提供するコンテナ化されたSSHサーバーを作成しました。コンテナを変更する必要はありません。唯一の要件は、コンテナにbashがあることです。

「web-server1」という名前のコンテナがある場合。次のdocker runコマンドは、最初のコンテナーにSSHを提供する2番目のコンテナーを起動します。

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

その他のポインターについては、https://github.com/jeroenpeeters/docker-sshをご覧ください


これは受け入れられた答えでなければなりません^
Nam G VU

ところで、ソリューションを使用してsshセッションを開始するときに、どのように.bashrcを自動ロードできますか?また、githubに問題を投稿github.com/jeroenpeeters/docker-ssh/issues/30
Nam G VU

6

@jpetazzoには、このテーマに関する素晴らしい投稿があります。短い答えは以下を使用することnsenterです。

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

PS:投稿のコメントで議論を確認することを忘れないでください...

乾杯


1
それは、もはや必要はない、かなり古い投稿です。@ WiR3Dのdocker execソリューションはかなり便利です。
-drevicko

4

また、Pipeworkを使用してルーティング可能なIPアドレスをDockerコンテナに付与し、その後、その新しいIPアドレスを使用してマシンにSSH接続することもできます。

これは、などのアプリケーション固有のコマンドを使用する代わりに、より「伝統的な」(ssh)になり、docker attach最終的にはシステムおよびバージョン間でより「移植可能」になります。


簡単な方法を追加してください。正直に言うと、本当に必要ですが、そのための最も簡単な解決策を探す時間はありません。ここに答えを投稿していただけますか?それは素晴らしいだろう..
ティムールファイズラフマノフ14年

2
これを達成するには2つの方法がありますが、それは簡単ではなく、大きな投稿になります。パイプワークまたはこのリンクを使用するために、このリンクを自分でチェックすることができます。魔女は基本的にパイプワークと同じことを達成し、もう少し簡単ですが、手動で行う必要があります。したがって、話をするサーバーの数に依存します。もっと具体的なことがわからない場合はお知らせください。しかし、私は完全なチュートリアルを書く時間もありません。
ラドリアヌス14年

あなたは正しいです-それを行うには明白なと簡単な方法はありません(リンクのおかげで、私は私が後でそれを再検討すると思います。
ティムールFayzrakhmanov



1

中に入る

以下をgoinside使用してコマンドラインツールをインストールします。

sudo npm install -g goinside

そして、適切な端末サイズのドッカーコンテナ内に移動します。

goinside docker_container_name

詳細をチェックし、これを行います。



0

情報提供のみ。デーモンではない単純なコンテナにログインする必要がある場合は、次のコマンドを使用する必要があります。

docker start {id}
docker attach {id}

-1

コンテナがたとえばデータのみのコンテナのように停止している場合、データコンテナにアタッチするたびに使い捨てコンテナを実行するのが適切なソリューションです。この場合、一時コンテナにはOSツールがあるため、データコンテナ自体が完全に空になる可能性があります。

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.