このチュートリアルでは、コンテナに対して適用できる25のDockerコマンドを簡単にデモします。
本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。
#Docker Container Inspect
https://docs.docker.com/engine/reference/commandline/container_inspect/#description より
docker container inspect : 1 つ以上のコンテナの詳細情報を表示します。
幸いにも停止しているコンテナもInspectできるので、あとは実行するだけです。
docker container inspect mycontain
このコンテナに適用されているすべての設定の長いリストが表示されます。
上部には現在の状態が表示されています:exited.
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
dead = falseであることに注意してください。これは、何か壊れたコンテナであることを示しています。終了したコンテナは再起動することができますが(上でやったように)、いつか死んだコンテナが出てきた場合、再起動できないと思います。
#Dockerコンテナのcommitとexport
- docker container commit - コンテナの変更点から新しいイメージを作成する
- docker container export - コンテナのファイルシステムを tar アーカイブとしてエクスポートする
この2つのコマンドは用途が異なります。
- commit: 新しいイメージを作成します。そして、このイメージをベースイメージとして使用して新しいコンテナを構築することができます。新しいコンテナは元のコンテナのクローンのようなものです。
- export: コンテナの内容を tar アーカイブファイルとして保存します。その後、任意の Linux シェルで tar を解凍してファイルの内容を調べることができます。元のコンテナは完全に消えてしまいました。私たちが持っているのはファイルシステムだけです: 環境変数もなく、「コンテナの実行状態」という概念もありません。
#概要デモ - Dockerコンテナコマンド
このチュートリアルでは、パート 1 とパート 2 で説明したいくつかの docker コンテナコマンドを使用します。
開発に追われている間に、同じ全体的なアプローチを使ってコンテナに小さな変更を加え、結果を観察することができます。
計画
フェーズ1:signals
- シンプルなbashシグナルトラップスクリプトを書く
- mytraps:demoイメージを作成するための短いDockerfileを書く
- run mytraps:demo image
- docker のログでエコー出力を監視する
- docker kill で TERM シグナルを送信 - 結果をログで確認
- mytraps:demoイメージを再実行
- docker kill で INT シグナルを送信 - 結果をログで確認
- mytraps:demoイメージを再実行
- dockerでコンテナにアタッチ
- ctrl-c キーを押す - ログの結果を見る
- mytraps:demoイメージを再実行
- docker kill で KILL シグナルを送信 - ログで結果を観察
フェーズ2:環境変数
- run mytraps:demo image
- docker のログでエコー出力を監視する
- 方法 1: docker exec で環境変数を変更する - 結果をログで確認する
- 方法 2: docker exec で環境変数を変更する - 結果をログで確認する
- docker kill で KILL シグナルを送信 - ログで結果を観察
- シンプルなbashシグナルトラップスクリプトを書く
ナノトラップ
そのremove-meのテキストを削除してください。Markdownは見出しがハッシュで始まるようにしなければならないので、スクリプトの最初の行は見出しとしてレンダリングされます。非常識で不条理ですが、真実です。
remove-me#!/bin/bash
function SIGINT_trap() {
echo . . . SIGINT signal caught
echo . . . doing SIGINT cleanup
exit
}
function SIGTERM_trap() {
echo . . . SIGTERM signal caught
echo . . . doing SIGTERM cleanup
exit
}
trap SIGINT_trap SIGINT
trap SIGTERM_trap SIGTERM
for i in `seq 1 50`; do
sleep 1
echo -n " . "
echo $i
done
exit 0
14行目と15行目は、受信したsignalに基づいて関連する関数を呼び出します。
- mytraps:demoイメージを作成するために短いDockerfileを書きます。
nano Dockerfile
Dockerfileの内容:
FROM alpine:3.8
ENV myvar original value
COPY traps /root/
RUN chmod +x /root/traps
CMD ["/bin/sh", "/root/traps"]
- 1行目: アルパイン3.8イメージを使用
- 2行目: myvar 環境変数を定義して値を与える
- 3行目: bash トラップスクリプトをコンテナ内の /root/ ディレクトリにコピーします。
- 4行目: トラップスクリプトを実行可能にする
- 5行目: コンテナの起動時にトラップスクリプトを実行するように定義します。
そのイメージを構築します。
docker build --tag mytraps:demo --file Dockerfile .
- コンテナのログを監視するために2つ目のシェルコンソールを準備
2つ目のシェルを起動し、実行します。
docker container logs mycontain -f
エラーが表示されます。つまり、コンテナーはまだ開始されていません。
このステップは、シェルの履歴にそのコマンドを取得することですので、我々はすぐにそれを得ることができます。以下のようになります。
- run mytraps:demo image
最初のシェル:
docker container run -d --name mycontain mytraps:demo
- docker のログでエコー出力を監視
2つ目のシェル:
上矢印キーを押して前のコマンドを取得し、ENTERを押します。bashスクリプトの出力が表示されます。
- docker kill経由でTERMシグナルを送る
最初のシェルで実行します。
docker container kill --signal 15 mycontain
- ログで結果を見る
2つ目のシェル:
期待される出力:
...
. 15
. 16
. 17
. 18
. 19
. . . SIGTERM signal caught
. . . doing SIGTERM cleanup
SIGTERM / 15 のシグナルをキャッチしました。 - スクリプトは SIGTERM のクリーンアップを行っています。
ログ出力も停止するようになったことに注意:シグナル処理機能を処理した後、コンテナは正常に終了しました。
テスト1が完了しました: signal TERM / 15の処理に成功しました。
- mytraps:demo imageを再実行します...signal割り込みテスト用
前に終了したコンテナを削除します。
最初のシェルで実行します。
docker container prune -f
コンテナを再起動します。
docker container run -d --name mycontain mytraps:demo
- docker のログでエコー出力を監視する
2つ目のシェル:
上矢印キーを押して前のコマンドを取得し、ENTERを押します。前と同じようにbashスクリプトの出力が表示されます。
- docker kill経由で割り込みsignalを送る
最初のシェルで実行します。
docker container kill --signal SIGINT mycontain
- ログで結果を見る
2つ目のシェル:
期待される出力 .
...
. 16
. 17
. 18
. 19
. 20
. . . SIGINT signal caught
. . . doing SIGINT cleanup
SIGINT信号が捕捉されました - スクリプトはSIGINTのクリーンアップを行っています。
シグナル処理機能を処理した後、コンテナは正常に終了しました。
テスト2完了: シグナルSIGINT / 2の処理に成功しました。
テスト3: シグナルをKILLする
- mytraps:demoイメージを再実行
前に終了したコンテナを削除します。
最初のシェルで実行します。
docker container prune -f
コンテナを再起動します。
docker container run -d --name mycontain mytraps:demo
- docker のログでエコー出力を監視する
2つ目のシェル:
上矢印キーを押して前のコマンドを取得し、ENTERを押します。前と同じようにbashスクリプトの出力が表示されます。
- docker kill経由で割り込みsignalを送る
最初のシェルで実行します。
docker container kill --signal SIGKILL mycontain
- ログで結果を見る
2つ目のシェル:
期待される出力 :
...
. 6
. 7
. 8
. 9
. 10
. 11
. 12
SIGKILL シグナルをキャッチできません - スクリプトはクリーンアップルーチンを実行できません。
ログ出力も停止していることに注意してください: コンテナは、KILL シグナルによって即座にKILL された後、UNSUCCessfully に終了しました。
テスト 3 が完了しました: シグナル SIGKILL / 2 の処理が成功しました。
重要なまとめ: コンテナ内で実行しているプロセスは適切なクリーンアップルーチンを持っていなければなりません。Dockerでは、Docker以前の世界と比べて、コンテナのシャットダウンと再起動を頻繁に行うことになります。そのため、コンテナが様々なシャットダウン方法を正しく処理できるようにすることが重要です。
これらの演習に基づいて、たった2つのシグナルを扱うだけでどれだけ簡単にテストできるかがわかります。
シェルで trap -l と入力すると、64種類のシグナルのリストが表示されます。あなたのプロセスは、受信可能なすべての値を扱うことができなければなりません。
docker container kill の名前が間違っています。
docker container signal - とすべきだったのですが、設定ファイルを再読するためだけにシグナルを送ることができるからです。すべてのシグナルが kill するわけではありません。
SIGUSR1とSIGUSR2を任意の目的に使用できます。アプリケーションにこれらの信号を送信し、KILLだけでなく、何かを意味することができます。
#Dockerコンテナの待ち時間
https://docs.docker.com/engine/reference/commandline/container_wait/ より
1つ以上のコンテナが停止するまでブロックし、その終了コードを印刷します。
これがどのように動作するかを調べるために、3つのコンテナを実行し、数秒スリープさせた後、固有の終了コードで終了させます。
以下を切り取ってシェルに貼り付けます。
docker container run -d --name mycontain1 mytraps:demo sh -c 'sleep 10;exit 1'
docker container run -d --name mycontain2 mytraps:demo sh -c 'sleep 15;exit 2'
docker container run -d --name mycontain3 mytraps:demo sh -c 'sleep 25;exit 3'
新しいシェルコンソールセッションを起動して実行します。
docker container wait mycontain1 mycontain2 mycontain3
コンテナのスリープ期間が終了すると、指定された終了コードで終了することに注意してください。
どのコンテナがどの終了コードで終了したかを示すものはありません。
どのコンテナがどの終了コードで終了したかを知る必要がある場合は、次のようにしてください。
docker ps -a
期待される出力 :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c7fe618e23b mytraps:demo "sh -c 'sleep 25;exi…" 40 seconds ago Exited (3) 14 seconds ago mycontain3
d4e1bb11e55c mytraps:demo "sh -c 'sleep 15;exi…" 43 seconds ago Exited (2) 27 seconds ago mycontain2
bee5cbf37052 mytraps:demo "sh -c 'sleep 10;exi…" 44 seconds ago Exited (1) 33 seconds ago mycontain1
この機能はあまり有効ではありませんが、いくつかのバッチコンテナを1時間以上実行している場合などに利用できるかもしれません。すべてが正常に完了することを期待しています。
数分おきに docker ps -a を実行する代わりに (ワークフローを考えていた場合のように)、新しいシェルで以下のコマンドを使用してコンテナを監視することができます。すべてのコンテナが終了すると、コマンドは再びプロンプトを表示します。
(以下のコマンドは出力されませんので、自分で試してみてください。)
以下のコマンドは出力されません。
docker ps -a --filter "name=mycontain1" --filter "name=mycontain2" --filter "name=mycontain3"
しかし、これは本当に長文になってしまいます。
すべてのコンテナは同じ画像を使うことに注意してください: mytraps:demo
docker ps -a --filter "ancestor=mytraps:demo"
ancestor filter: 与えられた画像を共有するコンテナをancestorとしてフィルタリングします。
以前よりもずっと短くなりました。
最短タイピングは
docker ps -a |grep mycontain
或いは
docker ps -a |grep mytraps
エイリアスmypsaを定義すると
alias mypsa='docker ps -a | grep ‘
を使用することができます。
mypsa traps
mypsa contain
#docker container port
ポートマッピングまたはコンテナの特定のマッピングを一覧表示します。
docker ps -aもポートマッピングを表示しています。そのため、ここではこのコマンドを調査するつもりはありません。
#チュートリアルクリーンアップ
プルーンで停止されたコンテナ:
docker container prune -f
docker image rm mytraps:demo
alpine:3.8の画像をよく使いました。今後も使うことがあると思いますので、削除しないことをお勧めします。
#まとめ
この2つのチュートリアルでは、25個のdockerコンテナコマンドのほぼ全てを使用しました。あなたは今、あなたのコンテナに対して適用することができますどのようなコマンドを理解しています。
あなたが最短時間でDockerの専門家になりたい場合は、私はあなたがすべてのDockerの機能を使用して、同様の小さな、迅速な(しかし、非常に有用な)演習を行うことをお勧めします。
アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ