CentOS7 (vagrant) に docker をインストールして nginx で hello world するまで


CentOS7 (vagrant) に docker をインストールして nginx で hello world するまでの記録です。
CentOS7 が vagrant up されていることが前提です。

# docker インストール

[公式](https://docs.docker.com/engine/installation/linux/centos/) にあったワンライナーでインストール後、起動します。
なお、このワンライナーは `/etc/yum.repos.d/docker.repo` を自動で作成してくれます。

```
$ curl -fsSL https://get.docker.com/ | sh
$ systemctl start docker.service
```

↓ インストール中のログ

```
[vagrant@localhost ~]$ curl -fsSL https://get.docker.com/ | sh
+ sudo -E sh -c 'sleep 3; yum -y -q install docker-engine'
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/docker-main-repo/packages/docker-engine-selinux-1.10.0-1.el7.centos.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 2c52609d: NOKEY
docker-engine-selinux-1.10.0-1.el7.centos.noarch.rpm の公開鍵がインストールされていません
Importing GPG key 0x2C52609D:
 Userid     : "Docker Release Tool (releasedocker) <docker@docker.com>"
 Fingerprint: 5811 8e89 f3a9 1289 7c07 0adb f762 2157 2c52 609d
 From       : https://yum.dockerproject.org/gpg
Created symlink from /etc/systemd/system/sysinit.target.wants/lvm2-lvmpolld.socket to /usr/lib/systemd/system/lvm2-lvmpolld.socket.

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker vagrant

Remember that you will have to log out and back in for this to take effect!
```

非 root ユーザで docker コマンドを使うにはコマンドを叩くように言われているので、ついでに実行しておきます。

```
$ sudo usermod -aG docker vagrant
```

docker のバージョンは以下のようになりました。

```
[vagrant@localhost docker]$ docker version
Client:
 Version:      1.10.0
 API version:  1.22
 Go version:   go1.5.3
 Git commit:   590d5108
 Built:        Thu Feb  4 18:34:50 2016
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

# Dockerfile の作成

[こちら](http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html)を参考にしながら、適当なディレクトリを作り、Dockerfile を作成します。

```
[vagrant@localhost docker]$ tree
.
├── Dockerfile
└── index.html

0 directories, 2 files
```

`Dockerfile` の中身はこんな感じです。

``` Dockerfile
FROM centos
MAINTAINER hoge hoge@hoge.hoge
RUN yum install -y epel-release
RUN yum install -y nginx
ADD index.html /usr/share/nginx/html/

EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]
```

GPGキーでWARNING出ましたが、ここでは一旦無視。  

* `FROM` はイメージ名。ローカルになければ dockerhub から取ってくる
* `MAINTAINER` はメンテナの名前とメールアドレスを記入
* `RUN` はイメージ起動後に実行するコマンド
* `ADD` はファイルを指定したパスに配置
* `EXPOSE` は Listen するポート
* `ENTRYPOINT` は docker run 時に実行するコマンド

`index.html` には *hello world* とだけ書いておきました。

# docker build

build します。

```
$ sudo docker build -t centos/nginx:1.0 .
```

* `-t` は image にタグを打つオプション
  * `centos/nginx` は REPOSITORY 名
  * `:1.0` は TAG 名
* 最後の引数に Dockerfile のあるディレクトリを指定

build が成功すると image ができあがります。

```
[vagrant@localhost docker]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos/nginx        1.1                 80d766bb9338        About an hour ago   356 MB
centos/nginx        1.0                 d1345ae2d9a6        9 hours ago         356 MB
centos              latest              61b442687d68        6 weeks ago         196.6 MB
hello-world         latest              690ed74de00f        3 months ago        960 B
```

# docker 実行

build したイメージを実行します。

```
$ sudo docker run -d -p 80:80 centos/nginx:1.1
753d92d2bf360a529e881efaee564f86840e8d2d649f20825a7132093b45683e
```

* `-d` は docker をバックグラウンド実行
* `-p` はポートフォワード設定。 `ローカル側:docker側` の順番
* 実行後の標準出力はコンテナID

```
 sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
753d92d2bf36        centos/nginx:1.1    "/usr/sbin/nginx -g '"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   determined_tesla
```

コンテナの停止、削除はこのコンテナIDを利用します。  
  
コンテナの中に入ってシェル操作するには以下のオプションで `docker run` します。

```
$ sudo docker run -it --entrypoint "/bin/bash" centos/nginx:1.2
[root@920ea5c72a47 /]# 
```

* `--entrypoint` を指定することで Dockerfile の ENTRYPOINT を上書き

# 確認

これで nginx が起動したので、index.html が見えるはずです。

```
$ curl -s localhost
hello world
```

見えました。  
ブラウザから確認する場合は vagrant の ip アドレスを指定するとよいでしょう。

![Screenshot-3.png](https://qiita-image-store.s3.amazonaws.com/0/11541/9ed1b784-f945-0ce8-80cf-42dd82ec630f.png)

# コンテナの停止・削除

コンテナを停止するには以下のコマンドを実行します。

```
$ sudo docker stop *コンテナID*
```

コンテナを削除するには以下のコマンドを実行します。

```
$ sudo docker rm *コンテナID*
```

コンテナが増えると停止がめんどうなので、for 文でぐるぐるしたり。

```
$ for p in $(sudo docker ps -a -q); do sudo docker rm -f ${p}; done
```

# image の削除

image の削除は以下のコマンドを実行します。

```
$ sudo docker rmi *イメージID*
```

コンテナ実行中は削除できないので注意。

以上、ここまでdesu。

# 参考

参考にさせていただきましたm(__)m

https://docs.docker.com/engine/installation/linux/centos/
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
http://qiita.com/hihihiroro/items/d7ceaadc9340a4dbeb8f
http://heartbeats.jp/hbblog/2014/07/3-tips-for-nginx-on-docker.html
http://qiita.com/kasaharu/items/d4654193d75c67d65226
http://qiita.com/hnakamur/items/afddaa3dbe48ad2b8b5c