この記事から、イメージからコンテナの実行まで一連の流れを確認しながら実行してみる
以下の画像の流れを元に、ハンズオン形式でDockerの基本的なコマンドや考え方をまとめていこうと思います。
container
- docker image pull [イメージ名] : 指定したイメージ名のイメージのダウンロード
- docker image ls : ダウンロード済みのイメージの一覧を表示
- docker image rm [イメージ名] : 指定したイメージ名のローカルイメージの削除(コンテナとして使用されていない場合限定)
image
- docker container ls (-a) : 実行中(up)のコンテナの一覧を表示。非実行のコンテナを表示する場合は、(-a)をつける
- docker container create [イメージ名] : イメージからコンテナを生成
- docker container start -a [コンテナID or コンテナ名] : 指定したコンテナを起動して出力をコンソールに表示させる(-a)をつけないと、出力が表示されない
- docker container rm [コンテナID or コンテナ名] : 指定したコンテナを削除する(Exited状態のコンテナ限定)
まずはじめに用語の整理です。
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
まずは、現状のコンテナ一覧を確認しましょう。
コンテナの一覧を確認するには、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
コンテナの実行には、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
最後に今回使用した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からコンテナの実行、削除までをまとめました。
次の記事では、使いやすいコマンドや、今までたくさん打つ必要があったコマンドをまとめたようなコマンドを紹介したいと思っています。