「「DockerでWordPressサイトを開発してみよう」を読んでみよう」を読んで、自分なりにまとめてみた。

https://qiita.com/kobori_akira/items/ce9a4bcf737e2fee929e
↑の記事を読み、自分なりにDockerについてまとめてみるついでにdocker-composeも軽く触ってみました。

#Dockerの登場人物 
* Dockerﬁle
  * コンテナで実行することや設定を書くファイルです
* Dockerイメージ 
  * Dockerﬁleをもとにつくられた仮想環境のファイルです
* Dockerコンテナ
  * Dockerイメージを「コンテナ」として動かします
  * <font color="orange">削除するとその状態は失われます</font>
  
# Dockerのメリット
* サーバの状態をコードで管理できる 
    * 「どんなコマンドを実行するか」「どのファイルを サーバに配置するか」などをDockerﬁleに書く
* 「サーバの状態」をアプリのコードと同じようにバージョン管理システムで管理できる 
    * 今まで手作業で構築していたものを、自動で作成できる!
* 起動が高速 
    * 実行したコマンドはキャッシュされる –  2度目以降の環境作成が超高速
* 環境の共有が手軽
    * Dockerﬁleが1つあればOK
        * Docker Hub Registry
        
# 3分でWordPressの環境を構築

```
docker image pull tutum/wordpress:latest
 
docker container run -d -p 80:80 --name=wordpress tutum/wordpress
```

wordpressに適当に情報を入力して管理画面まで行く。

※↓Dockerの仕組みの図はこれが一番分かりやすい気がします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149791/4edb1320-b119-ce83-7a99-69929c63d7b8.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149791/57582ea3-946a-e9e9-aeea-9a6c63b5eefa.png)



* -dオプション
    * デタッチド・モードで実行を指定する。
   「デタッチド・モード」とは、バックグラウンドで実行すること。つまりは、コンソールに出力が表示されないことを指す。
* -pオプション
    * コンテナにポートフォワーディングでアクセスできるようにさせる。
ポートフォワーディングとは、ローカルの特定のポートへの通信を、別のIPアドレスの特定のポートに飛ばすこと。
この場合だと、localhostのポート番号80にアクセスすると、それはコンテナ（が管理するWebサーバApache）のポート番号80に飛ぶ。
* --nameオプション
    * コンテナの名前を決める。このオプションをつけない場合は、コンテナ名はランダムな英単語がつけられる。


起動しているコンテナを確認

`docker container ls`

Q：コンテナのデータは消えるか？

コンテナを停止
`docker container stop (id or name)`
A:消えない

コンテナスタート
`docker container start`

コンテナリスタート
`docker contaienr restart`
A:消えない

コンテナ削除
`docker container rm `
A:消える


# Docker Compose 概要
> Docker compose とは、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。
Docker compose では、compose ファイルを用意してコマンドを1 回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。

最初に起動したWordpressをdocker-compose.ymlにまとめる。
こうすると毎回起動するときに長いオプションを打たなくて済む。

```yaml:docker-compose.yml
version: '3'
services:
    wordpres:
      image: tutum/wordpress:latest
      container_name: wordpress
      ports:
        - 80:80
```
`docker-compose up `で起動



## tutum/wodpress のDockerfileを確認する

https://github.com/mookjp/tutum-docker-wordpress/blob/master/Dockerfile

```dockerfile

FROM tutum/lamp:latest
MAINTAINER Fernando Mayo <fernando@tutum.co>, Feng Honglin <hfeng@tutum.co>
 
# Install plugins
RUN apt-get update && \
  apt-get -y install php5-gd && \
  rm -rf /var/lib/apt/lists/*
 
# Download latest version of WordPress into /app
RUN rm -fr /app && git clone --depth=1 https://github.com/WordPress/WordPress.git /app
 
# Configure WordPress to connect to local DB
ADD wp-config.php /app/wp-config.php
 
# Modify permissions to allow plugin upload
RUN chown -R www-data:www-data /app/wp-content /var/www/html
 
# Add database setup script
ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh
ADD create_db.sh /create_db.sh
RUN chmod +x /*.sh
 
EXPOSE 80 3306
CMD ["/run.sh"]
```

>tutum/lamp のDockerfile
https://github.com/tutumcloud/lamp/blob/master/Dockerfile



このままではcontainerを消すたびにMysqlのデータが消えてしまう…

オリジナルのDockerイメージ（カスタマイズしたWordPress）の作成

`git clone https://github.com/mookjp/tutum-docker-wordpress`

cd tutum-docker-wordpress

コンテナとローカルとのファイル共有
`docker run -d -p 80:80 -v $(pwd):/data-share --name=xxx-wordpress tutum/wordpress`
コンテナの中に入る
`docker exec -it xxx-wordpress /bin/bash`

実際にWordPressの設定を終えてから、そのデータをdata-shareにコピーする。
`mysqldump -u root wordpress > /data-share/mysql.dump.sql`

`docker contianer stop xxx-wordpress`
`docker contianer rm xxx-wordpress`
buildする
`docker build -t xxx-wordpress .`

設定済みのimageが出来る
`docker run -d -p 80:80 --name=xxx-wordpress xxx-wordpress`

```yaml

version: '3'
services:
    wordpres:
      build:
        context: ./tutum-docker-wordpress
      container_name: xxx-wordpress
      ports:
        - 80:80
      volumes:
        - ./tutum-docker-wordpres:/data-share
```

#おまけ
nginx,php-fpm,mysql環境構築


docker-compose.yml

```yaml

version: '3'
services:
  nginx:
    build:
      context: ./nginx
    depends_on:
      - php
    ports:
      - 80:80
    volumes:
      - ./app/public:/var/www/public
 
  php:
    build:
      context: ./phpfpm
    volumes:
      - ./app/public:/var/www/public
 
  mysql:
    restart: always
    image: mysql:latest
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=test
    ports:
      - 3306:3306
```

nginx/Dockerfile

```dockerfile

FROM nginx:latest
COPY ./etc/nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
```

php-fpm/Dockerfile

```dockerfile

FROM php:7.1-fpm
```

nginx.conf

```
user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    log_format  main  '$uri - $is_args - args :::'
                      '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
 
    #gzip  on;
 
    include /etc/nginx/conf.d/*.conf;
}
```

default.conf

```
server {
    index index.php index.html;
    server_name localhost;
    root /var/www/public;
 
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
 
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```