とあるお兄さんの雑記

基本的に技術系の内容を書きますが、何を書くかは私の気分です。

Dockerを学ぶ第2回~基本的なDockerコマンド~

HTC Advent Calendar 2020の8日目を担当します、kurasherです。

第2回からはDockerの基本コマンドを学んでいきます。Dockerはすでにインストールしているものとして話を進めます。

Dockerをインストールしていない人は、Play with Dockerからでも大丈夫です。

環境

Windows 10 Pro
Docker ToolBox 18.09.1

Windows 10 ProならDocker Desktopがインストール可能ですが、私の場合PCが古いのと、Docker Desktopを起動するとメモリ不足となり、ブラウザが立ち上がらない、つまり調べたいことが全く調べられないという状況になったので、Docker ToolBoxを入れています。

hello-worldからイメージの取得、コンテナの起動、削除までを学ぶ

ここから本格的にDockerコマンドを学んでいきましょう。また、これ以降ではDockerイメージを単にイメージ、Dockerコンテナを単にコンテナと呼ぶことにします。

イメージ一覧の表示:docker images

Dockerを初めて起動した場合、基本的にイメージはありません。が、Dockerを学ぶうちに、いろんなイメージがDocker内に入ってくるかと思います。その際、下記のコマンドでローカルにどんなイメージが入っているかを知ることが可能です。

$ docker images

または

$ docker image ls

2つのコマンドに違いは無く、新しいか古いかの問題だけです。
docker container / image コマンド新旧比較

実行すると以下のように出力されます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

イメージが無いのでこのような出力になります。では実際にイメージを取ってきましょう。

イメージの取得:docker pull

イメージはデフォルトでDocker Hubというところから引き出してきます。Docker Hubには様々なイメージが置いてありますので、一度見てみるといいでしょう。

docker pull イメージ名でイメージを取得します。

$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete                                                                                                                                             
Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Status: Downloaded newer image for hello-world:latest

これでhello-worldのイメージは取得できました。

docker images見てみましょう。

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB

私の場合は、上記のようになっていました。人によってIMAGE IDの値が違うと思いますが問題ありません。
では次にこのイメージをもとにコンテナを起動してみましょう。

コンテナを起動する:docker run

コンテナを起動します。

$ 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/

hello-worldのイメージを起動できました。ちなみに起動中のコンテナを知る場合、docker psまたはdocker container lsで知ることが出来ます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

何も出てこないですね。実はhello-worldのイメージは上記の出力が終わると、自動でコンテナが停止します。そのため、上記のコマンドでは何も表示されません。

停止中のコンテナも含めて表示する場合はdocker ps -a またはdocker container ls -aとします。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
fc4ea375ee85        hello-world         "/hello"            7 minutes ago       Exited (0) 7 minutes ago                       stoic_merkle

IMAGEがhello-worldのものが作られていますね。ちなみにNAMESはコンテナ名を指しますが、何も指定しない場合適当な名前が付くようになっています。

名前を指定する場合は、コンテナを起動する際に、--name コンテナ名を指定します。今回はコンテナ名をhello-world_conとしてみます。concontainerの頭文字です。

$ docker run --name hello-world_con hello-world

これで、docker ps -aとしてみると、

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
2724d910deeb        hello-world         "/hello"            8 seconds ago       Exited (0) 6 seconds ago                        hello-world_con
fc4ea375ee85        hello-world         "/hello"            15 minutes ago      Exited (0) 15 minutes ago                       stoic_merkle

NAMESがhello-world_conのコンテナ名が出来ました。

コラム:あれ?コンテナ起動するの早くね?

hello-world_conというコンテナを起動する際、同じイメージからコンテナを起動しているにも関わらず、1回目よりも2回目の方が早く立ち上がりませんでしたか?
実はこれ、Dockerの特長で、既にあるもの、設定されているものはそのまま使う設定になっています(要はキャッシュを利用している)。そのため、1回目よりも2回目の方が早く立ち上がるようになっています。

停止しているコンテナを削除する:docker rm

今度はコンテナを削除してみましょう。通常はコンテナを起動した場合、コンテナを停止する作業(docker stop コンテナID)が必要ですが、hello-worldの場合、すでに停止しています。そのため、停止する作業は不要です。
以下のコマンドを実行すればコンテナを削除することが出来ます。

$ docker container rm コンテナID

または

$ docker container rm コンテナ名

docker ps -aでコンテナIDやコンテナ名を確認します。NAMESstoic_merkleのものを削除したい場合、

$ docker container rm stoic_merkle

または

$ docker container rm fc4ea375ee85

で削除可能です。

上記コマンドを実行した後に、docker ps -aで確認すると、

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES
2724d910deeb        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                       hello-world_con

削除されていることが確認できますね。

コラム:ちょっとだけ楽に削除する方法

ちなみに、コンテナIDや、イメージIDは一意なIDです。つまり、IDの区別さえつけば、削除することが可能です。
例えば、NAMEShello-world_conの場合、CONTAINER ID2724d910deebですので、次のように指定して削除可能です。

$ docker container rm 2
2
$
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

削除できていることが確認できましたね。ちょっとしたtipsでした。

イメージを削除する:docker rmi

基本的にはコンテナを削除する場合と同じです。

$ docker rmi イメージ名

または

$ docker rmi イメージID

で削除可能です。また、イメージIDも一意なIDであるため、イメージIDを途中まで指定して削除することも可能です。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB
$ 
$ docker rmi b #IMAGE IDがbf756fb1ae65であるため、最初のbだけ指定
Untagged: hello-world:latest
Untagged: hello-world@sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63
$
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

まとめ

今回学んだDockerコマンドの一覧です。何回もpullしたり削除したりすることでDockerに慣れていきましょう。

やること Dockerコマンド
イメージの取得 docker pull イメージ名
イメージの一覧表示 docker images
イメージの一覧表示 docker image ls
コンテナの起動 docker run イメージ名
コンテナ名を指定してコンテナを起動 docker run --name コンテナ名 イメージ名
起動中のコンテナの一覧表示 docke ps
起動中のコンテナの一覧表示 docke container ls
停止中のコンテナも含めてコンテナの一覧表示 docker ps -a
停止中のコンテナも含めてコンテナの一覧表示 docker container ls -a
停止中のコンテナの削除 docker container rm コンテナID
停止中のコンテナの削除 docker container rm コンテナ名
イメージの削除 docker rmi イメージID
イメージの削除 docker rmi イメージ名

参考

Play with Docker
docker container / image コマンド新旧比較