docker
docker-compose

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

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

Dockerの登場人物

  • Dockerfile
    • コンテナで実行することや設定を書くファイルです
  • Dockerイメージ
    • Dockerfileをもとにつくられた仮想環境のファイルです
  • Dockerコンテナ
    • Dockerイメージを「コンテナ」として動かします
    • 削除するとその状態は失われます

Dockerのメリット

  • サーバの状態をコードで管理できる
    • 「どんなコマンドを実行するか」「どのファイルを サーバに配置するか」などをDockerfileに書く
  • 「サーバの状態」をアプリのコードと同じようにバージョン管理システムで管理できる
    • 今まで手作業で構築していたものを、自動で作成できる!
  • 起動が高速
    • 実行したコマンドはキャッシュされる –  2度目以降の環境作成が超高速
  • 環境の共有が手軽
    • Dockerfileが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
image.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にまとめる。
こうすると毎回起動するときに長いオプションを打たなくて済む。

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

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

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

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

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

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;
    }
}