コンテナのいじり方
ここではコンテナの各種操作を体験してみましょう。
docker run - コンテナの起動
Docker コンテナの起動のためのコマンドです。
$ docker run alpine echo hello world!
hello world!
このコンテナはecho "Hello Docker"
を実行して終了しています。
この時、ローカルにイメージが存在しない場合、自動的にDocker Hubからイメージを取得した後、コンテナを起動します。
docker run
を実行するときに-i(キーボード入力可能)
と-t(ttyを確保する)
のオプションをつけると実行したターミナル上でコンテナを操作することができます。まとめて-it
で記述できます。
$ docker run -it alpine /bin/sh
# uname -a
Linux 568b642580eb 4.9.30-moby #1 SMP Wed May 31 05:30:34 UTC 2017 x86_64 Linux
# exit
exit
を入力すると、コンテナのターミナルを終了し、ホストターミナルに戻ります。
実行したsh
が終了したためコンテナも停止します。
docker ps - コンテナの稼働状況確認
現在稼働しているコンテナの一覧を見ることができます。先程動かしたwordpressのイメージが動いていますね。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcf000b1a41c wordpress:latest "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp wordpress_wordpress_1
8626ff5ac374 mysql:5.7 "docker-entrypoint..." 2 hours ago Up 2 hours 3306/tcp wordpress_db_1
-a
オプションをつけて実行すると、先程起動したコンテナが Exitedステータスで残っていることがわかります。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
568b642580eb alpine "/bin/sh" 2 minutes ago Exited (127) 19 seconds ago mystifying_kare
bcf000b1a41c wordpress:latest "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp wordpress_wordpress_1
8626ff5ac374 mysql:5.7 "docker-entrypoint..." 2 hours ago Up 2 hours 3306/tcp wordpress_db_1
dockerのコンテナは終了した後も明示的に指示しない限り残り続けます。これはコンテナに対して少しでも作業が行われたものはイメージとして利用する可能性があるため、残すように配慮されているものと思われます。実際に、Exitedなコンテナから新たにイメージを作成することもできます。
docker inspect - コンテナ情報の取得
すぐに終了するコンテナと、動き続けるコンテナ。どんな違いがあるのでしょう。
これはイメージの起動時に実行されるコマンドに違いが有ります。inspect
コマンドで確認してみましょう。
$ docker inspect alpine
[
...
"Config": {
"Hostname": "9ac68176ac52",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/sh\"]"
],
"ArgsEscaped": true,
"Image": "sha256:a96393421091145abdc0ce8f02691166ed0fe7f769b4dfc7f700b4b11d4a80df",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
...
]
$ docker inspect wordpress | grep CMD
"CMD [\"apache2-foreground\"]"
CMD
で指定されているものが違います。alpineがsh
であるのに対し、wordpressはapache
が指定されています。
apacheは起動後もhttpリクエストを待ち続けるのでコンテナは終了せずUPステータスになっているようです。
inspect
コマンドはコンテナだけでなく、dockerで扱われる様々なオブジェクトに対して利用できます。
volumeの詳細を確認する例は次のとおりです。
$ docker volume ls
DRIVER VOLUME NAME
local 24e8addfe7e17b0b32edb89a0110bc73fdb89b74ebe47b0fc5d0c755ec61e465
local wordpress_db-data
$ docker inspect wordpress_db-data
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/wordpress_db-data/_data",
"Name": "wordpress_db-data",
"Options": {},
"Scope": "local"
}
]
docker exec - コンテナの稼働状況確認
execを使うと起動中のコンテナに接続してコマンド操作が行えます。名前もしくはコンテナIDで接続できます。
どちらもdocker ps
コマンドで確認できます。
コンテナ内でps -el
を実行するとapache2が動作していることが実際に分かります。
$ docker exec -it wordpress_wordpress_1 /bin/bash
# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 78770 - ? 00:00:00 apache2
# exit
docker stop & rm - コンテナの終了と削除の仕方
サービス化したプロセスが動作するコンテナはそのまま動き続けます。終了するにはstop
コマンドを使います。
$ docker stop wordpress_wordpress_1
wordpress_wordpress_1
$ docker stop wordpress_db_1
wordpress_db_1
コンテナの状態を確認します。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
568b642580eb alpine "/bin/sh" About an hour ago Exited (137) 22 seconds ago mystifying_kare
bcf000b1a41c wordpress:latest "docker-entrypoint..." 3 hours ago Exited (0) 3 minutes ago wordpress_wordpress_1
8626ff5ac374 mysql:5.7 "docker-entrypoint..." 3 hours ago Exited (0) 10 seconds ago wordpress_db_1
残ったもので不要なコンテナはrm
コマンドで削除できます。稼働中のコンテナは削除できませんのであしからず。
$ docker rm mystifying_kare
mystifying_kare
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcf000b1a41c wordpress:latest "docker-entrypoint..." 3 hours ago Exited (0) 9 minutes ago wordpress_wordpress_1
8626ff5ac374 mysql:5.7 "docker-entrypoint..." 3 hours ago Exited (0) 6 minutes ago wordpress_db_1
wordprssとmysqlのコンテナはもう少しとっておきましょう。
docker system prune - お掃除の仕方
dockerはその性質上、知らない間に色々なデータを残します。意外とリソースに優しくありません。
どれだけリソースを消費しているかdocker system df
コマンドで確認しましょう。
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 2 4.87GB 4.304GB (88%)
Containers 2 0 187B 187B (100%)
Local Volumes 2 2 232.4MB 0B (0%)
最近のdockerさんは自信が管理するリソース(イメージ、コンテナ、ボリューム、ネットワーク)のうちどこからも参照されていないものを一気に削除できるコマンドdocker system prune
を用意してくれました!
$ docker system prune
WARNING! This will remove:
- all stopped containers
- all volumes not used by at least one container
- all networks not used by at least one container
- all dangling images
Are you sure you want to continue? [y/N] y
Deleted Containers:
bcf000b1a41cad0d98753f44bf83ba332ce0eae2f8336158c4bf96c40af10331
8626ff5ac374332c41a1e02df603736e873e394f74cbea6750ef9d628cc5da01
Deleted Volumes:
24e8addfe7e17b0b32edb89a0110bc73fdb89b74ebe47b0fc5d0c755ec61e465
wordpress_db-data
Deleted Networks:
wordpress_flat-network
Total reclaimed space: 232.4MB
これはうれしい機能です!まめに実行しておいてください。