Docker for Macで開発環境を構築してみた

[Docker Advent Calendar 2016](http://qiita.com/advent-calendar/2016/docker) 3日目の記事です。
そして実は私の初投稿記事です。よろしくお願いします:bow:

## やったこと
* Vagrantで作っていた開発環境をDockerに変えてみた

## 動機
* 最近周りで「Dockerが〜」、「Dockerの～」とやたら名前を聞くようになった。
* そんなに良いならとりあえず使ってみるか。
* 特にVagrantに不満があったわけではないが、強いて言えば起動が遅いので早くなるといいなぁという感じ

## Docker for Macの導入
というわけで早速進めていきます。
まずはインストールします。下記コマンドで特に問題起きずにインストールできました。

```
brew cask install docker
```

Launchpadの中にクジラがいるのでクリックしてみると…
![スクリーンショット 2016-12-03 7.47.41.png](https://qiita-image-store.s3.amazonaws.com/0/119556/4d49ab31-65c7-c39f-e5ba-f4759e361d4d.png "スクリーンショット 2016-12-03 7.47.41.png")
おぉ、無事にインストールできてる。（かわいい…）
Nextを押すと
![スクリーンショット 2016-12-03 7.52.35.png](https://qiita-image-store.s3.amazonaws.com/0/119556/fdcdb995-a732-5b63-5a87-d21b243182ed.png "スクリーンショット 2016-12-03 7.52.35.png")
ネットワークコンポーネントとDockerアプリケーションへのリンクをインストールするために権限くれと言ってくるのであげる。（目が…怖い…）


![スクリーンショット 2016-12-03 8.01.51.png](https://qiita-image-store.s3.amazonaws.com/0/119556/95f83e0f-8604-d582-2f21-e5b3db1accef.png "スクリーンショット 2016-12-03 8.01.51.png")
そうすると上部メニューバーにクジラが出現する。これでDocker起動できている状態の模様。（やっぱりかわいい…）
コマンドラインからversionを確認してみる

```
$ docker version
Client:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 23:26:11 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.12.3
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   6b644ec
 Built:        Wed Oct 26 23:26:11 2016
 OS/Arch:      linux/amd64
```
インストールできた！

## なにはともあれHelloWorld
何事も挨拶からということでとりあえずHelloWorldします

```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
```
ということで挨拶完了！
以下のコマンドで実行履歴が確認できる

```
docker ps --all
```

imagesにhello-worldが入っていることも一応確認

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              c54a2cc56cbb        5 months ago        1.848 kB
```

## 開発環境構築
いよいよ開発環境を構築していきます。なお、私の場合はCentOSを使う事が多いのでCentOS6系を構築してみます。
ローカル環境からansibleで環境構築したいので、sshできるようコンテナを作ります。
まずはCentOSのイメージをとってくる

```
docker pull centos:6.8
```

次に適当な作業ディレクトリを作ってDockerfileを作成。

```
FROM centos:6.8

ENV container docker

RUN \
  (echo 'include_only=.jp' >>/etc/yum/pluginconf.d/fastestmirror.conf) \
  && yum -y update \
  && yum -y reinstall glibc-common \
  && yum clean all \
  && cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ENV LANG ja_JP.UTF-8

RUN \
  yum -y install openssh-server openssh-clients passwd sudo \
  && yum clean all \
  && sed -ri 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config \
  && sed -ri 's/^GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_config \
  && sed -ri 's/^UsePrivilegeSeparation sandbox/UsePrivilegeSeparation no/' /etc/ssh/sshd_config \
  && sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config \
  && chkconfig sshd on

RUN \
  (echo "root" | passwd root --stdin) \
  && groupadd docker \
  && useradd -g docker docker \
  && (echo "docker" | passwd docker --stdin) \
  && sed -i 's/Defaults.*requiretty/#Defaults requiretty/g' /etc/sudoers \
  && ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key \
  && ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key \
  && sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd \
  && (echo "docker ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/docker)

CMD ["/sbin/init"]
```
こんな感じ。
そのディレクトリ内で下記のコマンドを実行

```
$ docker build --rm -t local/centos6 .
```
* --rm でビルド成功後、中間コンテナを削除する
* -t は作成するDockerイメージのイメージ名およびタグ名を指定する

すると新しいイメージができます。

```
 $docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
local/centos6       latest              1692f69b43bf        8 seconds ago       639.4 MB
```

CentOSコンテナを起動します。

```
docker run -d -p 22 -p 80 local/centos6 /sbin/init
```
* -pで指定したportへのport forward
* -dでコンテナをバックグラウンドで動かす

ポート情報をdocker psで確認する

```
 $docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
a34bbea488d2        local/centos6       "/sbin/init"        5 seconds ago       Up 4 seconds        0.0.0.0:32770->22/tcp, 0.0.0.0:32769->80/tcp   ecstatic_mayer
```

よし、sshします。（root/rootでログインする）

```
 $ssh -p 32770 root@127.0.0.1
root@127.0.0.1's password:
Last login: Sat Dec  3 13:03:58 2016 from 172.17.0.1
[root@a34bbea488d2 ~]#
```

できました！次にローカルからansibleも流します。

```
$ ansible-playbook -i "127.0.0.1:32770," -u root -k develop.yml
```
このplaybookは、LAMP環境をインストールするように作ったものです。
本当はコンテナを分けたほうがいいんだろうけど、今回は開発環境の移行なのでこれでいきます。
問題なく実行できたので、後は適当なファイルを/var/www/html配下においてブラウザからアクセスしてみる

![スクリーンショット 2016-12-03 13.41.31.png](https://qiita-image-store.s3.amazonaws.com/0/119556/d5c54ddd-a95e-c1c1-305c-44f3599dfa0b.png "スクリーンショット 2016-12-03 13.41.31.png")

ということでまだ改善点はあるけど、とりあえず開発環境が出来ました。

## 参考情報
大変参考にさせて頂きました。ありがとうございました。
[Docker for Mac](https://docs.docker.com/engine/installation/mac/)
[MacにインストールしたDocker上のCentOSでTomcatを動かす](http://qiita.com/taichisasaki/items/6bd187060863e1a3813a)
[Docker で SSH 接続可能なコンテナ (CentOS) を作成する](http://qiita.com/comutt/items/1251cc19885947cd6d3d)
[docker buildのオプションまとめ](http://qiita.com/Gin/items/dde3c3085f13f0a45c40)
[Dockerでagent forwardingが有効な開発環境の構築 (OS X)](http://ykicisk.hatenablog.com/entry/2016/04/09/213310)
[Dockerfileとdocker buildコマンドでDockerイメージの作成](http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html)
[Dockerで固定IPアドレスを使う。](http://qiita.com/paihu/items/17aa47906dd2bf935a25)
[docker runの便利なオプション](http://qiita.com/umchifre/items/31d9533049c591569279)
[Dockerで立てたコンテナにsshで接続する](http://blog.shibayu36.org/entry/2013/12/07/233510)