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
としてみます。con
はcontainer
の頭文字です。
$ 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やコンテナ名を確認します。NAMES
がstoic_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の区別さえつけば、削除することが可能です。
例えば、NAMES
がhello-world_con
の場合、CONTAINER ID
は2724d910deeb
ですので、次のように指定して削除可能です。
$ 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 イメージ名 |