Eli_D
June 3, 2022, 9:05am
#1
実行中のdockerコンテナにsshまたはbashを実行したいと思います。 例を参照してください:
$ sudo docker run -d webserverwebserver is clean image from ubuntu:14.04$ sudo docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES665b4a1e17b6 webserver:latest /bin/bash ... ... 22/tcp, 80/tcp loving_heisenberg
今私はこのようなものを取得したい(実行中のコンテナに入る):
$ sudo docker run -t -i webserver
(または多分 665b4a1e17b6
代わりに) $ root@665b4a1e17b6:/#
しかし、上記の行を実行すると、新しいコンテナIDが取得されます:
$ root@42f1e37bd0e5:/#
私はVagrantを使用しましたが、私は同様の動作をしたいと思います vagrant ssh
.
答えはDockerのものです attach
コマンド。 したがって、上記の私の例では、解決策は次のようになります:
$ sudo docker attach 665b4a1e17b6 #by IDor$ 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:/#
Quinn
June 3, 2022, 9:17am
#3
Docker1.3以降:
docker exec -it <containerIdOrName> bash
基本的には、Dockerコンテナが次のコマンドを使用して起動された場合 /bin/bash
コマンドを使用してアクセスできます attach
. そうでない場合は、次を使用してコンテナ内にBashインスタンスを作成するコマンドを実行する必要があります exec
.
また、Bashを不正なプロセスで実行したままにせずにBashを終了するには:
exit
うん、それは簡単です。
質問の著者は、実行中のコンテナに興味があると具体的に述べていますが、コンテナが実行されていないが、実行して周りを突くようにしたい場合は、:
docker run -i -t --entrypoint /bin/bash <imageID>
Harley
June 3, 2022, 9:31am
#5
これを試してみてください:
sudo docker run -i -t webserver /bin/bash
ソース: https://docs.docker.com/engine/reference/commandline/run/
@Timurの答えに基づいて、私は次のものを作成しました 便利なスクリプト
セットアップ プット docker-ssh
あなたの中のファイル $PATH
以下の内容で
#!/bin/bash -xe# docker container id or name might be given as a parameterCONTAINER=$1if [[ "$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
しかし、 ash
, sh
など。 これらのケースでは bash
上記のスクリプトで置き換えられるものとする。
使用法 実行中のインスタンスが1つしかない場合は、単純に実行します
$> docker-ssh
それ以外の場合は、取得したdocker idパラメータを指定します docker ps
(最初のcol)
$> docker-ssh 50m3r4nd0m1d
あなたのコンテナにbashがインストールされていない場合は、shを試すことができます:
docker exec -it CONTAINER /bin/sh
または、最初に/binでシェルを探します:
docker export CONTAINER|tar -t|egrep ^bin/
実行中のコンテナに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
@jpetazzoは、 この主題についての素晴らしいポスト . 短い答えは次のようになります nsenter
:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)nsenter --target $PID --mount --uts --ipc --net --pid
P.S.:ポストのコメントの議論を点検することを忘れてはいけない。..
乾杯!
Ray
June 3, 2022, 10:08am
#10
Dockerコンテナにpipeworkを使用してルーティング可能なIPアドレスを指定し、その後、その新しいIPアドレスを使用してマシンにSSH接続することもできます。
これは、次のようなアプリケーション固有のコマンドを使用する代わりに、より"伝統的な"(ssh)になります docker attach
そして、最終的にはシステムやバージョン間でより"移植性"になります。
特に開発中にDockerコンテナにsshで接続できると便利な場合があります。 次のDockerイメージでは、秘密鍵を使用してコンテナにsshすることができます:
UbuntuWithSSH-Docker
Dockerfileの要点は次のとおりです https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07 .
SSHを使用して実行中のコンテナにbashを使用することは悪い習慣であることに注意してください–[ここでの理論的根拠]を参照してくださhttps://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil’sudo docker exec-i-t container-name/bin/bash`は行く方法です。
Maxx
June 3, 2022, 10:30am
#13
または、aptプログラムとパッケージをインストールできるようにするには、sudo docker exec-i-t665b4a1e17b6/bin/sh
を使用します