web-dev-qa-db-ja.com

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

実行中の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と同様の動作を取得したいです。

926

答えは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:/#
1300

Docker 1.3以降:

docker exec -it <containerIdOrName> bash

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

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

exit

うん、それは簡単です。

670
WiR3D

質問の著者は、実行中のコンテナに興味があると具体的に述べていますが、コンテナが実行されていない場合でも、実行できるように実行したいということも注目に値します。

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

121
Adam Kalnas

これを試して:

Sudo docker run -i -t webserver /bin/bash

ソース: https://docs.docker.com/articles/basics/#running-an-interactive-Shell

27
kraxor

@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

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

使用法

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

$> docker-ssh 

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

$> docker-ssh 50m3r4nd0m1d
18
Matyas

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

docker exec -it CONTAINER /bin/sh

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

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

実行中のコンテナに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

9
Jeroen Peeters

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

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

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

乾杯

6
Richard

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

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

4
radriaanse

特に開発中に、Dockerコンテナにsshできると便利な場合があります。次のDockerイメージでは、秘密キーを使用してコンテナーにsshできます。

buntuWithSSH-Docker

Dockerfileの要点は https://Gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 です。

3
Dev Khadka
docker run -it openjdk:8

これは動作します:-)

2
Kishan B

中に入る

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

Sudo npm install -g goinside

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

goinside docker_container_name

詳細については、 this outを確認してください。

1
Soorena

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

docker start {id}
docker attach {id}
0
Nek

実行中のコンテナーにbashするには、次のように入力します。

docker exec -t -i container_name /bin/bash
0