Dockerを使い始めました。私はWordPressの基本画像とdocker-composeを使っています。
私は最初のビルドの間に作成されたファイル/ディレクトリを調べるためにコンテナの1つにsshしようとしています。私はdocker-compose run containername ls -la
を実行しようとしました、しかしそれは何もしませんでした。それがあったとしても、私はむしろ単一のコマンドを実行するよりむしろ私がディレクトリ構造を横断することができるコンソールを持っているほうがいいです。 Dockerでこれを行うための正しい方法は何ですか?
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
$
実行中のコンテナーにぶつかるには、次のように入力します。
docker exec -t -i container_name /bin/bash
あなた自身の理由で、あなたは本当に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
ここにいくつかの関連リソースがあります:
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
このコマンドを使用してDockerコンテナにSSHで接続します。
Sudo docker exec -i -t (container ID) bash
私のようにDocker Compose固有の答えを探しているのであれば、生成されたコンテナーIDを調べる必要なしに簡単な方法を提供します。
docker-compose exec
は、docker-compose.yml
ファイルに従ってサービスの名前を取ります。
だからあなたの 'ウェブ'サービスのためのBashシェルを手に入れるために、あなたはすることができます:
$ docker-compose exec web bash
WindowsでDockerを使用していて、シェルからコンテナへのアクセスを取得したい場合は、次のようにします。
winpty docker exec -it <container_id> sh
たぶん、あなたはすでに Git Bash をインストールしています。 そうでない場合は、必ずインストールしてください。
場合によっては、あなたの画像はアルパインベースにすることができます。この場合それはスローされます:
OCI実行時実行に失敗しました:実行に失敗しました:container_linux.go:348:コンテナプロセスの開始により、 "exec:\" bash\":実行可能ファイルが $ PATHに見つかりません:不明
/bin/bash
は存在しないからです。これの代わりにあなたは使うべきです:
docker exec -it 9f7d99aa6625 ash
または
docker exec -it 9f7d99aa6625 sh
簡単です !
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
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の名前も補完できます。
Windowsコンテナでcmdに接続するには、
docker exec -it d8c25fde2769 cmd
d8c25fde2769 はコンテナIDです。
このコマンドを使います。
docker exec -it containerid /bin/bash
つかいます:
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)
docker exec
は間違いなく解決策になるでしょう。あなたが尋ねた質問に取り組む簡単な方法は Dockerの中のディレクトリをローカルシステムのディレクトリ にマウントすることです。
あなたは即座にローカルパスの変化を見ることができるように。
docker run -v /Users/<path>:/<container path>
ファイルを調べるには、docker run -it <image> /bin/bash
を実行して対話型端末を入手してください。画像のリストはdocker images
で取得できます。 docker exec
とは反対に、この解決法はイメージが起動しない(あるいは実行後すぐに終了する)場合にも機能します。
コンテナがすでに終了している場合(おそらく何らかのエラーが原因で)、あなたはそうすることができます
$ 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を指定したので、シェルを終了するとコンテナは削除されます。
私の場合は、何らかの理由で、各コンテナ内のすべてのネットワーク関連情報を確認する必要があります。したがって、次のコマンドはコンテナ内で有効でなければなりません...
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
も有効です。
コンテナのターミナルに簡単にアクセスするためのターミナル関数を作成しました。たぶん、あなたにとっても役に立つでしょう:
結果は、入力する代わりに:
docker exec -it [container_id] /bin/bash
あなたが書きます:
dbash [container_id]
〜/ .bash_profile(またはあなたに合ったもの)に以下を入力し、新しいターミナルウィンドウを開いてショートカットをお楽しみください:
#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}
オプション-tiを渡すことで、docker container内の端末と対話することができます。
docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu
-tは端末を表します-iは対話型を表します
Docker Composeを使用している場合は、これによってDockerコンテナ内に移動します。
docker-compose run container_name /bin/bash
コンテナーの中ではDockerfileで定義されたWORKDIRに連れて行くでしょう。次のようにして作業ディレクトリを変更できます。
WORKDIR directory_path # E.g /usr/src -> container's path
別の選択肢は nsenter を使うことです。
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
docker exec -it <Container-Id> /bin/bash
シェルによっては、
docker exec -it <Container-Id> /bin/sh
docker ps
コマンドで container-Id を取得できます。
-i
= interactive
-t
=擬似TTYを割り当てる