dockerをしばらく触っておらずコマンドを忘れていましたがリハビリのつもりでWordpressコンテナを今回、作ってみました。(docker-compose対応)
今回はAWSのEC2インスタンスにDockerをインストールしてからdocker-composeによるWordpressのインストールまで作業しました。ドメインは domain.std で、EIP(Elastic IP)取得済みとします。VPCの構成は以下の通りです。
アベイラビリティゾーン | ap-northeast-1(東京) |
VPC | 172.31.0.0/16 |
VPCサブネット | 172.31.0.0/20 |
インスタンスIP(ローカル) | 172.31.12.128 |
Docker ブリッジネットワーク | 172.18.0.0/24 |
DockerブリッジGW | 172.18.0.1 |
dnsmasq(使わない) | – |
mysql000ex1 | 172.18.0.3 |
WordPress | 172.18.0.4 |
Redis | 172.18.0.5 |
https-portal | 172.18.0.100 |
ディレクトリ構成を紹介します。
作業ディレクトリは、/home/ec2-user/wordpress でディレクトリやmy.cnfを適宜、作ります。
[home]
[ec2-user]
[wordpress]
・docker-compose.yml
・[certs]
・[mysql]
Dockerfile
・[data]
my.cnf
php.ini
wp-config.php
・[html]
・[mysql]
コンテナはwordpressとmysql000ex1、キャッシュサーバーのredis、それにLet’s Encrypt証明書用のリーバスプロキシ https-portal、の4つです。コンテナ名は紛らわしくなければお気に入りの名前で構いません。
・wordpress
・mysql000ex1
・redis
・https-portal
データを永続化するためボリューム、ファイル関係はローカルにバインドしています。
ネットワーク周りは固定IPを使ってdnsmasqを使わなくても一応、コンテナ間の通信ができました。
/home/ec2-user/wordpress/mysql/Dockerfile
FROM mysql:8.0-debian
RUN apt-get update && \
apt-get install -y locales
RUN locale-gen ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG=ja_JP.UTF-8
ENV TZ=Asia/Tokyo
docker-compose.yml
version: '3' # docker compose 2.0以降のバージョンではエラーが出るので非推奨 services: wordpress: image: wordpress:latest #container_name: wordpress # --scaleオプションで展開するときはコメントアウトする
hostname: domain.std
extra_hosts:
- "domain.std:<EIPグローバルipアドレス>" links: - mysql000ex1:mysql - redis ports: - 8080-8084:80 networks: wp000net1: # ipv4_address: 172.18.0.4 # --scaleオプションで展開するときはコメントアウトする volumes: - ${PWD}/data/html:/var/www/html # - ${PWD}/data/php.ini:/usr/local/etc/php/php.ini # 2回目以降docker cpコマンドで持ってきてコメント外す # - ${PWD}/data/wp-config.php:/var/www/html/wp-config.php depends_on: - mysql000ex1 - redis restart: always environment: WORDPRESS_DB_HOST: mysql000ex1 WORDPRESS_DB_NAME: wordpress000db WORDPRESS_DB_USER: wordpressuser WORDPRESS_DB_PASSWORD: wpuserpass REDIS_HOST: 172.18.0.4 REDIS_PORT: 6379 mysql000ex1: build: context: . dockerfile: ./mysql/Dockerfile #image: mysql:8 #container_name: mysql000ex1 # --scaleオプションで展開するときはコメントアウトする hostname: mysql000ex1 networks: wp000net1: # ipv4_address: 172.18.0.3 # --scaleオプションで展開するときはコメントアウトする ports: - 33006-33010:3306 volumes: - ${PWD}/data/mysql:/var/lib/mysql - ${PWD}/data/my.cnf:/etc/mysql/conf.d/my.cnf # my.cnfは段落下に設定例を掲載しました restart: always environment: MYSQL_ROOT_PASSWORD: mysqlPassword MYSQL_DATABASE: wordpress000db MYSQL_USER: wordpressuser MYSQL_PASSWORD: wpuserpass TZ: Asia/Tokyo command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci redis: image: redis:latest container_name: redis ports: - "6379" networks: wp000net1: ipv4_address: 172.18.0.5 https-portal: image: steveltn/https-portal:1 container_name: https-portal ports: - '80:80' - '443:443' links: - mysql000ex1:mysql - wordpress - redis networks: wp000net1: ipv4_address: 172.18.0.100 restart: always volumes: - ${PWD}/certs:/var/lib/https-portal environment: DOMAINS: 'domain.std -> http://wordpress:80, domain.std -> http://redis:6379' CLIENT_MAX_BODY_SIZE: 16M STAGE: 'staging' # 初回起動以降、本番をするときは'production'にする #FORCE_RENEW: 'true' # 使いすぎると認証制限のlimitが掛かるのでほとんど使わない networks: wp000net1: ipam: driver: default config: - subnet: 172.18.0.0/24 gateway: 172.18.0.1
https-portalは初回起動は’ staging’で様子を見て、docker composeで各コンテナの不具合を点検して、本番になったら’production’にしてdocker compose logsコマンドでエラーを拾います。productionの認証には5分くらいの時間がかかります。limitに引っかからないためにもWordpressのインストール画面が出ないなど問題があったら直ぐにdocker compose downしてローカルのcertsを削除、再作成すると良いでしょう。
my.cnf [mysqld] skip-name-resolve datadir=/var/lib/mysql socket=/var/run/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql character-set-server=utf8mb4 mysql_native_password=ON # MySQL8.0.40 以前のバージョンではエラーが出るのでコメントアウト削除 [client] socket=/var/run/mysql/mysql.sock default-character-set=utf8mb4
php.ini-production, wp-config-sample.phpはdocker cpコマンドで起動中のコンテナからローカルにコピーして取り出し、リネーム編集します。
$ docker cp wordpress-wordpress-1:/usr/local/etc/php/php.ini-production .
$ docker cp wordpress-wordpress-1:/var/www/html/wp-config-sample.php .
php.ini
↓(以下を追記)
upload_max_filesize = 128M
post_max_size = 128M
memory_limit = 128M
max_execution_time 300
max_input_time 300
wp-config.php // ** Database settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress000db') ); /** Database username */ define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'wordpressuser') ); /** Database password */ define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'wpuserpass') ); (中略) /** Database hostname */ define( 'DB_HOST', getenv_docker('WORDPRESS_DB_HOST', 'mysql000ex1') ); define( 'REDIS_HOST', '172.18.0.5') ); define( 'REDIS_PORT', '6379') ); /** Database charset to use in creating database tables. */ define( 'DB_CHARSET', getenv_docker('WORDPRESS_DB_CHARSET', 'utf8') ); /** The database collate type. Don't change this if in doubt. */ define( 'DB_COLLATE', getenv_docker('WORDPRESS_DB_COLLATE', '') );
最初、下記の様なボリュームの定義をしていたのですが『failed to mount local volume, no such file or directory』といってdockerが/data/mysqlにボリュームを作ろうとした・・・のエラーが出てサブディレクトリ表記を許さないのだなと思ったのでカレントディレクトリ「./」を ${PWD} で置き換えるやり方に落ち着きました。
Problem with named volume in docker-compose – docker.com
mysql:
volume:
- mysql000vol1:/var/lib/mysql
・
・
volumes: mysql000vol1: driver: local driver_opts: type: none o: bind
device: ./data/mysql
docker failed to mount local volume mount no such file or directory – stackoverflow
mysql:
volumes: - ${PWD}/data/mysql:/var/lib/mysql
いろいろな記法がありフォローが大変ですが、コマンドをその都度繰り返し使うことで身につくこともあると思います。
それでは楽しいDockerライフを!