コンテナに対して適用できるDockerコマンドを25個紹介：その1

このチュートリアルでは、**コンテナ**に対して適用できる25の**Docker**コマンドを簡単にデモします。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/docker-container-centric-commands-for-beginners-part-1_594561)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#Bash エイリアス
dockerコンテナのコマンドは25個あり、それらの単語を繰り返し入力したくありません。そのため、エイリアスが必要です。

提案:

alias dock='docker container'

私にとってはdoccよりも入力しやすいです。

これは論理的に他のエイリアスとの整合性を取ることができます。

```
alias docv='docker volume'

alias doci='docker inspect'

alias docm='docker image'

alias psa='docker ps -a'

alias d='docker '
```

#Docker Pull Alpine:3.8
すでにAlpine 3.8のDockerイメージを持っている場合は、ここで何もする必要はありません。

それ以外の場合は、シェルで以下のように入力してください。

```
docker pull alpine:3.8
```

Alpineのイメージをコンピュータにダウンロードします。

#Dockerコンテナ:作成と実行
コンテナを作成して、25個のコマンドを適用できるようにしてみましょう。

実行中のコンテナを作成する方法はいくつかありますが、ここでは create and run を使います。

構文:

>docker container run [options] IMAGE [command] [arg...]

```
docker container run -d --name mycontain alpine:3.8 sleep 3600
```

Dockerは、そのコンテナに対して生成した64文字のランダムなIDを表示します。

```
docker ps -a
```

これで実行中のコンテナができました。

#Dockerコンテナの実行
コンテナの中に入って、その内部を探ることができます。

```
docker exec -it your-12-character-container-id  /bin/sh
```

it オプションは 2 つのオプションを指定します。

- -i ... 対話的な docker exec にします。
- -t ... で作業するための疑似ターミナル/シェルコンソールを与えてください。
- /bin/sh は bash を実行するように指定します。


表示されている / # はコンテナシェルのプロンプトです。通常のシェルと同じように使います。

シェルを使用するには、以下のコマンドを入力します。

exit は特定のシェルセッションを終了します。コンテナはまだ実行中です。

```
/ # ps

PID  USER  TIME  COMMAND

1 root  0:00 sleep 3600

6 root  0:00 /bin/sh

11 root  0:00 ps

/ # ll

/bin/sh: ll: not found

/ # ls

bin  etc  lib  mnt  root  sbin  sys  usr

dev  home  media  proc  run  srv  tmp  var

/ # echo text > textfile

/ # cat  textfile

text

/ # df -h

Filesystem  Size  Used Available Use% Mounted on

tmpfs  64.0M  0  64.0M  0% /dev

tmpfs  492.6M  0  492.6M  0% /sys/fs/cgroup

/dev/mapper/centos00-root

12.6G  5.3G  7.3G  42% /etc/resolv.conf

/dev/mapper/centos00-root

12.6G  5.3G  7.3G  42% /etc/hostname

/dev/mapper/centos00-root

12.6G  5.3G  7.3G  42% /etc/hosts

shm  64.0M  0  64.0M  0% /dev/shm

tmpfs  492.6M  0  492.6M  0% /proc/acpi

tmpfs  64.0M  0  64.0M  0% /proc/kcore

tmpfs  64.0M  0  64.0M  0% /proc/keys

tmpfs  64.0M  0  64.0M  0% /proc/timer_list

tmpfs  64.0M  0  64.0M  0% /proc/timer_stats

tmpfs  64.0M  0  64.0M  0% /proc/sched_debug

tmpfs  492.6M  0  492.6M  0% /proc/scsi

tmpfs  492.6M  0  492.6M  0% /sys/firmware

/ # exit
```

#Dockerコンテナの一時停止、一時停止解除
コンテナーを一時的に停止する必要がある場合は、それを行うことができます。
Dockerはコンテナ内のプロセスを一時停止するためにcgroupsのフリーザー機能を使用します。
コンテナ内のプロセスは認識しておらず、この一時停止をキャプチャ/防止することができません。
同様に、プロセスはunpauseを使用して再び起動します - プロセスは一時停止されたことを認識していません。

実行してください。

```
docker ps -a
```

コンテナが実行中/稼働中であることを確認します。

```
docker container pause your-12-character-container-id

docker ps -a
```

期待される出力 .

```
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

89187919f955  alpine:3.8  "sleep 3600"  49 seconds ago  Up 48 seconds (Paused)  mycontain
```

コンテナが（一時停止）であることに注意してください

残念ながら、一時停止中のコンテナに入って見て回ることはできません。このようなエラーが出ます。

デーモンからのエラー応答です。コンテナ 89187919f955 が一時停止しています。

ここで見るべきものは何もありません - 一時停止中のコンテナはCPUサイクルを使用していません。

一時停止を解除します。

```
docker container unpause your-12-character-container-id
```

実行

```
docker ps -a
```

ステータスが再び稼働していることを確認します。

```
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

89187919f955  alpine:3.8  "sleep 3600"  3 minutes ago  Up 3 minutes  mycontain
```

一時停止と一時停止解除コマンドにはオプションがありません。しかし、複数のコンテナを一度に一時停止したり、一時停止解除したりすることはできます。
例えば、

docker container pause cont1 apache2 php42 othercont and-so-on


#Dockerコンテナの起動、停止、再起動、イベント
これらのコマンドが何をするかを表示するには、次のように入力します。

別のシェルセッションでdockerのイベントを表示するようになりました。これでDockerのイベントが発生したときに表示されるようになりました。

元の最初のシェルに戻ります。

```
docker container stop 89187919f955
```

停止するまでに10秒かかるので注意してください。

docker ps -aを実行すると、そのステータスが表示されます。

イベントシェルに戻ります。出力を観察してください。

期待される出力

```
2018-11-15T10:24:09.584676893+02:00 container kill 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (image=alpine:3.8, name=mycontain, signal=15)

2018-11-15T10:24:19.605895426+02:00 container kill 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (image=alpine:3.8, name=mycontain, signal=9)

2018-11-15T10:24:19.758338864+02:00 container die 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (exitCode=137, image=alpine:3.8, name=mycontain)

2018-11-15T10:24:19.854403805+02:00 network disconnect 4cdddf0dfbaa8d697920bc6e387c9306941d680b054e9026fc52d3dd763cd05a (container=89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1, name=bridge, type=bridge)

2018-11-15T10:24:19.904432478+02:00 container stop 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (image=alpine:3.8, name=mycontain)
```

signal 15 終了が送信され、これにより、コンテナにクリーンシャットダウンルーチンを実行する機会が与えられます。

10秒後、まだシャットダウン中であれば、即座に強制的に強制終了signal9で強制終了されます。150 ミリ秒後に終了します。

CTRL-cを押して、このイベント表示を中断します。以上で終了です。

元のシェルに戻ります。

```
docker container restart your-12-character-container-id
```

docker ps -aを実行すると、そのステータスが表示されます。

#Dockerコンテナの停止 --time 0
開発に忙しい中、この10秒を待つ忍耐力がありません。(おそらく私のシャットダウンクリーンアップルーチンがまだ書かれていないのでしょう。)

そのため、数日間はコンテナをすぐに停止させます。

コンテナはまだ動いています。

イベントシェルに切り替えます。

docker のイベントを再度実行して、異なるイベントを観測できるようにします。

元のシェルに戻ります。

```
docker container stop --time 0 your-12-character-container-id
```

すぐに停止することに注意してください。

イベントシェルに切り替えます。

期待される出力 .

```
2018-11-15T10:39:40.364765468+02:00 container kill 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (image=alpine:3.8, name=mycontain, signal=15)

2018-11-15T10:39:40.380549365+02:00 container kill 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (image=alpine:3.8, name=mycontain, signal=9)

2018-11-15T10:39:40.524409344+02:00 container die 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (exitCode=137, image=alpine:3.8, name=mycontain)

2018-11-15T10:39:40.613037711+02:00 network disconnect 4cdddf0dfbaa8d697920bc6e387c9306941d680b054e9026fc52d3dd763cd05a (container=89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1, name=bridge, type=bridge)

2018-11-15T10:39:40.661786770+02:00 container stop 89187919f9554894a7304f772631d48a894c609daf333eadbd53f55f8555b0a1 (image=alpine:3.8, name=mycontain)
```

terminate 15信号の15秒後にforcefull kill 9信号が送信されていることに注意してください。

本番環境では絶対にこの --time 0 を使用しないでください。これはデータの破損を保証します。

しかし、開発では学習やプログラミングのサイクルを早めることができます。

#DockerコンテナのKill
実行中の Linux プロセスに送ることができる可能性のあるシグナルの長いリストがあります。

[https://en.wikipedia.org/wiki/Signal_(IPC)](https://en.wikipedia.org/wiki/Signal_(IPC)?spm=a2c65.11461447.0.0.6f382b28si12Au)

これでイベントシェルコンソールの使い方がわかりました。

これを使って以下のテストを行います。

```
docker container kill --signal 15 your-12-character-container-id
```

様子を見ます。

```
docker container kill --signal 15 your-12-character-container-id
```

様子を見ます。

```
docker container kill --signal 15 your-12-character-container-id
```

様子を見ます。

```
docker container kill --signal 9 your-12-character-container-id
```

様子を見ます。

signal１５はそのsignalだけを送信することに注意してください。私たちの単純なコンテナは、きれいにシャットダウンする方法を知らないので、それを無視するだけです。

signal9はコンテナを即座にkillします。

Linux で利用可能なシグナルの完全なセットを送信するために docker container kill を使うことができます。

ポータブル番号(wikiページの表にある)か大文字のシグナル名を使うことができます。

残念ながら、私たちの単純な sleep 3600 コマンドはシグナルをキャッチして処理する方法を知らないので、無視します。

本当に必要なのは、これらのシグナルをキャッチするために特別に書かれたbashスクリプト、phpまたはpythonプログラムで、これがどのように動作するかを見ることです。

このチュートリアルでは、DockerコンテナがLinuxのシグナルをフルセットで受信できることを知っていただきたいと思います。

#Dockerコンテナのリネーム
構文は以下の通りです。

docker コンテナの rename OLD-CONTAINER-NAME NEW-OLD-CONTAINER-NAME

おそらく停止しているコンテナは1つだけになったでしょう。だから再起動してください。

```
docker container restart your-12-character-container-id

docker ps -a
```

期待される出力 .

```
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

89187919f955  alpine:3.8  "sleep 3600"  About an hour ago  Up 1 second  mycontain
```

コンテナの名前を変更してみましょう。

```
docker container rename mycontain new-contain-name
```

結果を観察します。

```
docker ps -a
```

期待される出力 .

```
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES

89187919f955  alpine:3.8  "sleep 3600"  About an hour ago  Up About a minute  new-contain-name
```

Dockerのソースコードから直接。

// コンテナ名を表すために許可されている文字数

const RestrictedNameChars = `[a-zA-Z0-9][a-zA-Z0-9_.-]`

コンテナ名は最初のブロックの文字から始まることに注意してください : [a-zA-Z0-9]

#Dockerコンテナのアップデート
このコマンドを使用して、1つまたは複数のコンテナのランタイムのCPUまたはRAMの制限を更新します。

設定するオプションの完全なリスト:

[https://docs.docker.com/engine/reference/commandline/container_update/#options](https://docs.docker.com/engine/reference/commandline/container_update/?spm=a2c65.11461447.0.0.6f382b28tKEAc1#options)

コンテナを再起動します。

```
docker container restart your-12-character-container-id
```

CpusetCpusの設定だけを表示します。

```
docker container inspect your-12-character-container-id  | grep "CpusetCpus"
```

このコンテナでは、CPU 番号 0 のみを使用できるようにしてみましょう。

```
docker container update --cpuset-cpus 0  your-12-character-container-id
```

その設定がうまくいったかどうかを確認してください。

```
docker container inspect your-12-character-container-id  | grep "CpusetCpus"
```

期待される出力 .

"CpusetCpus". "0",

成功しました。コンテナはCPU 0のみに制限されています。

docker container updateを使って、実行中のコンテナのそのウェブページ上のすべての設定を更新することができます。

#Docker Container ls
サーバー上のコンテナのリストを表示します。

実行してください。

```
docker container ls -a
```

その出力は次のものと同じです。

```
docker ps -a
```

a は、実行中と終了したすべてのコンテナを表示します。

この2つのコマンドは同じオプションを持っています。私はbash psaエイリアスを定義しているので、docker ps -aのみを使用しています。

#Docker Container cp
コンテナとローカルファイルシステムの間でファイル/フォルダをコピーする

コンテナにコピーする構文 .

docker cp [OPTIONS] HOST_SRC_PATH|- CONTAINER:DEST_PATH

ホストサーバー上にファイルを作成し、コンテナにコピーします。

```
echo text-to-copy > file-to-copy
```

ファイルをコンテナにコピーします。

```
docker container cp file-to-copy your-12-character-container-id:/
```

ディレクトリの内容を一覧表示します。

```
docker exec -it  your-12-character-container-id  ls /
```

ファイルがあることがわかります。

#Docker Container Stats と Top

コンテナのランタイム統計を表示します。以下を参照してください。

```
docker container stats --no-stream
```

```
CONTAINER ID  NAME  CPU %  MEM USAGE / LIMIT  MEM %  NET I/O  BLOCK I/O  PIDS

89187919f955  new-contain-name  0.00%  44KiB / 985.2MiB  0.00%  648B / 0B  1.41MB / 0B  0
```


この出力を以下と比較します。

```
docker container top your-12-character-container-id
```

期待される出力 .

```
UID  PID  PPID  C  STIME  TTY  TIME  CMD

root  4058  4040  0  12:31  ?  00:00:00  sleep 3600
```

私は docker container statsの方がずっと便利だと思います。

しかし、top の PID を使って通常の top コマンドを実行すれば、Linux ディストロ上で実行されているプロセスの通常の詳細を見つけることができます。

これらの PID のみを表示するように編集された出力。

```
Tasks: 114 total,  1 running, 113 sleeping,  0 stopped,  0 zombie

%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

MiB Mem :  985.219 total,  545.160 free,  126.871 used,  313.188 buff/cache

MiB Swap: 1499.996 total, 1499.996 free,  0.000 used.  688.348 avail Mem

PID USER  PR  NI  VIRT  RES  SHR S  %CPU %MEM  TIME+ COMMAND

4040 root  20  0  7.3m  3.3m  2.6m S  0.3  0:00.08 docker-containe

4058 root  20  0  1.5m  0.2m  0.2m S  0.0  0:00.04 sleep
```

#Dockerコンテナの差分
コンテナのファイルシステム上のファイルやディレクトリの変更を表示します。

そのファイルを数分前にコンテナにコピーしました。

diff はコンテナのファイルシステムへの変更を表示します。

```
docker container diff your-12-character-container-id
```

期待される出力 .

```
A /text-to-copy
```

動作します - 追加されたファイルが表示されます。

コンテナのファイルシステムに何度か変更を加えた場合は、より興味深い出力が表示されます。

#Dockerコンテナのログとアタッチ
- docker コンテナのログ ... コンテナのログを表示
- docker コンテナ アタッチ ... 標準入力STDIN、出力、エラーストリームにアタッチ


ここで、ログと、表示コンテナログを添付するさまざまな方法を学びます。

私たちは、検査するためのログラインを生成する別のコマンドを持つ新しいコンテナが必要です。

最初に私たちの最後のコンテナのステータスを決定するためにdockerのps -a -を行います。

status = exitedであれば、それで問題ありません。

そうでなければ実行してください。

```
docker container stop your-12-character-container-id
```

今、そのコンテナをプルーニング/削除します。

```
docker container prune -f
```

ここに新しいコンテナを実行するコマンドがあります - まだ実行しないでください。

```
docker container run -d --name mycontain alpine:3.8 /bin/sh -c 'for i in 1 2 3 4 5 6 7 8 9 10 ; do echo $i; sleep 5; done'
```

10 回ループし、その都度ループ回数をエコーし、5 秒間スリープさせた後に継続します。

これらのエコー出力はコンテナのログに書き込まれます。

エコー文とエコー文の間に 5 秒間スリープします。

2 番目のシェルセッションを開始します - 先ほどのイベントシェルを再利用することができます。

これら2つのコマンドを入力してください - エラーメッセージが表示されます - これでOKです。これらのコマンドを bash のコマンド履歴に残しておくと、キーボードの上矢印キーを使ってすぐに呼び出すことができます。

```
docker container logs --follow mycontain

docker container attach mycontain
```

元のシェルに戻ります。

実行

```
docker container run -d --name mycontain alpine:3.8 /bin/sh -c 'for i in 1 2 3 4 5 6 7 8 9 10 ; do echo $i; sleep 5; done'
```

あなたのコンテナは実行中で、5秒ごとに増加するカウンタをエコーして、コンテナログに書き込んでいます。

ここで、2 番目のシェルに切り替えます。

キーボードの上矢印を2回押してログを取得します。表示されたらエンターキーを押してください。

logs コマンドには echo された数値が表示されます。飽きたらCTRL-cを押してください。

キーボードの上矢印を2回押して、attachコマンドを取得します。それが表示されたらエンターキーを押します。

attach コマンドは echo'ed 番号を表示します。飽きたら CTRL-c を押してください。

問題点。添付ファイルの出力を表示しているときに CTRL-c キーを押すと、bash のループ処理から抜け出すことができます: コンテナが終了します。

ログ出力を表示中に CTRL-c を実行しても、bash for loop から抜け出せません。

したがって、私は常にlogsコマンドを使用することを好みます。

ウェブサーバプロセスを実行している場合は、それをアタッチして CTRL-c を押すと、CTRL-c をウェブサーバプロセスに送信して停止させることができます。

もし、添付ファイルを作成する前にエコー番号が切れてしまった場合は、 再度実行することができます。最初からやり直してください...

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*