【リニューアル記念】未経験からブロガーへのSTEPを続々更新!

Dockerコマンドでイメージ作成やコンテナ起動までの流れをつかもう!

Dockerコマンドを使ったイメージ作成やコンテナ起動

前回、「Dockerのインストールと基本的な使い方(Windows10とMac)」でDockerイメージの作成からコンテナの起動までをめちゃくちゃ簡単に紹介しました。

今回は、実際にDockerコマンドを使って、Dockerイメージからコンテナを起動し、変更を加えたコンテナのイメージを作成するところまで紹介します。

  1. Dockerベースイメージの取得
  2. Dockerコンテナの起動
  3. Dockerコンテナに変更を加える
  4. Dockerイメージの作成

この記事を上から順番に読んでいくだけで、Dockerイメージとコンテナの関係を理解することができます。

ちなみに、Dockerのイメージやコンテナの概念がわからないという方は、さきに「Dockerとは何か?初心者にもわかりやすく仕組みを解説!」を読んでみてください。

Dockerコマンドでイメージ作成からコンテナ起動まで

ここからは、Dockerイメージやコンテナの使い方を体系的に学べるよう、Dockerコマンドを実行しながら進めていきます。

もう少し具体的にいうと、CentOS7のベースイメージからコンテナを作成し、その中にNginxをインストールし、そのコンテナからDockerイメージを作成します。

「Nginxはベースイメージあるんだから、それ使えばいいじゃん!」って思うかもしれませんが、ここでは勉強のために手順を紹介しています。

読むだけでも理解できるように書いてはいますが、実際に自分でDockerをインストールして、実践しながら理解を深めていきましょう。

仮想マシンの確認

仮想マシン(ホストマシン)を確認するには、「docker-machine ls」コマンドを実行します。

WindowsやMacでDockerを使う場合は、ホストマシンとなる仮想マシン(Linux環境)が必要になるため、裏でLinuxが動くようになっています。

Docker Toolboxを使った場合は、「default」という名前の仮想マシンが自動で作成されていると思います。

仮想マシンの一覧を確認
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
default   -        virtualbox   Stopped                 Unknown

キツネ

この仮想マシンの上でコンテナが動くよ!

仮想マシンの起動

仮想マシン(ホストマシン)を起動するには、「docker-machine start」を実行します。

以下は、Docker Toolbox環境でのコマンド実行ログになります。

仮想マシンを起動
$ docker-machine start
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command. 

キツネ

これでDockerを使う準備ができたよ!

Dockerイメージの確認

Dockerイメージの確認は、「docker images」コマンドを実行します。

Dockerをインストールした直後は、Dockerイメージは存在しないと思います。

もし、すでにイメージを取得しているのであれば、以下のようにDockerイメージが表示されます。

Dockerイメージの一覧を確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              719cd2e3ed04        8 days ago          109MB

キツネ

Dockerイメージがないとコンテナは作れないよ!

Dockerイメージの検索

Docker Hubからベースイメージを検索するには、「docker search」コマンドを実行します。

ここでは、「CentOS」のイメージを検索しています。

Dockerイメージを検索
$  docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5410                [OK]
ansible/centos7-ansible            Ansible on Centos7                              121                                     [OK]
                    :
                    :

キツネ

ベースイメージはDocker Hubにあるんだね!

Docker HubからDockerイメージをダウンロード

Docker Hubからベースイメージを取得するには、「docker pull」コマンドを実行します。

ここでは、「CentOS7」のDockerイメージをダウンロードしています。

「:(コロン)」のあとに続けてバージョンを書くことで指定することができます。

Dockerイメージをダウンロード
# CentOS7のDockerイメージをダウンロード
$ docker pull centos:7
7: Pulling from library/centos
8ba884070f61: Pulling fs layer
8ba884070f61: Verifying Checksum
8ba884070f61: Download complete
8ba884070f61: Pull complete
Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
Status: Downloaded newer image for centos:7 

# Dockerイメージを確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              719cd2e3ed04        8 days ago          109MB
centos              7                   9f38484d220f        3 months ago        202MB

キツネ

これでいつでもコンテナを作れるね!

Dockerコンテナの一覧確認

Dockerコンテナの一覧を確認するには、「docker ps」コマンドを実行します。

「-a」オプションをつけることで、起動中、停止中に関わらず、作成されたすべてのコンテナを確認することができます。

Dockerコンテナの一覧を確認
# 起動中のDockerコンテナを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# 作成されたDockerコンテナを確認
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                  NAMES
bebee7ed3f41        nginx               "nginx -g 'daemon of…"   25 hours ago        Exited (255) 21 hours ago   0.0.0.0:8080->80/tcp   nginx

キツネ

上の2つの違いは覚えておこう!

Dockerコンテナの作成

Dockerコンテナを作成するには、「docker run」コマンドを実行します。

「docker run」コマンドは、Dockerコマンドの中でも頻繁に利用することが多く、オプションの数も豊富です。

  • 「-it」…ホストとコンテナの標準入出力を繋げる
  • 「-d」…バックグラウンドで実行
  • 「-p」…「ホストマシンのポート:コンテナのポート」でポートフォワード(転送)
  • 「--name」…コンテナに名前をつける

これらのオプションは、ほんの一部なので、必要になったタイミングで自分で調べてみましょう。

ちなみに、「docker run」を実行すると、Dockerイメージがなければ自動でダウンロードしてくれます。

つまり、さきほどの「docker pull」コマンドを実行しなくても、コンテナの作成には問題なかったってことです。

以下は、「centos:7」イメージから「centos」という名前でコンテナを作成し、起動させています。

Dockerコンテナを作成
# CentOS7のコンテナを作成
$ docker run -it -d -p 8080:80 --name centos centos:7
e563f84c150a3193f37372e1911be4b99cbed7cd4b0b6cfb3f495ba961aa66cc

# 起動中のコンテナを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
e563f84c150a        centos:7            "/bin/bash"         31 seconds ago      Up 27 seconds       0.0.0.0:8080->80/tcp   centos

キツネ

「docker run」は頻繁に使うコマンドだよ!

Dockerコンテナに接続(ログイン)

Dockerコンテナに接続(ログイン)するには、「docker exec」コマンドか「docker attach」コマンドを実行します。

「docker exec -it container_name bash」を実行することで、コンテナの中で新しく「/bin/bash」プロセスを作成してログインします。

「docker attach container_name」の場合は、コンテナの標準入出力に接続しているだけであり、新たに接続しているわけではありません。

そのため、「attach」でコンテナに入った場合は「exit」でログアウトすると、コンテナ自体が停止します。

以下では「centos」コンテナにログインし、Nginxをインストールしています。

「docker exec」でコンテナにログイン
# 「centos」コンテナにログイン
$ docker exec -it centos bash
[root@e563f84c150a /]#

# yumでNginxのリポジトリをインストール
$ yum localinstall -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 
Loaded plugins: fastestmirror, ovl
nginx-release-centos-7-0.el7.ngx.noarch.rpm
     :
     :
Complete!

# yumでNginxをインストール
$ yum install -y nginx
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
     :
     :
Complete!

# Nginxを起動
$ nginx

# コンテナからログアウト
$ exit

次に、「docker attach」コマンドを使ってコンテナに入ってみます。

「exit」コマンドを使うことで、コンテナが停止することを確認してみましょう。

「docker exec」でコンテナに入る
# 起動中のコンテナを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
e563f84c150a        centos:7            "/bin/bash"         31 seconds ago      Up 27 seconds       0.0.0.0:8080->80/tcp   centos

# コンテナに入る
$ docker attach centos
[root@e563f84c150a /]#

# コンテナからログアウト
$ exit

# コンテナが停止していることを確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

キツネ

「attach」でログアウトは注意だね!

Dockerコンテナの起動

Dockerコンテナを起動するには、「docker start」コマンドを実行します。

「でも、docker runで起動できたよ?」

実は、「docker run」はコンテナの作成と起動を同時におこなっています。

そのため、コンテナを起動するだけの目的で「docker run」を繰り返し実行していると、コンテナがどんどん無駄に作成されてしまいます。

Dockerコンテナを起動したいだけなら、「docker start」を使うようにしましょう。

Dockerコンテナを起動
$ docker start centos
centos

キツネ

「run」と「start」を上手に使い分けよう!

Dockerコンテナの停止

Dockerコンテナを停止するには、「docker stop」コマンドを実行します。

Dockerコンテナを停止
$ docker stop centos
centos

Dockerイメージの作成

Dockerイメージを作成するには、「docker commit」コマンドを実行します。

以下では、centosにNginxをインストールしたコンテナから、新たに「original-nginx」イメージを作成しています。

Dockerイメージを作成
# Dockerイメージを作成
$ docker commit centos original-nginx
sha256:7ce94545d4c00b11d2c551c9a75c7582c3310b7a7c859b6f12158bb9c0ab72c3

# 作成したDockerイメージを確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
original-nginx      latest              7ce94545d4c0        4 seconds ago       313MB
nginx               latest              719cd2e3ed04        8 days ago          109MB
centos              7                   9f38484d220f        3 months ago        202MB

# 作成したイメージからコンテナを作成し起動
$ docker run -it -d -p 8080:80 --name original-nginx original-nginx
e9a07e2afc9d3f09570a4a28eb86b2f9f6c435c45e01c8357d9c6bfe2e1f50b9

# 「original-nginx」コンテナにログイン
$ docker exec -it original-nginx bash

# Nginxがインストールされていることを確認
$ nginx -v
nginx version: nginx/1.16.0

実は、Dockerイメージを作成する方法は1つではなく、ほかにも「Dockerfile」を使った方法があります。

むしろ、Dockerfileを使ったイメージ作成のほうが一般的なので、また別の記事で詳しく紹介したいと思います。

Dockerコンテナの削除

Dockerコンテナを削除するには、「docker rm」コマンドを実行します。

ちなみに、Dockerコンテナを停止したあとでなければコンテナの削除はできないので注意してください。

Dockerコンテナを削除
$ docker rm centos
centos

Dockerイメージの削除

Dockerイメージを削除するには、「docker rmi」コマンドを実行します。

Dockerイメージを削除
$ docker rmi centos:7
Untagged: centos:7
Untagged: centos@sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475

キツネ

「remove image」の略だと覚えよう!

仮想マシンの停止

仮想マシンを停止するには、「docker-machine stop」コマンドを実行します。

パソコンを閉じるときは、必ず仮想マシンを停止させるようにしましょう。

Dockerマシンを停止
$ docker-machine stop
Stopping "default"...
Machine "default" was stopped.$ 

まとめ

今回は、Dockerコマンドを実行しながら、Dockerイメージやコンテナの使い方などを詳しく紹介しました。

これでDockerの仕組みも何となくは理解できたと思います。

次は、「Dockerfileとは?実際にビルドしながらイメージを作成してみよう!」を読んで、Dockerイメージを効率よく作成する仕組みである「Dockerfile」について学びましょう。

テキストのコピーはできません。