LAMP on Docker

Dockerを久々触ったのでおさらい。

今回作成したいのは以下のLAMP環境。

php 7.2
mysql 5.7 or 8.0
Wordpress 5.3.0

ディレクトリ構成

    ├── db
    │   ├── Dockerfile
    │   ├── my.cnf
    │   └── mysql_data
    ├── docker-compose.yml
    ├── html
    │   └── www
    └── web
        ├── Dockerfile
        ├── base.conf
        └── php.ini

各設定ファイルの作成

下準備

プロジェクトのルートに移動し、各ディレクトリを作成。

$ cd ~/Dev/proj/docker
$ mkdir db
$ mkdir web
$ mkdir html

docker-compose.yml

web: volumeで、cachedオプションを付けること。
これがないとMacだとかなりもっさりする。

それとPMA_HOSTはup後に取れるようなので、一旦仮で。

$ vim docker-compose.yml
version: '2'
services:
  web:
      build: ./web
      ports:
        - '8080:80'
      volumes:
        - ./html:/var/www/html:cached
      depends_on:
        - db
  db:
    build: ./db
    volumes:
      - ./db/mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'password'

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=password
    restart: always
    links:
      - db
    ports:
       - 8888:80
    volumes:
       - /sessions

なお、DBをMariaDBにしたい場合はこちら。

version: '2'
services:
    web:
        build: ./web
        ports:
          - '8082:80'
        volumes:
          - ./html:/var/www/html:cached
        depends_on:
          - db
    db:
        build: ./db
        image: mariadb:10 #10.x latest
        volumes:
          - ./db/mysql_data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: password
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        environment:
          - PMA_ARBITRARY=1
          - PMA_HOST=d7c54209ed55
          - PMA_USER=root
          - PMA_PASSWORD=password
        restart: always
        links:
          - db
        ports:
           - 8882:80
        volumes:
           - /sessions

web/Dockerfile

apache のphp 7.2で指定。モジュールは都度追加。
※ついかしたらbuildが必要。多分。

$ vim web/Dockerfile

※追記 apache-phpでのエラーログ出力のため、エラーログをechoする記述を追加

FROM php:7.2-apache
MAINTAINER docker-web

RUN apt-get update \
    && apt-get -y install vim wget lsb-release libicu-dev default-mysql-client libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && docker-php-ext-install pdo_mysql mysqli intl gd
RUN ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load
RUN ln -s /etc/apache2/mods-available/vhost_alias.load /etc/apache2/mods-enabled
RUN echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf && a2enconf fqdn

COPY ./base.conf /etc/apache2/sites-available/base.conf
RUN a2ensite base.conf

COPY ./php.ini /usr/local/etc/php/

RUN echo '\
log_errors = On\n\
error_log = /dev/stderr\n\
error_reporting = E_ALL\n\
' >> /usr/local/etc/php/php.ini

web/base.conf

~/html/配下でディレクトリを切れば、サブドメイン化出来るように。

$ vim web/base.conf

<VirtualHost *:80>
    ServerName localhost
    ServerAlias *.*.localhost
    VirtualDocumentRoot "/var/www/html/%2/%1"
</VirtualHost>

<VirtualHost *:80>
    ServerName localhost
    ServerAlias *.localhost
    VirtualDocumentRoot "/var/www/html/%1"
</VirtualHost>

web/php.ini

$ vim web/php.ini

※追記 apache-phpはエラーログ出力の為、[global]以下を追記必要。

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese

[global]
log_errors = On
error_reporting = E_ALL
error_log = "/var/log/php_error.log"

db/Dockerfile

$ vim db/Dockerfile
FROM mysql:5.7
MAINTAINER docker-db

COPY ./my.cnf /etc/mysql/conf.d/my.cnf

db/my.cnf

$ db/my.cnf
[mysqld]
character-set-server=utf8
datadir = /var/lib/mysql

こちらはMariaDB ver.

FROM mariadb:10
MAINTAINER docker-db

COPY ./my.cnf /etc/mysql/conf.d/my.cnf

Build

ここまで出来たらビルドする。

$ docker-compose build

成功したら、up。

$ docker-compose up
$ docker-compose ps

psで確認してみる。

         Name                        Command               State               Ports             
-------------------------------------------------------------------------------------------------
server_upd_db_1           docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp           
server_upd_phpmyadmin_1   /run.sh supervisord -n -j  ...   Up      0.0.0.0:8888->80/tcp, 9000/tcp
server_upd_web_1          docker-php-entrypoint apac ...   Up      0.0.0.0:8080->80/tcp          

Test

表示されるかテスト。~/html/www/にファイルを作る。

$ mkdir html/www
$ vim html/www/index.html

適当に書いたファイルが、http://www.localhost:8080/ で表示されればOK!

Log in

立ち上げた仮想サーバーへログイン。

$ docker exec -it server_upd_db_1 /bin/sh

ログインして、
※pwはdocker-composeに記載

# mysql -u root -p

ここでホスト名を確認。

mysql> select @@hostname;

ここで得たホスト名を、docker-composeに書きphpmyadminを再ビルド。

$ docker-compose build phpmyadmin
$ docker-compose up -d phpmyadmin

するとphpmyadminへアクセス出来る。
http://localhost:8888/index.php