GNU/Linux >> Linux の 問題 >  >> Linux

Docker コンテナのファイル システムの探索

ここにいくつかの異なる方法があります...

A) docker exec を使用 (最も簡単)

Docker バージョン 1.3 以降はコマンド exec をサポートします nsenter と同様に動作します .このコマンドは、既に実行中のコンテナーで新しいプロセスを実行できます (コンテナーには PID 1 プロセスが既に実行されている必要があります)。 /bin/bash を実行できます コンテナの状態を調べる:

docker exec -t -i mycontainer /bin/bash

Docker コマンド ライン ドキュメントを参照してください

B) スナップショットの使用

コンテナ ファイルシステムは次の方法で評価できます:

# find ID of your running container:
docker ps

# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot

# explore this filesystem using bash (for example)
docker run -t -i mysnapshot /bin/bash

このようにして、実行中のコンテナのファイルシステムを正確な時点で評価できます。コンテナはまだ実行中です。将来の変更は含まれていません。

後でスナップショットを削除できます (実行中のコンテナーのファイルシステムは影響を受けません!):

docker rmi mysnapshot

C) ssh を使用する

継続的なアクセスが必要な場合は、コンテナーに sshd をインストールして sshd デーモンを実行できます。

 docker run -d -p 22 mysnapshot /usr/sbin/sshd -D
 
 # you need to find out which port to connect:
 docker ps

このようにして、ssh を使用してアプリを実行できます (必要なものを接続して実行します)。

D) nsenter を使用

nsenter を使用 、Docker コンテナーで SSHd を実行する必要がない理由を参照してください

<ブロック引用>

短いバージョン:nsenter を使用すると、コンテナーが SSH や特殊目的のデーモンを実行していなくても、シェルを既存のコンテナーに入れることができます


更新:探索中!

このコマンドを使用すると、実行中の Docker コンテナを調べることができます :

docker exec -it name-of-container bash

docker-compose でこれに相当するものは次のようになります:

docker-compose exec web bash

(この場合、web はサービス名であり、デフォルトで tty があります。)

中に入ったら:

ls -lsa

または次のようなその他の bash コマンド:

cd ..

このコマンドを使用すると、Docker イメージを探索できます。 :

docker run --rm -it --entrypoint=/bin/bash name-of-image

中に入ったら:

ls -lsa

または次のようなその他の bash コマンド:

cd ..

-it Interactive の略です... と tty.

このコマンドにより、実行中の Docker コンテナまたはイメージを検査できるはずです :

docker inspect name-of-container-or-image

これを実行して、bash が存在するかどうかを調べることができます。 または sh そこで。 json の戻り値でエントリポイントまたは cmd を探します。

注: この回答はcommenツールが存在することに依存していますが、 bash がない場合 シェルまたは ls のような一般的なツール Dockerfile にアクセスできる場合は、最初にレイヤーに追加できます :アルパインの例:

RUN apk add --no-cache bash

Dockerfile にアクセスできない場合 次に、新しく作成されたコンテナーからファイルをコピーし、次のようにしてファイルを調べます。

docker create <image>  # returns container ID the container is never started.
docker cp <container ID>:<source_path> <destination_path>
docker rm <container ID>
cd <destination_path> && ls -lsah

docker exec のドキュメントを参照してください

docker-compose exec ドキュメントを参照してください

docker inspect ドキュメントを参照してください

docker create のドキュメントを参照してください


コンテナーが停止しているか、シェルがない場合 (例:hello-world インストールガイドに記載されているか、alpine 以外 traefik )、おそらくこれがファイルシステムを探索する唯一の可能な方法です。

コンテナのファイルシステムを tar ファイルにアーカイブできます:

docker export adoring_kowalevski > contents.tar

またはファイルをリストします:

docker export adoring_kowalevski | tar t

イメージによっては、時間とディスク容量がかかる場合があることに注意してください。


Linux
  1. スーパーブロック、iノード、Dentry、およびファイル?

  2. Awkからファイルをキャットする方法は?

  3. Dockerイメージからファイルを抽出しますか?

  1. Dockerの概要

  2. Dockerコンテナに単一のファイルをマウントまたはシンボリックリンクする方法

  3. CWPファイルシステムロック

  1. (コンテナ内で)rootにノーと言ってください

  2. ホスト ポートを Docker コンテナに転送する

  3. Docker 内の Docker はボリュームをマウントできません