前回、「Dockerのインストールと使い方」で、Dockerイメージの作成からコンテナの起動までをめちゃくちゃ簡単に紹介しました。
今回は、実際にDockerコマンドを使って、Dockerイメージからコンテナを起動し、変更を加えたコンテナのイメージを作成するところまで紹介します。
- Dockerベースイメージの取得
- Dockerコンテナの起動
- 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 images」コマンドを実行します。
Dockerをインストールした直後は、Dockerイメージは存在しないと思います。
もし、すでにイメージを取得しているのであれば、以下のようにDockerイメージが表示されます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 719cd2e3ed04 8 days ago 109MB
Dockerイメージの検索
Docker Hubからベースイメージを検索するには、「docker search」コマンドを実行します。
ここでは、「CentOS」のイメージを検索しています。
$ 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イメージをダウンロード
Docker Hubからベースイメージを取得するには、「docker pull」コマンドを実行します。
ここでは、「CentOS7」の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 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
Dockerコンテナの作成
Dockerコンテナを作成するには、「docker run」コマンドを実行します。
「docker run」コマンドは、Dockerコマンドの中でも頻繁に利用することが多く、オプションの数も豊富です。
- 「-it」…ホストとコンテナの標準入出力を繋げる
- 「-d」…バックグラウンドで実行
- 「-p」…「ホストマシンのポート:コンテナのポート」でポートフォワード(転送)
- 「--name」…コンテナに名前をつける
これらのオプションは、ほんの一部なので、必要になったタイミングで自分で調べてみましょう。
ちなみに、「docker run」を実行すると、Dockerイメージがなければ自動でダウンロードしてくれます。
つまり、さきほどの「docker pull」コマンドを実行しなくても、コンテナの作成には問題がなかったってことです。
以下は、「centos:7」イメージから「centos」という名前でコンテナを作成し、起動させています。
# 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コンテナに接続(ログイン)
Dockerコンテナに接続(ログイン)するには、「docker exec」コマンドか「docker attach」コマンドを実行します。
「docker exec -it container_name bash」を実行することで、コンテナの中で新しく「/bin/bash」プロセスを作成してログインします。
「docker attach container_name」の場合は、コンテナの標準入出力に接続しているだけであり、新たに接続しているわけではありません。
そのため、「attach」でコンテナに入った場合は「exit」でログアウトすると、コンテナ自体が停止します。
以下では「centos」コンテナにログインし、Nginxをインストールしています。
# 「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 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
Dockerコンテナの起動
Dockerコンテナを起動するには、「docker start」コマンドを実行します。
「でも、docker runで起動できたよ?」
実は、「docker run」はコンテナの作成と起動を同時におこなっています。
そのため、コンテナを起動するだけの目的で「docker run」を繰り返し実行していると、コンテナがどんどん無駄に作成されてしまいます。
Dockerコンテナを起動したいだけなら、「docker start」を使うようにしましょう。
$ docker start centos
centos
Dockerコンテナの停止
Dockerコンテナを停止するには、「docker stop」コマンドを実行します。
$ docker stop centos
centos
Dockerイメージの作成
Dockerイメージを作成するには、「docker commit」コマンドを実行します。
以下では、centosにNginxをインストールしたコンテナから、新たに「original-nginx」イメージを作成しています。
# 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 rm centos
centos
Dockerイメージの削除
Dockerイメージを削除するには、「docker rmi」コマンドを実行します。
$ docker rmi centos:7
Untagged: centos:7
Untagged: centos@sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475
仮想マシンの停止
仮想マシンを停止するには、「docker-machine stop」コマンドを実行します。
パソコンを閉じるときは、必ず仮想マシンを停止させるようにしましょう。
$ docker-machine stop
Stopping "default"...
Machine "default" was stopped.$
まとめ:Dockerをもっと効率よく使ってみよう!
今回は、実際にDockerコマンドを実行しながら、Dockerイメージやコンテナの使い方などを詳しく紹介しました。
これでDockerの仕組みも、何となくは理解できたと思います。
次は「Dockerfileの書き方」を読んで、Dockerイメージを効率よく作成する仕組みである「Dockerfile」について学びましょう。
またね、キツネ(@kitaaaa_kitsune)でした!

