Docker
コンテナのデバッグ
サーチ…
構文
- ドッカーの統計情報[オプション] [コンテナ...]
- ドッカーログ[オプション]コンテナ
- docker top [オプション]コンテナ[psオプション]
実行中のコンテナに入る
コンテナ内で操作を実行するには、 docker exec
コマンドを使用します。コンテナ内ですべてのコマンドが実行されるため、これは「コンテナに入る」と呼ばれることがあります。
docker exec -it container_id bash
または
docker exec -it container_id /bin/sh
そして、実行中のコンテナにシェルがあります。たとえば、ディレクトリ内のファイルを一覧表示してから、コンテナを終了します。
docker exec container_id ls -la
-u flag
を使用すると、特定のユーザー(たとえば、 uid=1013
、 gid=1023
のコンテナを入力できます。
docker exec -it -u 1013:1023 container_id ls -la
uidとgidはコンテナ内に存在する必要はありませんが、コマンドでエラーが発生する可能性があります。コンテナを起動してすぐに何かをチェックするために内部に入る場合は、
docker run...; docker exec -it $(docker ps -lq) bash
コマンドdocker ps -lq
は、最後に-lq
れたコンテナ(l-in -lq
)のIDのみを出力します。 (これは、あなたのコンテナでインタープリタを利用できるようにbashを持っていると仮定します。shやzshなどがあります)
リソースの使用状況を監視する
不正なアプリケーションを見つけるには、システムリソースの使用状況を調べるのが効率的です。この例は、コンテナの従来のtop
コマンドと同じです。
docker stats
特定のコンテナの統計に従うには、コマンドラインでそれらの一覧を表示します。
docker stats 7786807d8084 7786807d8085
Dockerの統計情報には、次の情報が表示されます。
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
7786807d8084 0.65% 1.33 GB / 3.95 GB 33.67% 142.2 MB / 57.79 MB 46.32 MB / 0 B
デフォルトでは、 docker stats
はコンテナのIDを表示しますが、これはあまり役に立ちません。コンテナの名前を表示したい場合は、
docker stats $(docker ps --format '{{.Names}}')
コンテナ内のプロセスの監視
システムリソースの使用状況を調べることは、実行中のアプリケーションで問題を絞り込むための効率的な方法です。この例は、コンテナの伝統的なps
コマンドと同等です。
docker top 7786807d8084
出力のフォーマットをフィルタするには、コマンドラインでps
オプションを追加します。
docker top 7786807d8084 faux
または、潜在的に危険なプラクティスであるルートとして実行中のプロセスのリストを取得するには、次のようにします。
docker top 7786807d8084 -u root
docker top
コマンドは、シェルやps
コマンドを使用せずに最小限のコンテナをトラブルシューティングする際に特に役立ちます。
実行中のコンテナにアタッチする
「コンテナへの接続」は、コンテナ(およびその中の任意のプログラム)が実行されているコンテキスト内でターミナルセッションを開始する行為です。これは主にデバッグ目的で使用されますが、コンテナ内で実行されているプログラムに特定のデータを渡す必要がある場合にも必要になる可能性があります。
attach
コマンドは、これを行うために使用されます。それはこの構文を持っています:
docker attach <container>
<container>
はコンテナIDまたはコンテナ名のいずれかになります。例えば:
docker attach c8a9cf1a1fa8
または:
docker attach graceful_hopper
あなたのユーザとドッカーがどのように設定されているかによって、上記のコマンドをsudo
する必要があるかもしれません。
注:Attachでは、一度に1つのシェルセッションのみをコンテナにアタッチすることができます。
警告: すべてのキーボード入力はコンテナに転送されます。 Ctrl + cを押すとあなたのコンテナが死ぬでしょう 。
添付されたコンテナから切り離すには、 Ctrl-p 、 Ctrl-qを順に押します
複数のシェルセッションをコンテナに接続するには、 exec
を使用します。コンテナIDの使用:
docker exec -i -t c8a9cf1a1fa8 /bin/bash
コンテナの名前を使用する:
docker exec -i -t graceful_hopper /bin/bash
exec
はコンテナ内のプログラムを実行します。この場合、 /bin/bash
(おそらくコンテナが持つシェルです)。 -i
は対話型セッションを表し、 -t
は擬似TTYを割り当てます。
注意: アタッチとは異なり、 Ctrl + cを押すと対話的に実行されている間だけexec 'dコマンドが終了します。
ログの印刷
ログの後には、ライブ実行中のアプリケーションをデバッグするために、あまり介入しない方法があります。この例では、コンテナー7786807d8084
の従来のtail -f some-application.log
の動作を再現してい7786807d8084
。
docker logs --follow --tail 10 7786807d8084
このコマンドは、基本的にコンテナプロセス(pid 1のプロセス)の標準出力を表示します。
あなたのログがネイティブにタイムスタンプが含まれていない場合は、追加することが--timestamps
フラグを。
停止したコンテナのログを見ることができます。
docker run ... ; docker logs $(docker ps -lq)
して失敗したコンテナを起動しdocker run ... ; docker logs $(docker ps -lq)
コンテナのIDまたは名前を見つける
docker ps -a
その後
docker logs container-id
または
docker logs containername
停止したコンテナのログを見ることができるため
Dockerコンテナプロセスのデバッグ
Dockerは、仮想マシンではなく、プロセスを実行するための素晴らしい方法です。したがって、ホスト上のプロセス(ルートなど)を検査するための適切な権限を持つユーザーとして、実行中のコンテナプロセスを調べるだけで、「コンテナ内の」プロセスをデバッグすることも可能です。例えば、単純なps
をrootとして実行することで、ホスト上のすべての "コンテナプロセス"をリストすることができます:
sudo ps aux
現在実行中のDockerコンテナがすべて出力に表示されます。
これは、コンテナ内で実行中のプロセスをデバッグするためのアプリケーション開発時に役立ちます。適切な権限を持つユーザーとして、strace、ltrace、gdbなどのコンテナプロセスで一般的なデバッグユーティリティを使用できます。