Dockerを使用したAmazonLinuxの開発環境作成

## はじめに
Dockerを使用してAmazonLinuxの開発環境（Nginx+PHP56+PHP-fpm-5.6）を作ろうとした際の自分のメモになります。
最終的にはEc2 Container Serviceでレポジトリの登録まで行います。
※今回の目標はvagrantと同じように使うことを想定します。

環境
 MAC 10.10.5
 Docker V 1.12.3-beta30

前提
 AWS CLIのインストール
 Ec2 Container Serviceでレポジトリの作成

## 概要
以下を参考にしました。わかりやすくて感謝です。
[参考リンク：Amazon Linuxがコンテナ化されたので、Macで動かしてみた。](http://qiita.com/taishin/items/1305d4f97ffe08e24bb0)

----
#### Step1 ログイン
とりあえずAmazonLinuxのイメージをPullする為にログインをします。

```
$ aws ecr get-login --region ap-northeast-1 --registry-ids 137112412989

docker login -u AWS -p XXXXXXXXXX（省略！） -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com

```
ログインする為の情報がでますので、その内容をコピペし実行します。

```
$docker login -u AWS -p XXXXXXXXXX（省略！） -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
```
これでログイン完了です。

----
#### Step2 Dockerのイメージをpull
Docker のイメージをPullします。

```
$ docker pull 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest  
latest: Pulling from amazonlinux
e2daa1633485: Pull complete 
Digest: sha256:939657b06a824c58f1532b104ba423c0c5efc16552c01427d96e9da20f8b2680
Status: Downloaded newer image for 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest
$ docker images   
REPOSITORY                                                      TAG                 IMAGE ID            CREATED             SIZE
137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux   latest              feee9aea7094        11 days ago         328.3 MB
```


----
#### Step3 Dockerのイメージの起動
Dockerのイメージを起動します。

```
$ docker run -it 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest /bin/bash
bash-4.2# 
```

----
#### Step4 SSH等をインストール
Dockerfileでbuildすればいいですが、今回は手動でやります。
なんとなくよく使っているのを入れときます。

```
$ yum -y install openssh-server openssh vim wget nginx
```

ついでにec2-userと同じことができるようなユーザを作成しておきます。

```
bash-4.2# useradd -g nginx -s /bin/bash devel
bash-4.2# yum -y install sudo
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest                                                                                           | 2.1 kB     00:00     
amzn-updates/latest                                                                                        | 2.3 kB     00:00     
Resolving Dependencies
--> Running transaction check
：
Dependency Installed:
  vim-minimal.x86_64 2:7.4.1967-1.42.amzn1                                                                                        

Complete!
bash-4.2# echo "# devel " > /etc/sudoers.d/devel
bash-4.2# echo "devel ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/devel
bash-4.2# su - devel
Last login: Fri Nov 11 02:17:54 UTC 2016 on console
[devel@e17d83813adc ~]$ sudo su -
-bash-4.2# 

```

PEMでログインできるようにします。

```
[devel@e17d83813adc ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/devel/.ssh/id_rsa): 
Created directory '/home/devel/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/devel/.ssh/id_rsa.
Your public key has been saved in /home/devel/.ssh/id_rsa.pub.
The key fingerprint is:
df:f9:aa:9a:d8:bc:14:b5:03:8f:3f:eb:bc:f8:c8:f2 devel@e17d83813adc
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|        . .      |
|         = .     |
|        S +      |
|         + o .   |
|        . + o    |
|      .* = o .   |
|      .oE=Bo...  |
+-----------------+
[devel@e17d83813adc .ssh]$ ls
id_rsa  id_rsa.pub
[devel@e17d83813adc .ssh]$ mv id_rsa.pub authorized_keys

```

※id_rsaがpemになります。


----
#### Step5 PHP・nginx・mysqlをインストール
Dockerfileでbuildすればいいですが、今回は手動でやります。

```
bash-4.2# yum install php56 php56-mbstring php56-pdo php56-ldap php56-xml php56-mcrypt php56-gd php56-imap php56-pecl-imagick php56-pecl-apc php56-jsonc php56-fpm php56-mysqlnd curl-devel mysql-server mysql nginx
```

ちなみにnginxはこのままだと起動できませんでした。以下の追加が必要です。

参考
[/etc/sysconfig/network: No such file or directory](http://qiita.com/mats116/items/59615a169a45884c2548)

```
-bash-4.2# echo "NETWORKING=yes" >/etc/sysconfig/network
```

----
#### Step6 monit 設定
このまま起動してもchkconfigの設定は無効なのでmonitを使用してデーモンの常駐させます。

```
bash-4.2# yum install monit
```

nginx,mysqld,sshd,php-fpm-5.6を監視させ起動させるようにする。

```
bash-4.2# cat /etc/monit.d/sshd.conf
check process sshd
    with pidfile "/var/run/sshd.pid"
    start program "/etc/init.d/sshd start"
    stop program "/etc/init.d/sshd stop"
    if failed port 22 protocol ssh then restart
    if 5 restart within 5 cycles then alert
bash-4.2# cat /etc/monit.d/nginx.conf
check process nginx
    with pidfile "/var/run/nginx.pid"
    start program "/etc/init.d/nginx start"
    stop program "/etc/init.d/nginx stop"
    if failed port 80 protocol http
       then restart
    group nginx 
bash-4.2# cat /etc/monit.d/mysqld.conf
check process mysqld
    with pidfile "/var/run/mysqld/mysqld.pid"
    start program "/etc/init.d/mysqld start"
    stop program "/etc/init.d/mysqld stop"
    if failed unixsocket /var/lib/mysql/mysql.sock then restart
    if 5 restarts within 5 cycles then timeout
bash-4.2# cat /etc/monit.d/php-fpm-5.6.conf
check process php-fpm-5.6
    with pidfile /var/run/php-fpm/php-fpm-5.6.pid
    start program = "/etc/init.d/php-fpm-5.6 start" with timeout 60 seconds
    stop program  = "/etc/init.d/php-fpm-5.6 stop"
    if failed unixsocket /var/run/php-fpm/php-fpm.sock then restart
    if 5 restarts within 5 cycles then timeout
```

起動用のシェルを書き、docker起動時にそれを読ませる。
※rmはしなくてもOK。イメージ保存した時に起動してたので存在してただけです・・・

```
bash-4.2# cat /bin/init 
#!/bin/bash
rm -fr /var/run/php-fpm/php-fpm-5.6.pid
rm -fr /var/run/php-fpm/php-fpm.sock 
/sbin/service monit start
/bin/bash
bash-4.2# chmod 755 /bin/init 
```


参考
[MonitでSSH,Nginx,MySQLのサービス死活監視を行うChef Cookbook](http://easyramble.com/chef-monit-ssh-nginx-mysql.html)
[Dockerでmonitを動かす(NginxとPHP(hhvm)とMySQL)](http://easyramble.com/chef-monit-ssh-nginx-mysql.html)

----
#### Step7 インストール後の設定
これでだいたいのインストール物は入ったはずなのであとは設定するだけ。
こちらはそれぞれだと思いますので割愛します。
（そのうち書くかも？）

----
#### Step8 最後にコミット

まずコンソールから抜けるのでctrl+qをします。
docker ps を使用しコンテナIDを調べます。

```
bash-4.2#
(ctrl + q)

$ docker ps -a
```

コミットを行いタグをつけます。containerName,imageNameは適当につけてください。

```
$ docker commit コンテナID containerName
$ docker tag containerName [自分のEc2 Container Serviceのレポジトリ]:imageName
```

Pushします。

```
$ docker push [自分のEc2 Container Serviceのレポジトリ]:imageName
The push refers to a repository [自分のEc2 Container Serviceのレポジトリ]
a9a8a5248aca: Pushed 
b7f26e1ed260: Layer already exists 
fcce637aae97: Layer already exists 
imageName: digest: sha256:XXXXXXXXXXX size: 5314
```


## あとがき
次回起動する時は以下で起動して下さい。

```
$ docker run -i -d -p 8080:80 -p 10022:22 -t [自分のEc2 Container Serviceのレポジトリ]/test/repo:base-set1
```

pullしてとってきた場合は以下のような感じかな。

```
$ docker run -i -d -p 8080:80 -p 10022:22 -t [自分のEc2 Container Serviceのレポジトリ]:imageName
```

Webは以下でアクセスできます。
https://localhost:8080 

またSSHアクセスは以下の通りとなります。

```
$ ssh -p 10022 -i id_rsa devel@localhost
```

## その他
参考
[Amazon Linuxがコンテナ化されたので、Macで動かしてみた。](http://qiita.com/taishin/items/1305d4f97ffe08e24bb0)
[/etc/sysconfig/network: No such file or directory](http://qiita.com/mats116/items/59615a169a45884c2548)
[MonitでSSH,Nginx,MySQLのサービス死活監視を行うChef Cookbook](http://easyramble.com/chef-monit-ssh-nginx-mysql.html)
[Dockerでmonitを動かす(NginxとPHP(hhvm)とMySQL)](http://easyramble.com/chef-monit-ssh-nginx-mysql.html)

#### 修正履歴
2016/12/01 見返して少しわかりずらかったので修正。