web-dev-qa-db-ja.com

Dockerコンテナのシェルに入るにはどうすればいいですか?

Dockerを使い始めました。私はWordPressの基本画像とdocker-composeを使っています。

私は最初のビルドの間に作成されたファイル/ディレクトリを調べるためにコンテナの1つにsshしようとしています。私はdocker-compose run containername ls -laを実行しようとしました、しかしそれは何もしませんでした。それがあったとしても、私はむしろ単一のコマンドを実行するよりむしろ私がディレクトリ構造を横断することができるコンソールを持っているほうがいいです。 Dockerでこれを行うための正しい方法は何ですか?

809
Andrew

docker attachを使用するとDockerコンテナに接続できますが、これはsshと実際には同じではありません。たとえば、コンテナがWebサーバを実行している場合、docker attachはおそらくあなたをWebサーバプロセスの stdout に接続します。それは必ずしもあなたにシェルを与えるわけではありません。

docker execコマンドはおそらくあなたが探しているものです。これにより、既存のコンテナ内で任意のコマンドを実行できます。例えば:

docker exec -it <mycontainer> bash

もちろん、あなたが実行しているどんなコマンドでもコンテナファイルシステムに存在しなければなりません。

上記のコマンドの<mycontainer>は、ターゲットコンテナの名前またはIDです。 docker composeを使っているかどうかは関係ありません。 docker psを実行して、ID(最初の列に表示される16進文字列)または名前(最後の列に表示される)のいずれかを使用するだけです。例えば、

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

走れる:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope Host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope Host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

私は実行することによって同じことを達成することができます:

$ docker exec -it d2d4a89aaee9 ip addr

同様に、コンテナ内でシェルを起動することもできます。

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$
1143
larsks

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

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

あなた自身の理由で、あなたは本当にSSHを使いたいのです。それは数ステップかかりますが、それはすることができます。これを設定するためにコンテナ内で実行するコマンドは次のとおりです。

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --Shell /bin/bash --groups Sudo username ## includes 'Sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

SSHクライアントへのX11転送を使用して、グラフィカルアプリケーション(コンテナにインストールされている場合)を実行することもできます。

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

ここにいくつかの関連リソースがあります:

67
nobar

Notice :この答えは私が書いたツールを宣伝するものです。

実行中のコンテナに「固執」できるコンテナ化されたSSHサーバを作成しました。この方法であなたはすべてのコンテナでコンポジションを作成することができます。唯一の要件は、コンテナーにBashがあることです。

次の例では、 'my-container'という名前のコンテナに接続されたSSHサーバーを起動します。

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

このSSHサービスに接続すると(選択したSSHクライアントを使用して)Bashセッションが 'my-container'という名前のコンテナーで開始されます。

より多くのポインターおよびドキュメンテーションについては見なさい: https://github.com/jeroenpeeters/docker-ssh

19
Jeroen Peeters

このコマンドを使用してDockerコンテナにSSHで接続します。

Sudo docker exec -i -t (container ID) bash
14
Tjs

私のようにDocker Compose固有の答えを探しているのであれば、生成されたコンテナーIDを調べる必要なしに簡単な方法を提供します。

docker-compose execは、docker-compose.ymlファイルに従ってサービスの名前を取ります。

だからあなたの 'ウェブ'サービスのためのBashシェルを手に入れるために、あなたはすることができます:

$ docker-compose exec web bash
14
bcmcfc

WindowsでDockerを使用していて、シェルからコンテナへのアクセスを取得したい場合は、次のようにします。

winpty docker exec -it <container_id> sh

たぶん、あなたはすでに Git Bash をインストールしています。 そうでない場合は、必ずインストールしてください。

11
Cosmin Ababei

場合によっては、あなたの画像はアルパインベースにすることができます。この場合それはスローされます:

OCI実行時実行に失敗しました:実行に失敗しました:container_linux.go:348:コンテナプロセスの開始により、 "exec:\" bash\":実行可能ファイルが $ PATHに見つかりません:不明

/bin/bashは存在しないからです。これの代わりにあなたは使うべきです:

docker exec -it 9f7d99aa6625 ash

または

docker exec -it 9f7d99aa6625 sh
7
Deoxyseia

簡単です

Dockerの画像をすべてリストします。

Sudo docker images

私のシステムでは、次のような出力が表示されました。

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

私のPCには2つのDockerイメージがあります。最初のものを走らせたいとしましょう。

Sudo docker run -i -t ubuntu:latest /bin/bash

これはあなたにコンテナの端末制御を与えるでしょう。これで、コンテナ内であらゆる種類のシェル操作を実行できます。 lsを実行すると、ファイルシステムのルートにあるすべてのフォルダが出力されます。

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
6
Patel Sunil

ゴーサイドソリューション

goinsideコマンドラインツールをインストールします。

Sudo npm install -g goinside

次のようにして、適切な大きさのターミナルでdockerコンテナの中に入ります。

goinside docker_container_name

古い答え

このスニペットを~/.profileに入れました。

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

これだけでなく、誰でも実行中のコンテナの中に入ることができるようになります。

goinside containername

それはまた長命の 固定Dockerコンテナターミナルサイズに関する問題 も解決します。あなたがそれに直面した場合、これは非常に迷惑です。

また、 the link に従えば、docker containerの名前も補完できます。

5
Soorena

Windowsコンテナでcmdに接続するには、

docker exec -it d8c25fde2769 cmd

d8c25fde2769 はコンテナIDです。

5
Aqeel Qureshi

このコマンドを使います。

docker exec -it containerid /bin/bash
4
Admin Hack

つかいます:

docker attach <container name/id here>

もう1つの方法は、危険はありますが、attachを使用することです。 Ctrl + C セッションを終了するには、コンテナも停止します。何が起こっているのかを知りたいだけなら、docker logs -fを使用してください。

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)
4
rbrooker

docker execは間違いなく解決策になるでしょう。あなたが尋ねた質問に取り組む簡単な方法は Dockerの中のディレクトリをローカルシステムのディレクトリ にマウントすることです。

あなたは即座にローカルパスの変化を見ることができるように。

docker run -v /Users/<path>:/<container path> 
4
Pratik

ファイルを調べるには、docker run -it <image> /bin/bashを実行して対話型端末を入手してください。画像のリストはdocker imagesで取得できます。 docker execとは反対に、この解決法はイメージが起動しない(あるいは実行後すぐに終了する)場合にも機能します。

3
igo

DockerをKitematicと共にインストールしている場合は、GUIを使用できます。 DockerアイコンからKitematicを開き、Kitematicウィンドウでコンテナーを選択してexecアイコンをクリックします。

このGUIでも(設定タブで)コンテナログとコンテナ情報をたくさん見ることができます。

Select Kitematic from menu

Click on exec

3
Alireza Fattahi

コンテナがすでに終了している場合(おそらく何らかのエラーが原因で)、あなたはそうすることができます

$ docker run --rm -it --entrypoint /bin/ash image_name

または

$ docker run --rm -it --entrypoint /bin/sh image_name

または

$ docker run --rm -it --entrypoint /bin/bash image_name

新しいコンテナを作成してその中にシェルを入れる。 --rmを指定したので、シェルを終了するとコンテナは削除されます。

2
user674669

私の場合は、何らかの理由で、各コンテナ内のすべてのネットワーク関連情報を確認する必要があります。したがって、次のコマンドはコンテナ内で有効でなければなりません...

ip
route
netstat
ps
...

私はこれらすべての答えを調べましたが、どれも役に立ちませんでした。他のウェブサイトで情報を検索しました。英語で書かれていないので、ここにスーパーリンクを追加することはしません。だから私はちょうど私と同じ要件を持っている人々のための要約的な解決策をこの投稿に載せました。 

Light-testという名前の実行中のコンテナが1つあるとします。以下の手順に従ってください。 

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}。このコマンドは/var/run/docker/netns/xxxxのように返信されます。
  • それからln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx。ディレクトリが存在しない可能性があります。最初にmkdir /var/run/netnsを実行してください。
  • これでip netns exec xxxx ip addr showを実行してコンテナ内のネットワークの世界を探索できます。 

PS。 xxxxは常に最初のコマンドから受け取った値と同じです。そしてもちろん、他のコマンド、つまりip netns exec xxxx netstat -antp|grep 8080も有効です。 

1
Light.G

コンテナのターミナルに簡単にアクセスするためのターミナル関数を作成しました。たぶん、あなたにとっても役に立つでしょう:

結果は、入力する代わりに:

docker exec -it [container_id] /bin/bash

あなたが書きます:

dbash [container_id]

〜/ .bash_profile(またはあなたに合ったもの)に以下を入力し、新しいターミナルウィンドウを開いてショートカットをお楽しみください:

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}
1
Guy

オプション-tiを渡すことで、docker container内の端末と対話することができます。

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-tは端末を表します-iは対話型を表します

1
Alwin

Docker Composeを使用している場合は、これによってDockerコンテナ内に移動します。

docker-compose run container_name /bin/bash

コンテナーの中ではDockerfileで定義されたWORKDIRに連れて行くでしょう。次のようにして作業ディレクトリを変更できます。

WORKDIR directory_path # E.g  /usr/src -> container's path
0
Sivakumar

別の選択肢は nsenter を使うことです。

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

docker exec -it <Container-Id> /bin/bash 

シェルによっては、 

docker exec -it <Container-Id> /bin/sh

docker psコマンドで container-Id を取得できます。

-i = interactive

-t =擬似TTYを割り当てる

0