macのdockerでLAMP環境を作る

macでdockerを使ったLAMPの開発環境を作ったのでメモ

#やりたいこと
dockerで「apache+php」のアプリコンテナ、mysqlのDBコンテナphpmyadminを入れるコンテナの３個のコンテナを作ります。



|![httpd_logo_wide_new.png](https://qiita-image-store.s3.amazonaws.com/0/60207/52b81d90-8614-90ec-d6e1-1bc99bf44088.png)  | ![PHP-logo.svg.png](https://qiita-image-store.s3.amazonaws.com/0/60207/970ba351-4771-0b7a-e1b8-6e99a7de5106.png) | ![MySQL.svg.png](https://qiita-image-store.s3.amazonaws.com/0/60207/1c22d1ea-cdbf-ef66-7dfe-a7b0c7a085f1.png)  |
|---|---|---|---|---|---|表示が省略されている列であれば、アラインメント行は好きに書いてよい。|

![docker.png](https://qiita-image-store.s3.amazonaws.com/0/60207/db1fde63-d883-d494-ed92-abfd75b2f9c1.png)

#前提
DockerHubのアカウントを作成しておく
DockerHubとはなんぞやとかはこちらを参考に
http://knowledge.sakura.ad.jp/tech/2210/


#１.dockerのインストール
DockerToolboxというのがあってVirtualboxとか一式が入っていて簡単に環境設定できるツールを入れますが、OSX Sierraだとインストーラーが途中で止まって入りませんでした。
https://www.docker.com/products/docker-toolbox

なので、DockernとVirtualBoxを入れます。
https://docs.docker.com/docker-for-mac/
https://www.virtualbox.org/wiki/Downloads

#2.アプリケーションコンテナ(apacheとphp)の作成
###1.centosイメージのダウンロード
バージョン7もありますが、今回は6にしました。
`$ docker pull centos:6 `

###2.ダウンロードしたイメージの確認
```shell
$ docker images
REPOSITORY  TAG       IMAGE ID        CREATED      SIZE
centos6     latest    xxxxxxxxxxx    12 days ago  611.9 MB
```

###3.コンテナを作成して起動
`$ docker run -it --name app -p 8080:80 -v /Users/xxxx/source:/share centos:latest`
※_-nameでコンテナ名をつける。_
※_-vでホストとコンテナの共有フォルダを決める。_
※_-pでポートフォワード(今回はホストPCのブラウザから8080で接続するとコンテナへ80ポートに変換して渡す)_

###4.コンソールでログイン
`$ docker exec -it app bash`
ここからは通常のcentosと一緒。apacheとphpをインストールする(手順割愛)

###5.接続確認
ホストPCのブラウザから
http://localhost:8080


##3.apacheとphpを入れたイメージを作る
コンテナを削除した際にせっかく設定した環境がなくなるので、imageを作成したdockerHubにおいておく

###1.起動しているコンテナIDを確認
```shell
$ docker ps
CONTAINER ID    IMAGE     COMMAND    CREATED      STATUS       PORTS       NAMES
xxxxxxxxx     centos6      "bash"   11 days ago   Up 4 days    0.0.0.0:8080->80/tcp   apps
```

###2.コンテナからイメージの作成
`$ docker commit (コンテナID) (DockerHubユーザ名)/(イメージ名):(バージョン)`

###3.コンテナの停止と削除
`$ docker stop (コンテナID）`
`$ docker rm -f (コンテナID）`

###4.古いイメージの削除
ダウンロードしてきたcentosのイメージが不要であれば削除
`$ docker rmi (イメージID）`

作成したイメージからのコンテナはまだ起動しないでおく
※mysqlコンテナを作成した後に接続情報を付加して起動するため

##4.docker hubへimageをアップロード
###1.イメージをタグつけ
`$ docker tag (イメージID) (DockerHubユーザ名)/(イメージ名):(バージョン)`
###2.docker hubへpush
ログイン
`$ docker login`
ログインユーザの情報確認
`$ docker info`
push!
`$ docker push (DockerHubユーザ名)/(イメージ名):(バージョン)`

##5.mysqlコンテナの作成
###1.mysqlイメージのダウンロード
`$ docker pull mysql `

###2.コンテナ作成と起動
アプリコンテナ同様に起動。起動時にmysqlのパスワードを設定
`$ docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:latest -p 3906:3306`

※注意！　mysqlのデータは永続化されないのでバックアップを行うこと。docker runでコンテナ作り直すとデータが初期化されます。
もしくは、-vでボリュームマウントするかです。
http://qiita.com/74th/items/41393f506d223850f2c3

##6.phpmyadminの作成
###1.phpmyadminイメージのダウンロード
`$ docker pull phpmyadmin/phpmyadmin`

###2.コンテナの作成と起動
`$ docker run --name phpmyadmin -d -e PMA_HOST=mysqlのIP -p 8090:80 phpmyadmin/phpmyadmin`

作成したmysqlのIPを指定して作成・起動

http://localhost:8090
でアクセス確認

##7.appサーバとdbサーバの接続
###1.アプリコンテナをDBにリンクさせて作成と起動
`docker run -it --name app --link mysql:latest -d -p 8080:80 -v /Users/xxxx/source:/share centos:latest`
--linkでmysqlとリンクさせて起動

###2.接続確認
アプリコンテナにログインしてmysqlコマンドから接続確認
`$ docker exec -it app bash`

###3.コンテナの起動状態を確認

```shell
$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                  NAMES
xxxxxxx        phpmyadmin/phpmyadmin          "/run.sh phpmyadmin"     11 days ago         Up 4 days           0.0.0.0:8090->80/tcp   phpmyadmin
xxxxxxx        user/centos6_httpd_php54:1.0   "bash"                   11 days ago         Up 4 days           0.0.0.0:8080->80/tcp   cmsapps
xxxxxxx        mysql:latest                   "docker-entrypoint.sh"   12 days ago         Up 4 days           3306/tcp               mysql
```

次回からはmysql→phpmyadminもしくはcentosの順でdocker startで起動すればOK!

#参考サイト
http://www.atmarkit.co.jp/ait/articles/1408/26/news038.html
http://knowledge.sakura.ad.jp/tech/2210/
http://qiita.com/74th/items/41393f506d223850f2c3