docker
コマンドの中でもよく使うコマンドを実行例付きで20個集めました。
Dockerの状態を確認する
Dockerのバージョン情報を表示
docker --version
$ docker --version
Docker version 24.0.5, build ced0996
より詳細なバージョン情報が知りたい場合は、docker version
コマンドを使用します。
docker version
こちらはクライアントおよび現在接続しているサーバーのより詳細なバージョン情報を得られます。
$ docker version
Client:
Cloud integration: v1.0.35-desktop+001
Version: 24.0.5
API version: 1.43
Go version: go1.20.6
Git commit: ced0996
Built: Fri Jul 21 20:32:30 2023
OS/Arch: darwin/arm64
Context: desktop-linux
Server: Docker Desktop 4.22.1 (118664)
Engine:
Version: 24.0.5
API version: 1.43 (minimum version 1.12)
Go version: go1.20.6
Git commit: a61e2b4
Built: Fri Jul 21 20:35:38 2023
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.6.21
GitCommit: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc:
Version: 1.1.7
GitCommit: v1.1.7-0-g860f061
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Dockerの実行状態を確認
docker info
$ docker info
Client:
Version: 24.0.5
Context: desktop-linux
Debug Mode: false
・・・
WARNING: daemon is not using the default seccomp profile
イメージの操作
イメージの一覧表示
実行結果に表示されるREPOSITORY
がイメージ名、TAG
がタグ名です。
docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 22.04 a2f229f811bf 3 weeks ago 69.2MB
ubuntu 20.04 15c9d636cadd 4 weeks ago 65.7MB
イメージの検索
キーワードをイメージ名や説明に含むイメージを検索します。
docker search <キーワード>
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 18963 [OK]
unit Official build of NGINX Unit: Universal Web … 10 [OK]
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 114
イメージの検索はできますが、タグを検索することはできないため、Docker Hubで探してください。
イメージの取得
イメージ名またはイメージ名とタグ名を指定してイメージを取得します。
docker pull <イメージ名>[:タグ]
タグを省略するとデフォルトタグ(多くの場合はlatest
タグ)が取得されます。
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
db76c1f8aa17: Pull complete
Digest: sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
What's Next?
View summary of image vulnerabilities and recommendations → docker scout quickview ubuntu
latest
は取得タイミングによってバージョンが異なるため、基本的にはタグ(バージョン)を指定するのが推奨です。
$ docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
82d728d38b98: Pull complete
Digest: sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04
What's Next?
View summary of image vulnerabilities and recommendations → docker scout quickview ubuntu:20.04
過去に取得したlatest
タグのイメージを最新化する場合は再度docker pull
してください。
$ docker pull phpmyadmin/phpmyadmin
Using default tag: latest
latest: Pulling from phpmyadmin/phpmyadmin
faef57eae888: Pull complete
989a1d6c052e: Pull complete
0705c9c2f22d: Pull complete
621478e043ce: Pull complete
98246dcca987: Pull complete
bfed8c155cb6: Pull complete
7a7c2e908867: Pull complete
d176994b625c: Pull complete
2d8ace6a2716: Pull complete
c70df516383c: Pull complete
15e1b44fe4c7: Pull complete
65e50d44e95a: Pull complete
77f68910bc0a: Pull complete
605dd3a6e332: Pull complete
99ce27188f07: Pull complete
74d64e32c5d5: Pull complete
ef5fc9928b9f: Pull complete
163f3256e112: Pull complete
Digest: sha256:67ba2550fd004399ab0b95b64021a88ea544011e566a9a1995180a3decb6410d
Status: Downloaded newer image for phpmyadmin/phpmyadmin:latest
docker.io/phpmyadmin/phpmyadmin:latest
What's Next?
View summary of image vulnerabilities and recommendations → docker scout quickview phpmyadmin/phpmyadmin
イメージの削除
docker rmi <イメージ名 or イメージ名:タグ or イメージID>
タグなしは:latest
を指定しているのと同じです。
$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:dcba6daec718f547568c562956fa47e1b03673dd010fe6ee58ca806767031d1c
Deleted: sha256:b038788ddb222cb7d6025b411759e4f5abe9910486c8f98534ead97befd77dd7
Deleted: sha256:a7866053acacfefb68912a8916b67d6847c12b51949c6b8a5580c6609c08ae45
コンテナの操作
実行中のコンテナを一覧表示
実行中のコンテナのリストを表示します。
docker ps
一覧に表示されるCONTAINER ID
がコンテナIDで、NAMES
がコンテナ名です。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e44cfb7902 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp nginx01
すべてのコンテナを一覧表示
停止しているコンテナも表示したい場合は-a
オプションを使います。
docker ps -a
ステータス(STATUS
)で現在の状況を確認できます。Exited
になっている場合はすでに停止しているコンテナです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e44cfb7902 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:8080->80/tcp nginx01
21dc45864d5f busybox "sh" 29 minutes ago Exited (0) 29 minutes ago bold_volhard
コンテナの起動
docker run <イメージ名>[:<タグ名>]
docker run <イメージID>
$ docker run nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/09/03 03:46:40 [notice] 1#1: using the "epoll" event method
2023/09/03 03:46:40 [notice] 1#1: nginx/1.25.2
2023/09/03 03:46:40 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2023/09/03 03:46:40 [notice] 1#1: OS: Linux 5.15.49-linuxkit-pr
2023/09/03 03:46:40 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/09/03 03:46:40 [notice] 1#1: start worker processes
2023/09/03 03:46:40 [notice] 1#1: start worker process 29
2023/09/03 03:46:40 [notice] 1#1: start worker process 30
2023/09/03 03:46:40 [notice] 1#1: start worker process 31
2023/09/03 03:46:40 [notice] 1#1: start worker process 32
2023/09/03 03:46:40 [notice] 1#1: start worker process 33
後述の-d
オプションをつけないと制御が返ってこない点に注意が必要です。Ctrl+C
でコンテナを停止されることができます。
コンテナ名を指定して起動する
コンテナ名を指定しないと適当な名前で起動します。コンテナ名を指定したい場合は--name
オプションを使用します。
docker run --name <コンテナ名> <イメージ名>[:<タグ名>]
docker run --name <コンテナ名> <イメージID>
$ docker run -d --name web nginx
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2fa12b11da nginx "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 80/tcp web
NAMES
が指定したコンテナ名になっていることが確認できます。
すでに存在するコンテナ名を指定するとエラーになりますので、使用していないコンテナ名かどうかを確認するようにしましょう。
$ docker run -d --name web nginx
docker: Error response from daemon: Conflict. The container name "/web" is already in use by container "ce2fa12b11da0fcf214221c5cb4687ed48f5ac73e6e71586d2ddcee98202df7e". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
コンテナ名は実行中でも変更可能です。
# 起動中のコンテナのコンテナ名がwebになっていることを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2fa12b11da nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp web
# コンテナIDと新しいコンテナ名を指定してリネームする
$ docker rename ce2fa12b11da web01
# コンテナ名がweb01に変更されていることを確認する
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2fa12b11da nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp web01
ポートをマッピングしてコンテナを起動
docker run -p <ホスト側ポート番号>:<コンテナ側ポート番号> <イメージ名>[:<タグ名>]
docker run -p <ホスト側ポート番号>:<コンテナ側ポート番号> <イメージID>
nginx
イメージで80
ポートで公開されているポートを8080
ポートでアクセスするには以下のようにします。
# -pオプションなしで80ポートが公開されていることを確認する
$ docker run -d nginx
d9fdeb14dbdbf035e12e7e6d45a24acd84c9da8cf8b8dbadc71d19baeb510ab0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9fdeb14dbdb nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp zen_jepsen
# -pオプションをつけて8080ポートでアクセスできるようにする
$ docker run -d -p 8080:80 nginx
55378527d5381db7a3c50bc7a59ad2d8665499bee22f6a319d7e36ae44a08273
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55378527d538 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 0.0.0.0:8080->80/tcp great_lichterman
d9fdeb14dbdb nginx "/docker-entrypoint.…" 37 seconds ago Up 36 seconds 80/tcp zen_jepsen
# 実際にアクセスできることも確認する
$ curl http://localhost/
curl: (7) Failed to connect to localhost port 80 after 6 ms: Couldn't connect to server
$ curl http://localhost:8080/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
・・・
-p
オプションをつけるとSTATUS
の表示が0.0.0.0:8080->80/tcp
となり、ホスト側が8080
ポートでアクセスするとコンテナ側の80
ポートにフォワードする設定になっていることがわかります。
コンテナをバックグラウンド実行で起動する
docker run -d <イメージ名>[:<タグ名>]
docker run -d <イメージID>
$ docker run -d nginx
8e715a36735862e297ddc4cec19bb6c1ae96cd4f822e3f4cd915a0d183b87e59
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e715a367358 nginx "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 80/tcp pedantic_cohen
コンテナの停止
docker stop <コンテナID>
docker stop <コンテナ名>
# コンテナが起動していることを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2fa12b11da nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp web01
# コンテナを停止する
$ docker stop ce2
ce2
# コンテナがdocker psでの表示から消え、docker ps -aでのみ確認できるようになっていることを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2fa12b11da nginx "/docker-entrypoint.…" 32 minutes ago Exited (0) 7 seconds ago web01
コンテナの起動
docker start <コンテナID>
docker start <コンテナ名>
# 停止しているコンテナを確認する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e44cfb7902 nginx "/docker-entrypoint.…" 16 hours ago Exited (0) 58 minutes ago nginx01
# コンテナのコンテナIDの一部を指定してコンテナを起動
$ docker start 17e
17e
# コンテナが起動したことを確認する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e44cfb7902 nginx "/docker-entrypoint.…" 16 hours ago Up 14 seconds 0.0.0.0:8080->80/tcp nginx01
コンテナの削除
docker rm <コンテナID>
docker rm <コンテナ名>
# 停止しているコンテナのコンテナIDを確認する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e44cfb7902 nginx "/docker-entrypoint.…" 16 hours ago Exited (0) 2 seconds ago nginx01
# コンテナIDの一部を指定してコンテナを削除する
$ docker rm 17e
17e
# コンテナが削除されたことを確認する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
起動中のコンテナ内でコマンドを実行
docker exec -it
コマンドを使うとコンテナ内で任意のコマンドを実行できます。
docker exec -it <コンテナID> <コマンド>
docker exec -it <コンテナ名> <コマンド>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce2fa12b11da nginx "/docker-entrypoint.…" 39 minutes ago Up 3 seconds 80/tcp web01
# コンテナで「ls -l /var/log/nginx」を実行する
$ docker exec -it web01 ls -l /var/log/nginx
total 0
lrwxrwxrwx 1 root root 11 Aug 15 23:58 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Aug 15 23:58 error.log -> /dev/stderr
停止中のコンテナに実行してもエラーとなります。
$ docker stop web01
web01
$ docker exec -it web01 ls -l /var/log/nginx
Error response from daemon: Container ce2fa12b11da0fcf214221c5cb4687ed48f5ac73e6e71586d2ddcee98202df7e is not running
-it
オプションにはもう一つ使い方があり、ssh
コマンドを使わなくてもコンテナ内にログインできるようになります。
$ docker exec -it web01 /bin/bash
root@ce2fa12b11da:/#
コンテナのセキュリティを高めるためには不要なサービスは公開せず、不要なポートも開けない方がよいため、-it
オプションでのログインは非常に重要なテクニックとなります。
コンテナのログを表示
コンテナが出力するログを確認します。
docker logs <コンテナID>
docker logs <コンテナ名>
この例ではnginx
イメージから作成したコンテナのログを確認しています。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17e44cfb7902 nginx "/docker-entrypoint.…" 15 hours ago Up 15 hours 0.0.0.0:8080->80/tcp nginx01
$ docker logs 17e
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/08/31 22:20:56 [notice] 1#1: using the "epoll" event method
2023/08/31 22:20:56 [notice] 1#1: nginx/1.25.2
2023/08/31 22:20:56 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2023/08/31 22:20:56 [notice] 1#1: OS: Linux 5.15.49-linuxkit-pr
2023/08/31 22:20:56 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/08/31 22:20:56 [notice] 1#1: start worker processes
2023/08/31 22:20:56 [notice] 1#1: start worker process 29
2023/08/31 22:20:56 [notice] 1#1: start worker process 30
2023/08/31 22:20:56 [notice] 1#1: start worker process 31
2023/08/31 22:20:56 [notice] 1#1: start worker process 32
2023/08/31 22:20:56 [notice] 1#1: start worker process 33
ボリュームの操作
ボリュームの一覧表示
一覧に表示されるVOLUME NAME
がボリューム名です。
docker volume ls
$ docker volume ls
DRIVER VOLUME NAME
local hello
ボリュームの作成
コンテナ起動にボリュームを作成できるため、使用頻度は低いですが、ボリューム単独で作成することもできます。
docker volume creare <ボリューム名>
hello
ボリュームを作成する場合は以下を実行します。
$ docker volume create hello
hello
ボリュームの削除
<ボリューム名>
を指定してコンテナで使用していないボリュームを削除します。
docker volume rm <ボリューム名>
hello
ボリュームを削除する場合は以下を実行します。
$ docker volume rm hello
hello
コンテナで使用しているボリュームを削除しようとするとエラーになります。
# ボリュームを作成
$ docker volume rm hello
hello
$ docker volume ls
DRIVER VOLUME NAME
local hello
# ボリュームをコンテナで使用する
$ docker run -d -v hello:/world busybox
ef22b9ed8a199057d11e9303eb153872d434b56cf098358da6c761f0aca8b201
# 削除しようとするとエラーとなり、使用しているボリュームのコンテナIDが表示される
$ docker volume rm hello
Error response from daemon: remove hello: volume is in use - [ef22b9ed8a199057d11e9303eb153872d434b56cf098358da6c761f0aca8b201]
$ docker volume ls
DRIVER VOLUME NAME
local hello
$ ボリュームを使用しているコンテナを削除する
$ docker rm ef22
ef22
# 再度ボリュームの削除を試み、削除できることを確認する
$ docker volume rm hello
hello
$ docker volume ls
DRIVER VOLUME NAME
ボリュームを使用しているコンテナを調べる(応用)
xargs
コマンドとjq
コマンドを組み合わせた方法になりますが、以下のようにすることで指定のコンテナ名(.Name == "hello"
がボリューム名を指定している箇所)を使用しているコンテナのコンテナIDを調べることができます。
docker ps -aq | xargs docker inspect | jq '.[] | select(.Mounts[]? | .Name == "hello") | .Id'
"21dc45864d5fa616e293f53b9324f1461b0e14f73adbcd57c2801c4a4ea90b31"