【Docker使えるようになりたい】【#4 ハンズオン】Dockerのライフサイクルを体験

はじめに

この記事から、イメージからコンテナの実行まで一連の流れを確認しながら実行してみる

以下の画像の流れを元に、ハンズオン形式でDockerの基本的なコマンドや考え方をまとめていこうと思います。

この記事で使用するコマンドの一覧

container

image

1. イメージのダウンロード(Pull)する

まずはじめに用語の整理です。
Dockerではイメージをイメージレジストリ(Docker Hubなど)からダウンロードする場合にpullという用語を使います。
なので、この記事でもpullという用語を使おうと思います。

厳密にはダウンロードとpullはバージョン管理の関係などが含まれているので違いますが、とりあえずダウンロードするという認識で大丈夫だと思います。

まずは、今ローカルにあるイメージを確認してみます。

ローカルにあるイメージを確認するには、docker image lsコマンドを使用します。

docker image ls

以下の出力がコマンドを私の環境で実行した結果です。

最初の大文字の行以外何も表示されていなければ、ローカルにイメージはないということを表しています。

REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

では、今回使う予定のhello-worldというイメージをDocker Hubからpullします。

Docker Hubとは、リモートリポジトリと言われるimageがたくさん格納されているサービスになります。

イメージをpullするには、docker image pull [イメージ名] コマンドを使用します。
以下のように今回pullするhello-worldをイメージ名として指定してコマンドを実行します。

docker image pull hello-world

コマンドを実行すると、以下の出力がされると思います。

Using default tag: latest
latest: Pulling from library/hello-world
478afc919002: Pull complete
Digest: sha256:91fb4b041da273d5a3273b6d587d62d518300a6ad268b28628f74997b93171b2
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:lates

本当にローカルにpullできたかdocker image lsコマンドをもう一度実行して変化を見てみます。

docker image ls

実行結果を見ると、確かにhello-worldというimageが増えていて、正常にpullできたようです。

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    ee301c921b8a   16 months ago   9.14kB

2. イメージからコンテナを生成

まずは、現状のコンテナ一覧を確認しましょう。
コンテナの一覧を確認するには、docker container ls (-a)コマンドを使用します。

ここで見慣れない書き方の-aというものがありますが、これは、オプションというもので、コマンドに更に細かい指示ができるものです。

docker container lsコマンド単体で使うとう「実行中のコンテナ」のみの表示になるので、すべてのコンテナを表示したい場合は-aを使います。

docker container ls -a

実行した結果、私の環境では何もコンテナを作っていないので、以下のようなヘッダー部分だけの表示になりました。

CONTAINER ID   IMAGE   COMMAND  CREATED   STATUS   PORTS   NAMES

次に、先ほどpullしてきたhello-worldイメージを使って、docker container create [イメージ名]コマンドを使用してコンテナを作成してみます。

このコマンドは、指定したイメージからコンテナを生成するコマンドになります。
今回実行するコマンドでは、前の手順でpullしてきたhello-worldイメージからコンテナを生成します。

docker container create hello-world

実行すると、以下のような謎の文字列が1行出力されると思います。
この文字列が生成されたコンテナの固有のIDになります。

d4c62cb0316cca758c787d830d5a780e3667f33c629fe3253d41aa700fa11d00

ではもう一度、docker container ls (-a)コマンドを使用して正常に生成されているか確認してみましょう。

docker container ls -a

生成したコンテナが表示されました。
これで正常に生成されたことを確認できました。

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS    PORTS     NAMES
d4c62cb0316c   hello-world   "/hello"   23 seconds ago   Created             silly_wing

3. コンテナの実行

コンテナの実行には、docker container start -a (コンテナID or コンテナ名)コマンドを使用します。

コンテナID、コンテナ名はどちらを使っても問題ないです。

また-aオプションが出てきましたが、これはdocker container ls (-a)で使った-aオプションとは別物です。
docker container startコマンドの-aオプションはattachの略です。

attachは何をアタッチしているのかというと、標準出力と標準エラー出力を現在のターミナルの標準出力と標準エラー出力につなげているというイメージになります。

docker container start -a d4c62cb0316c

実行すると、以下のような出力が表示されます。

-aオプションを付けないと実行はされますが何も表示はされません。
内部の動作を気にしない場合は、-aをつけなくてもいいようにできています。

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.
    (arm64v8)
 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コンテナ内にある、helloというバイナリを実行した結果になります。

しかし、実行時にコマンドは設定していないのになぜhelloバイナリが実行されたのかというと、

デフォルトで実行されるコマンドが設定されているためです。

確認方法は、docker container ls (-a)を実行した時のCOMMANDという部分に実行時のコマンドを指定しない場合のデフォルト実行されるコマンドが記載されています。

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS    PORTS     NAMES
d4c62cb0316c   hello-world   "/hello"   23 seconds ago   Created             silly_wing

4. コンテナ、イメージの削除

最後に今回使用したhello-worldイメージと、コンテナを削除して終わりにしようと思います。

コマンドとして以下の2つを使用します。

注意点として、イメージは、コンテナを作るための部品なのですが、コンテナがまだ残った状態で削除はデフォルトの設定ではできないようになっており、コマンドを実行すると以下のようなエラーが発生します。

$ docker image rm hello-world

Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container d4c62cb0316c is using its referenced image ee301c921b8a

エラーを読むとコンテナの元として使われているから削除できないと言われています。

なので、削除するには、まずコンテナ削除 -> イメージ削除の順番になります。
もちろん、1つのイメージから複数のコンテナを生成することもできるので、その場合はすべてのコンテナを削除してからイメージを削除します。

まずは、生成したコンテナを削除します。

コンテナの削除には、docker container rm [コンテナID or コンテナ名] コマンドを使用します。
(docker container ls (-a)コマンドを使ってコンテナ名かIDを確認してから実行してください)

docker container rm d4c62cb0316c

削除に成功すると、指定したコンテナIDコンテナ名のコマンド実行時に指定した方の出力があります。

d4c62cb0316c

最後に、使っているコンテナがなくなったイメージを、docker image rm [イメージ名]コマンドで削除します。
イメージの削除の場合は、イメージ名で対象のイメージを指定します。

docker image rm hello-world

以下のような出力がされれば削除成功です。

Untagged: hello-world:latest
Untagged: hello-world@sha256:91fb4b041da273d5a3273b6d587d62d518300a6ad268b28628f74997b93171b2
Deleted: sha256:ee301c921b8aadc002973b2e0c3da17d701dcd994b606769a7e6eaa100b81d44
Deleted: sha256:12660636fe55438cc3ae7424da7ac56e845cdb52493ff9cf949c47a7f57f8b43

まとめ

この記事では、基本的なimageのpullからコンテナの実行、削除までをまとめました。
次の記事では、使いやすいコマンドや、今までたくさん打つ必要があったコマンドをまとめたようなコマンドを紹介したいと思っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA