どうすればDockerコンテナーのシェルに入ることができますか?


1163

Dockerの使用を開始しています。WordPressの基本画像とdocker-composeを使用しています。

最初のビルド中に作成されたファイル/ディレクトリを検査するために、コンテナーの1つにSSH接続しようとしています。を実行しようとしましたがdocker-compose run containername ls -la、何も実行されませんでした。たとえそうであったとしても、1つのコマンドを実行するのではなく、ディレクトリ構造をたどることができるコンソールが必要です。Dockerでこれを行う正しい方法は何ですか?


したがって、答えはドッカー接続です。しかし、どうすればdocker-composeから取得できますか?
Andrew

3
docker exec askubuntu.com/a/543057/35816を使用します。使用してコンテナIDを取得docker ps
Mauricio Scheffer 2015年

26
sudo docker run -it --entrypoint /bin/bash <container_name>インタラクティブにコンテナに移動します。次に、コンテナを使用してファイルシステムを検査できますcd <path>
Sergei

回答:


1734

docker attachDockerコンテナに接続できますが、これはと実際には同じものではありません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
$

76
また、docker exec実行中のコンテナーでのみ機能します(それ以外の場合docker run -it --entrypoint /bin/bashも同様)。
L0j1k

59
あなたの便宜のために、-itの組み合わせである-i-tしている--interactive(それぞれ「STDINが装着されていない場合でも開いてください」)--tty(「擬似TTYを割り当てます」)。
AdrianFöder2017年

23
Alpine Linuxベースのコンテナーではbashがない可能性があるため、そうであれば、代わりにshを使用してください。
ロビングリーン

9
@ L0j1kそれはdocker run -it --entrypoint /bin/bash <imageid> --any --more --args、人々のために明確にするためです
Alexander Mills

2
@AlexanderMillsはい、さらに明確にするために、Dockerではなく--any --more --args、イメージとして定義されているものにフィードされCMDます(または、イメージがENTRYPOINTとno のみを定義している場合、CMDこれらのオプションは、/bin/bashここで指定したとおりにフィードされます)。したがって、たとえば、他のdocker runオプション(たとえば--net "host")はの前に置く必要があります<imageid>
L0j1k

302

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

docker exec -t -i container_name /bin/bash

または

docker exec -ti container_name /bin/bash

または

docker exec -ti container_name sh

Linuxコンテナーであると思いますか?
Peter Mortensen

5
/ bin / bashは必要ありませんでした
。bashが

6
私が好むdocker exec -itの代わりにdocker exec -t -i
VaTo

違いは何ですか@VaTo
AATHITH RAJENDRAN

@AATHITHRAJENDRANIは、2つのフラグを指定するのではなく、コマンドの短い形式を優先するだけです。これら2つのオプションを同じ引数-itに含めることができます。
VaTo

85

あなた自身の理由のために、本当に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

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


34

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

docker-compose execdocker-compose.ymlファイルごとにサービスの名前を取ります。

したがって、「web」サービス用のBashシェルを取得するには、次のようにします。

$ docker-compose exec web bash

docker-compose runコンテナがまだ存在しない場合も同様に機能します。
ポール

23

注意:この回答は、私が作成したツールを宣伝しています。

実行中の任意のコンテナーに「固定」できるコンテナー化された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クライアントを使用して)接続すると、「my-container」という名前のコンテナーでBashセッションが開始されます。

その他のポインタとドキュメントについては、https//github.com/jeroenpeeters/docker-sshを参照してください。


1
それはかなり甘いです。この方法で行うことの大きな利点は、完全に機能する端末が得られることです。「docker exec」アプローチを使用した場合、ターミナルのコンテンツをクリアできず、less実行するたびに警告が表示されていました。Jeroenのコンテナーを使用すると、これまでのところはるかに優れたエクスペリエンスが得られます。必ずドキュメントチェックしください。応答のサンプルコマンドは、もう有効ではないようです。
ラファウG.

1
それは素晴らしいツールです。JenkinsパイプラインDockerエージェントとして使用する方法を知っていますか?ジェンキンスがSCPでリモートホストにいくつかのファイルを転送し、SSHでそれらを実行することを望んでいます
ギルソン

21

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

winpty docker exec -it <container_id> sh

ほとんどの場合、すでにGit Bashがインストールされています。インストールしていない場合は、必ずインストールしてください。


1
Linux Dockerコンテナーを想定していますか?
Peter Mortensen、2018

1
docker exec -ti <container_id> cmdは適切に機能します
PBo

17

コンテナがすでに終了している場合(何らかのエラーが原因である可能性があります)、次のようにすることができます

$ 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を指定したため、シェルを終了するとコンテナーが削除されます。


16

場合によっては、画像をアルパインベースにすることができます。この場合、それは投げます:

OCIランタイムexecが失敗しました:execが失敗しました:container_linux.go:348:コンテナープロセスを開始すると、「exec:\ "bash \":実行ファイルが$ PATHに見つかりません」:不明

そのため/bin/bash存在しません。これの代わりにあなたは使うべきです:

docker exec -it 9f7d99aa6625 ash

または

docker exec -it 9f7d99aa6625 sh

15

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

sudo docker exec -i -t (container ID) bash

12

Windowsコンテナーでcmdに接続するには、次を使用します

docker exec -it d8c25fde2769 cmd

ここで、d8c25fde2769はコンテナーIDです。


11

簡単です!

すべての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

11

ファイルを検査するには、を実行docker run -it <image> /bin/shして対話型端末を取得します。画像のリストはで取得できますdocker imagesdocker execこのソリューションとは逆に、イメージが開始しない(または実行直後に終了する)場合にも機能します。


Linux Dockerイメージを想定していますか?
Peter Mortensen

10

GOINSIDE SOLUTION

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コンテナのターミナルサイズに関する長年の問題も解決します。あなたがそれに直面した場合、これは非常に迷惑です。

また、リンククリックすると、Dockerコンテナー名のコマンド補完も表示されます。


1
ありがとう。少なくともbashが既に含まれている画像では、これは魅力のように機能します。高山基づく画像のための作業が、しかし、具体/灰等SH用に書かれた異なる機能を固定することができないかもしれない
のGaurav Bhaskar

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

またはシェルによっては、

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

コマンドを使用してコンテナIDを取得できますdocker ps

-i =インタラクティブ

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


8

コンテナーのターミナルに簡単にアクセスできるターミナル関数を作成しました。多分それはあなたたちにも役立つでしょう:

したがって、結果は次のように入力する代わりに、

docker exec -it [container_id] /bin/bash

あなたは書くでしょう:

dbash [container_id]

以下を〜/ .bash_profile(またはあなたのために機能する他のもの)に入れて、新しいターミナルウィンドウを開いてショートカットを楽しんでください:

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

7

オプション-tiを渡すことにより、Dockerコンテナー内のターミナルと対話できます

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

-tは端末を表します-iはインタラクティブを表します


6

docker exec間違いなくソリューションになります。質問に答える簡単な方法は、Docker内のディレクトリをローカルシステムのディレクトリにマウントすることです。

ローカルパスの変更を即座に確認できるようにします。

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

1
コマンドは、実際にはホストのディレクトリをコンテナにマウントしています。
Demonbane

うん!別のディレクトリにバックアップを作成し、ボリュームをマウントしてから、マウントされたフォルダにバックアップを移動します。
Pratik

6

使用する:

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

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

このGUIでも、コンテナログと多くのコンテナ情報([設定]タブ)を確認できます。

メニューからKitematicを選択します

実行をクリックします


2

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

ip
route
netstat
ps
...

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

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

  • 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

別のオプションはnsenterを使用することです

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

2
にはいくつかの問題がありnsenterます。1つ目は、Dockerホストに物理的にアクセスする必要があることです。これは、規定されていません(リモートのdocker APIを使用している可能性があります)。また、nsenterDockerを導入することにより、Dockerが適用するいくつかのセキュリティおよびリソースの制限(環境に応じて、賛成または反対になる可能性があります)から免除されます。
larsks

1
nsenterの作者でさえ、最近使用するように言っていますdocker exec
L0j1k

1
@larsksはい、どちらにも独自の利点があります。たとえば、これはnsenterよりもnsenterの利点ですdocker execdocker exec私にはよりエレガントに見えます。
xuhdev

2
@ L0j1k混乱を少なくするために:あなたが参照した投稿はnsenterの作者ではなく、nsenterを実行するDockerイメージの作者によるものです。
xuhdev

1

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

docker-compose run container_name /bin/bash

コンテナー内では、Dockerfileで定義されているWORKDIRに移動します。作業ディレクトリは次の方法で変更できます

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

0

という実行中のコンテナで実行するには testするには、次のコマンドを使用します

コンテナにbashシェルがある場合

docker exec -it test /bin/bash

コンテナにbourneシェルがあり、ほとんどの場合それが存在する場合

docker run -it test /bin/sh

-3

docker-compose up(Docker4Drupal)の場合

docker-compose exec php bash

LinuxラップトップでDocker for Drupalを使用しています。コンテナーを実行した後、 ' docker-compose exec php bash'を使用してコンテナーに接続し、drushコマンドを実行できるようにします。それは私にとってはうまくいきます。

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