Posted at

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

More than 1 year has passed since last update.

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