仮想化環境のスキル更新：CentOSでDockerに触れる

私が言うまでもありませんが、仮想化環境は日進月歩で進化しており、
メイン業務の環境ではこれまではサーバ仮想化が幅を利かせていましたが、
ぼちぼちコンテナ型仮想化のDockerが乗り込んで来そうな雰囲気です。

その昔、サーバ仮想化にのめり込んで自宅にサーバルーム（大した設備ではないです）を構築し、
VMwareとHyper-Vで遊んできた私ですが、この度、Hyper-V上にDocker環境を構築して、
学習を始めてみることにしました。

# １．CentOSの準備
Hyper-V上にCentOSを準備します。
執筆時点（2018.04.01）ではCentOS7.4が最新版でした。
CentOSは「サーバー（GUI使用）」でベース環境を選択しました。
この時点で特には他に何も入れておりません。
ちなみにホスト名は「centos74-docker」です。

# ２．Dockerのセットアップ
こちらを参考にDockerのセットアップを行いました。
（@inakadegaebalさん）
https://qiita.com/inakadegaebal/items/be9fecce813cebec5986

Dockerのパッケージは執筆時点では以下の通りでしたので、最新版（18.03.0）を導入しました。

```
[root@centos74-docker ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
利用可能なパッケージ
読み込んだプラグイン:fastestmirror, langpacks
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable


[root@centos74-docker ~]# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2018-04-01 18:25:39 JST; 1min 43s ago
     Docs: https://docs.docker.com
 Main PID: 5244 (dockerd)
   Memory: 49.8M
   CGroup: /system.slice/docker.service
           ├─5244 /usr/bin/dockerd
           └─5248 docker-containerd --config /var/run/docker/containerd/containerd.toml

 4月 01 18:25:35 centos74-docker dockerd[5244]: time="2018-04-01T18:25:35.656787401+09:00" level=info msg="Loading containers: start."
 4月 01 18:25:37 centos74-docker dockerd[5244]: time="2018-04-01T18:25:37.598452144+09:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon optio...d IP address"
 4月 01 18:25:38 centos74-docker dockerd[5244]: time="2018-04-01T18:25:38.967115625+09:00" level=info msg="Loading containers: done."
 4月 01 18:25:39 centos74-docker dockerd[5244]: time="2018-04-01T18:25:39.170452711+09:00" level=info msg="Docker daemon" commit=0520e24 graphdriver(s)=overlay2 version=18.03.0-ce
 4月 01 18:25:39 centos74-docker dockerd[5244]: time="2018-04-01T18:25:39.171334883+09:00" level=info msg="Daemon has completed initialization"
 4月 01 18:25:39 centos74-docker dockerd[5244]: time="2018-04-01T18:25:39.344098963+09:00" level=info msg="API listen on /var/run/docker.sock"
 4月 01 18:25:39 centos74-docker systemd[1]: Started Docker Application Container Engine.
 4月 01 18:25:57 centos74-docker dockerd[5244]: time="2018-04-01T18:25:57+09:00" level=info msg="shim docker-containerd-shim started" address="/containerd-shim/moby/da1dff6785b1f98fe76607ca5...sks" pid=5381
 4月 01 18:25:59 centos74-docker dockerd[5244]: time="2018-04-01T18:25:59+09:00" level=info msg="shim reaped" id=da1dff6785b1f98fe76607ca54472c2b5dde531db6caea92fdd594a5c57394dc module="containerd/tasks"
 4月 01 18:25:59 centos74-docker dockerd[5244]: time="2018-04-01T18:25:59.266404647+09:00" level=info msg="ignoring event" module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
Hint: Some lines were ellipsized, use -l to show in full.
```


# ３．DockerにApache（httpd）をセットアップ
これだけではどうなっているかよく分からないので、オーソドックスにApacheを導入してみました。
こちらの「docker コンテナの作成・実行」から参考にさせて頂きました。
（fnyaさん）
http://fnya.cocolog-nifty.com/blog/2016/03/centos7-docker-.html


httpdという名前でイメージを作成して動かすように変更しています。

```
[root@centos74-docker home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a0db7f26d277        centos              "/bin/bash"         8 minutes ago       Exited (1) 12 seconds ago                       centos7
da1dff6785b1        hello-world         "/hello"            30 minutes ago      Exited (0) 30 minutes ago                       practical_ptolemy
[root@centos74-docker home]# docker commit centos7 httpd
sha256:1fd7501390ba665118cd2dbf9554a6518e8f8a4e4cfdafa7bbd2fc807702c779
[root@centos74-docker home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
a0db7f26d277        centos              "/bin/bash"         10 minutes ago      Exited (1) About a minute ago                       centos7
da1dff6785b1        hello-world         "/hello"            31 minutes ago      Exited (0) 31 minutes ago                           practical_ptolemy
[root@centos74-docker home]# 
[root@centos74-docker home]# 
[root@centos74-docker home]# docker run --privileged -d -p 80:80 --name httpd httpd /sbin/init
9f8db5a1dec893bb890b1e56f4db5571acad0ff80dc2d4e247dc6386c53d6a0f
[root@centos74-docker home]# docker exec -it httpd /bin/bash
[root@9f8db5a1dec8 /]# systemctl enable httpd.service
[root@9f8db5a1dec8 /]# systemctl start httpd.service
[root@centos74-docker home]# curl -s http://localhost/ | head -n 1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
[root@centos74-docker home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS                NAMES
9f8db5a1dec8        httpd               "/sbin/init"        About a minute ago   Up About a minute           0.0.0.0:80->80/tcp   httpd
a0db7f26d277        centos              "/bin/bash"         14 minutes ago       Exited (1) 5 minutes ago                         centos7
da1dff6785b1        hello-world         "/hello"            35 minutes ago       Exited (0) 35 minutes ago                        practical_ptolemy
```

curlコマンドの結果でhttpのレスポンスが返ってきているので動作しているのは明白ですが、一応ブラウザでもチェック。

![centos_docker_httpd_20180401.png](https://qiita-image-store.s3.amazonaws.com/0/177419/bb8d3384-34f8-978f-deae-fef3ee2e3770.png)

無事トップページを見ることができました。

# ４．Dockerコマンド他

### Dockerへのログイン

```
[root@centos74-docker home]# docker exec -it httpd /bin/bash
[root@9f8db5a1dec8 /]# ps -ef | grep httpd
root        50     1  0 10:00 ?        00:00:01 /usr/sbin/httpd -DFOREGROUND
apache      64    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      66    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      67    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      68    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      69    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     103    50  0 10:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     104    50  0 10:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     105    50  0 10:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root       120   106  0 11:17 pts/1    00:00:00 grep --color=auto httpd
```

### Dockerからのログアウト

```
[root@centos74-docker home]# docker exec -it httpd /bin/bash
[root@9f8db5a1dec8 /]# ps -ef | grep httpd
root        50     1  0 10:00 ?        00:00:01 /usr/sbin/httpd -DFOREGROUND
apache      64    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      66    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      67    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      68    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      69    50  0 10:00 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     103    50  0 10:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     104    50  0 10:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache     105    50  0 10:03 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root       120   106  0 11:17 pts/1    00:00:00 grep --color=auto httpd

[root@9f8db5a1dec8 /]# read escape sequence　（「Ctrl+p」+「Ctrl+q」を押下でログアウト）
[root@centos74-docker home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS                NAMES
9f8db5a1dec8        httpd               "/sbin/init"        2 hours ago         Up 2 hours               0.0.0.0:80->80/tcp   httpd
a0db7f26d277        centos              "/bin/bash"         2 hours ago         Exited (1) 2 hours ago                        centos7
da1dff6785b1        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                        practical_ptolemy
```

### Dockerのスタート・ストップ

```
docker start ｛コンテナー名｝|｛コンテナーID｝ 
docker stop ｛コンテナー名｝|｛コンテナーID｝


[root@centos74-docker home]# docker stop httpd
httpd
[root@centos74-docker home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
9f8db5a1dec8        httpd               "/sbin/init"        2 hours ago         Exited (137) 9 seconds ago                       httpd
a0db7f26d277        centos              "/bin/bash"         3 hours ago         Exited (1) 3 hours ago                           centos7
da1dff6785b1        hello-world         "/hello"            3 hours ago         Exited (0) 3 hours ago                           practical_ptolemy
[root@centos74-docker home]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

# dokcer ps は稼働中のモノだけみせてくれるそうです。

[root@centos74-docker home]# docker start httpd
httpd
[root@centos74-docker home]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
9f8db5a1dec8        httpd               "/sbin/init"        2 hours ago         Up 5 seconds        0.0.0.0:80->80/tcp   httpd
[root@centos74-docker home]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS                NAMES
9f8db5a1dec8        httpd               "/sbin/init"        2 hours ago         Up 10 seconds            0.0.0.0:80->80/tcp   httpd
a0db7f26d277        centos              "/bin/bash"         3 hours ago         Exited (1) 3 hours ago                        centos7
da1dff6785b1        hello-world         "/hello"            3 hours ago         Exited (0) 3 hours ago                        practical_ptolem
```

# 今後の学習
Webサーバは導入できたので、今後はアプリケーションサーバやDBなどを導入して遊んでみたいと思います。
また、アップデート差分の抜き出し・反映や別の環境へのインポートなど。