Hanatare's PaPa

Make life a little richer.

Virtual Space of Hanatare's PaPa

人生をほんの少しだけ充実させる

【Docker】超初心者のdocker入門 - コンテナに触れてみる -

f:id:nothing-title:20211015141630p:plain

少し間が空いてdockerを使って作業を始めようとすると、毎回基本的なことを忘れてしまっているような気がするので、今回はdockerについての記事を書きたいと思います。おそらく書きつくされている記事なので、知っている人からすると目新しいことはあまりないかもしれませんが、自分のメモという位置づけで記録を残しておきたいと思います。

前提

今回の記事は以下のことを前提に進めていきます。

  • dockerとは何かをざっくりでも知っている
  • docker-hubへの登録が完了している
  • dockerのインストールが完了している

定番のhello-worldから始める

自身のmacOSのターミナルまたはWindowsのコマンドプロンプトから以下のコマンドを実行してみます。

$ docker run hello-world
docker run の結果
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest

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は何をしたのか?

  1. Dockerクライアント(ターミナル)からDockerデーモンに接続
  2. Dockerデーモンはhello-worldというイメージをローカルホストの中で探します
  3. hello-worldというイメージがローカルにないため、Dockerデーモンはパブリックなインターネットの世界に出ていき、Docker Hubからhello-worldのイメージをローカルにプルしてきます
  4. プルしたイメージからDockerデーモンが、コンテナを生成し、コンテナ上のプロセスがメッセージを出力します
  5. Dockerデーモンはコンテナの出力をDockerクライアントに送り、ターミナルで内容が表示されます。

ターミナルに表示された内容(上記の結果部分)は5の内容が表示されただけです。それまでに1〜4の作業が実際には行われています。

docker runのコマンド

  1. dockerコマンドを入力して、dockerを使う事をホスト側で宣言します。
  2. サブコマンド使って、dockerで何をするかを指定します。
  3. サブコマンドの後ろにイメージを指定する事でもう少し具体的な事を言っています。ここではhello-worldというイメージを起動しています。

docker run は複数のコマンドの集合体

  • docker pull:イメージを取得する
  • docker create:コンテナを作成する
  • docker start:コンテナを起動する

コンテナのライフサイクルをdockerコマンドで実施

  1. dockerのイメージを取得する
  2. イメージからdockerコンテナを作成する
  3. コンテナを起動する
  4. コンテナを停止
  5. コンテナの削除
  6. イメージの削除

1. dockerのイメージを取得する

ここではCentOS7のイメージを取得したいと思います。

docker pull イメージ:タグ

# イメージのpull
$ docker pull centos:7

リモートのリポジトリからイメージをpullします。ローカルへpullしておく事で、コンテナの起動を短くできます。(実行前に必ずローカルにイメージがあるかを確認して、あればローカルのイメージを使うためです。)

docker pull の結果
7: Pulling from library/centos →library/centosからタグ7のモノをpullしています。  <br>ab5ef0e58194: Pull complete → pullが完了しました<br>Digest: sha256:4a701376d03f6b39b8c2a8f4a8e499441b0d567f9ab9d58e4991de4472fb813c<br>Status: Downloaded newer image for centos:7<br>docker.io/library/centos:7
プルされたイメージの存在確認

以下コマンドでプルされたローカルに存在するイメージのリストを確認できます。

$ docker images
docker imagesの実行結果
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        2 months ago        203MB

2. イメージからdockerコンテナを作成する

docker run コマンドを実行するとコンテナを作成して、起動までしてくれますが、今回はコンテナを作る、起動するを分けて実行したいと思います。

docker create IMAGE

# イメージを指定してコンテナをcreateする
$ docker create centos:7

上記コマンドでdockerコンテナが作成できます。今回はライフサイクルを確認することが目的なので、細かくオプションは調べていませんが、コンテナの名前を指定する場合は以下のようにオプションをつけて実行してください

docker create --name NAME IMAGE

# イメージを指定し、指定した名前でコンテナをcreateする
$ docker create --name sample-container centos:7
docker create の実行結果
493a986c82aea49c583693785352fa1e7761f8f3af269f37abc6db13c0aaed4f

docker ps -a

作成したコンテナの確認をdocker psコマンドを使って確認します。しかし、psだけでは実行中のコンテナしか表示してくれません。そのため「-a」オプションをつけて実行します。「-a」オプションをつけることで起動していないコンテナも含めてすべてを表示してくれます。

# docker コンテナを全て表示する
$ docker ps -a
docker psの実行結果
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES<br>493a986c82ae        centos:7            "/bin/bash"         4 minutes ago       Created                                 sample-container

先程createしたときに指定した名前(「sample-container」)でコンテナが作成されていることがわかります。

3. コンテナを起動する

コンテナを起動して利用できるようにしたいと思います。コンテナの起動方法は2種類あり、コンテナに対して振られるIDを利用するか、コンテナの名前を指定するかです。今回はどちらも紹介をします。

docker start CONTAINER ID

# docker コンテナを起動する
$ docker start 493a986c82ae

docker start NAME

# docker コンテナを起動する 
$ docker start sample-container
コンテナの起動を確認する
# docker コンテナを全て表示する
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
493a986c82ae        centos:7            "/bin/bash"         2 days ago          Exited (0) 10 seconds ago                       sample-container

statusを見てもらうと10 seconds ago となっており、10秒前に起動できたことが確認できました。docker コンテナを作成したときに特にオプションを指定していないため、コンテナ用のレイヤはただ、centos7を起動してすぐに終了してしまいます。もし、対話型のcentos7を動かしたいときは以下のようにしてコンテナを作成してください

# イメージを指定し、指定した名前でコンテナをcreateする
$ docker create -it --name sample-container centos:7 /bin/bash
オプション 説明
-i キーボード入力をコンテナの標準入力へつなぎ、キーボード入力をコンテナ上のシェルなどへ送れるようにする
-t 擬似端末デバイスを結びつけ、ターミナルによる対話型動作を可能にする

4. コンテナを停止する

docker stop CONTAINER ID

現在起動中のコンテナはこのコマンドで停止します まずは起動中のコンテナを確認します。(事前に対話型でcentos7)

# docker 起動中コンテナを表示する
$ docker ps
COMMAND             CREATED             STATUS              PORTS               NAMES
d334df7e88e7        centos:7            "/bin/bash"         47 hours ago        Up 18 seconds                           sample-container2

コンテナIDを指定してコンテナを停止する。

# コンテナをstopし、再度docker psで起動中コンテナを確認する
$ docker stop d334df7e88e
docker stopの実行結果
$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

起動中のコンテナがなくなったことが確認できました。ちなみに停止したコンテナはdocker startで再度起動することができます。

4. コンテナの削除

以下のコマンドで作成されたコンテナが削除されます。

docker rm CONTAINER ID

# コンテナを削除し、確認する
$ docker rm 493a986c82ae

docker rm の実行結果
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

5. イメージの削除

最後にdocker pullで取得したdocker imageを削除したいと思います。

docker rm IMAGE ID
# イメージを指定してリポジトリから削除する
$ docker rmi 5e35e350aded

このとき、他のコンテナでこのイメージを使っている場合、unable to deleteとなる。 その場合は、エラーメッセージにコンテナIDが表示されているため、そのコンテナIDを削除して再度試してみてほしい

まとめ

今回はdocker操作の基本的な部分を整理しました。あくまで基本操作なので、利用するコンテナによっては設定ファイルを読み込む必要もあります。dockerを使った書くアプリケーション環境の構築はまたご紹介できたらと思います。 今回も最後まで読んでいただきありがとうございました。