IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Docker はじめました

どうも、nippa です。

夏になりつつあるので、うちでも「Docker はじめました」の看板を出そうと思います。今更感はあります。

これまで、VMを使っていたのですが、以下の不満がありました。

  1. ホストPCのリソースをかなり消費する
  2. 立ち上げ、シャットダウンに時間がかかる
  3. 構築、再構築がめんどくさい

以下の場合にはVMをおすすめします。

  1. オンプレやクラウドインスタンスを利用する場合
  2. OSの設定の確認
  3. ミドルウェアの設定

アプリケーション開発の場合は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の優位性は高まるので、ぜひこれを機会にどんどん利用していきたいと思っています。

ではでは、また次回。