どうも、nippa です。
夏になりつつあるので、うちでも「Docker はじめました」の看板を出そうと思います。今更感はあります。
これまで、VMを使っていたのですが、以下の不満がありました。
- ホストPCのリソースをかなり消費する
- 立ち上げ、シャットダウンに時間がかかる
- 構築、再構築がめんどくさい
以下の場合にはVMをおすすめします。
アプリケーション開発の場合はDockerの方が遥かに便利であることに気づきました。
使い分けをした方が良いと思い、Dockerを利用することにしました。
環境
- macOS 10.15
- docker desktop 3.4
Dockerのインストール
今回はDocker destktopを利用しますが、基本的にコマンドラインでしか利用しない場合は、Homebrewでdockerをインストールしても問題ないと思います。
Docker desktopをインストール場合は、docker公式サイトからホストPCに合わせてダウンロードし、インストールしてください。
Homebrewでインストールする場合は、
brew install docker
イメージファイルのpull
dockerはイメージファイルを取得・作成して、そのファイルからコンテナを起動して実行します。
今回は、hello-worldのイメージファイルをpullします。
docker pull hello-world:latest
image:tagでpullするイメージとバージョンを指定することができます。
今回は最新をイメージファイルをpullしています。
pullしたイメージファイルの確認。
docker image ls # 出力 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB
イメージの詳細の確認
イメージファイルの詳細は以下のコマンドで確認できます。
docker inspect hello-world
詳細が以下のように出力されます。
[ { "Id": "sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726", "RepoTags": [ "hello-world:latest" ], "RepoDigests": [ "hello-world@sha256:9f6ad537c5132bcce57f7a0a20e317228d382c3cd61edae14650eec68b2b345c" ], "Parent": "", "Comment": "", "Created": "2021-03-05T23:25:25.230064203Z", "Container": "f5a78ef54769bb8490754e9e063a89f90cc8eee6a6c5a0a72655826e99df116e", "ContainerConfig": { "Hostname": "f5a78ef54769", "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 [\"/hello\"]" ], "Image": "sha256:77fe0a37fa6ce641a004815f2761a9042618557d253f312cd3da61780e372c8f", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "19.03.12", "Author": "", "Config": { "Hostname": "", "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": [ "/hello" ], "Image": "sha256:77fe0a37fa6ce641a004815f2761a9042618557d253f312cd3da61780e372c8f", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 13336, "VirtualSize": 13336, "GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/78faf2fa6ec562c626b8a14e958d04a0ed9040abcac98299676a4d10e0e1c5b2/merged", "UpperDir": "/var/lib/docker/overlay2/78faf2fa6ec562c626b8a14e958d04a0ed9040abcac98299676a4d10e0e1c5b2/diff", "WorkDir": "/var/lib/docker/overlay2/78faf2fa6ec562c626b8a14e958d04a0ed9040abcac98299676a4d10e0e1c5b2/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } } ]
コンテナの起動
イメージが取得できていることを確認したら起動になります。
docker run hello-world # 出力 Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
コンテナの状態の確認
起動しているコンテナを確認する場合は、以下のコマンドです。
docker ps
# 出力
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
停止しているコンテナも含めて表示する場合は、-a
オプションをつけます。
docker ps -a #出力 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 847a4df34e28 hello-world "/hello" 52 seconds ago Exited (0) 5 seconds ago pensive_brown
hellow-worldイメージで起動したコンテナはExited (0)
で正常終了していることがわかります。
コンテナの停止
hello-worldで起動したコンテナは、処理が終わると終了しますが、バックグラウンド起動したコンテナなどは、
docker stop [CONTAINER ID or NAMES]
で停止することができます。
コンテナの削除
停止しているコンテナの削除は、
docker ps -a # 出力 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4bce8479da18 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago gallant_austin
コンテナIDまたはコンテナ名を確認して、
# docker rm [CONTAINER ID or NAMES]
docker rm 4bce8479da18
で削除できます。削除されていることを確認します。
docker ps -a
# 出力
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナの削除の完了です。
イメージファイルの削除
今あるDockerのイメージを確認します。
docker images # または docker image ls # 出力 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d1165f221234 3 months ago 13.3kB
イメージを削除します。
# docker image rm [IMAGE ID or REPOSITORY]
docker image rm d1165f221234
削除されたことを確認。
docker images # または docker image ls # 出力 REPOSITORY TAG IMAGE ID CREATED SIZE
感想
今夏はDockerのhello-worldを行いましたが、次回はもう少し実践向けの内容を書きたいと思います。
アプリケーション開発者にとってはDockerは必須の時代になるのかなと思っています。
更に、クラウド化が進めば進むほど、Dockerの優位性は高まるので、ぜひこれを機会にどんどん利用していきたいと思っています。
ではでは、また次回。