[docker]php開発環境のymlを修正しました(php+mysql+nginx+phpmyadmin)

docker

前回docker-composeでphp+mysql+nginxを作成しましたが、ymlの修正をしたので、修正箇所やハマった点をまとめました。

前回から修正したdocker-compose.yml全文

下記のようにymlを修正しました。

version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: codelike_web_nginx
    ports:
      - 8080:8080
    depends_on:
      - php
      - db
    volumes:
      - ./nginx/codelike_server.conf:/etc/nginx/conf.d/default.conf
      - ../:/var/www/html

  php:
    build: ./php
    container_name: codelike_web_php
    depends_on:
      - db
    volumes:
      - ../:/var/www/html
      - ./php/log/:/var/log/php/

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: codelike_web_phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=password
    depends_on:
      - db
    ports:
      - 8888:80

  db:
    image: mysql:5.7
    container_name: codelike_web_mysql
    ports:
      - 13306:3306
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/log/:/var/log/mysql
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Tokyo
~                       

docker-compose.ymlを置く場所を変更した

phpのプログラムを置く場所に、ymlファイルを一緒に置くようになっていたのを階層を分けて置くように修正しました。
前回までは、dockerで作る環境系のフォルダやファイルをプログラムを書いていく「www」フォルダと同じ階層にしていました。

docker-compose.yml
nginx
 └── codelike_server.conf
php
 ├── Dockerfile
 └── php.ini
phpinfo.php
windows_vagrant
 └── Vagrantfile
www
 └── phpinfo.php

今回は綺麗に階層分けして、.codelike_web_dockerの直下に環境構築で使うファイルは置くようにしました。
プログラムを書くときは、ルートのディレクトリから書いていけます。

.codelike_web_docker
├── docker-compose.yml
├── mysql
│   ├── log
│   └── my.cnf
├── nginx
│   └── codelike_server.conf
├── php
│   ├── Dockerfile
│   └── php.ini
└── windows_vagrant
    └── Vagrantfile
README.md
phpinfo.php

「.」をディレクトリ名の前に付けています。
mac(linux系)では環境構築用のディレクトリは隠しディレクトリになって、開いた時もスッキリするのでいい感じです。

別ディレクトリのdocker-compose.ymlからdockerを起動するには

-fオプションを使うとファイル指定できるので、

こうやっていたのを

docker-compose docker-compose.yml up -d

こうして、-fでファイル指定すると起動できます。

docker-compose -f .codelike_web_docker/docker-compose.yml up -d

docker-compose.ymlの修正

container_nameを追加した

デフォルトで付けられる名前だと「xxxx_1」とかなって見た感じが微妙なので、コンテナ名を明示的に指定しました。

明示的に指定しておくと、docker psコマンドで確認した時などに、こんな感じで表示されていい感じです。

PORTSNAMES
80/tcp, 0.0.0.0:8080->8080/tcpcodelike_web_nginx
0.0.0.0:8888->80/tcpcodelike_web_phpmyadmin
9000/tcpcodelike_web_php
33060/tcp, 0.0.0.0:13306->3306/tcpcodelike_web_mysql

phpエラーログの出力先修正

phpのエラーが変なところに出ていたので、phpの箇所のvolumesに下記の設定を追加しました。
logファイルの出力先とディレクトリをホストと共有させて見えるようにしました。

 - ./php/log/:/var/log/php/

一緒にphp.iniの設定も変えました。

-error_log = php_errors.log
+error_log = /var/log/php/php_errors.log

phpmyadminにデフォルトログインする設定を追加

phpmyadminの箇所にenvironmentを追加して、下記のように設定しました。
この設定がない場合は、ログイン画面が表示されますが、設定しておくと最初からログインした状態なのでラクです。

environment:
  - PMA_ARBITRARY=1
  - PMA_HOST=db
  - PMA_USER=root
  - PMA_PASSWORD=password

mysqlのタイムゾーンを日本にする

mysqlの箇所にTZ項目を追加して、Asia/Tokyoを設定しました。

environment:
    TZ: Asia/Tokyo

mysqlの文字コード/ログ出力先を設定

mysqlの設定ファイルを作成して、下記のように共有して文字コードをutf8mb4に設定しました。
これで絵文字も使えます…

volumes:
    - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf

my.confはこんな感じです。

[mysql]
default-character-set=utf8mb4  

[client]
default-character-set=utf8mb4  

[mysqld]
character-set-server=utf8mb4   
collation-server=utf8mb4_bin   
log-error=/var/log/mysql/mysqld.log

mysqlのデータが消えないように設定する(永続化)

何もしていない状態だと、dockerを停止して再起動した場合にmysqlのデータが消えてしまうので、下記のようにしました。

 - ./mysql/data:/var/lib/mysql

こうしておくと、データが保存されている場所がホストと共有化されるので、永続的に残るようになります。

コンテナが複数立ち上げられずにハマった…

docker-compose up -d で別々のディレクトリのdockerコンテナを立ち上げようとしたら、
ネットワークが重複みたいなエラーが出て、片方が閉じてしまう現象が起きました。

公式のこちらにも書いていますが、
docker-composeはプロジェクト名を使って、環境を分離するらしいです。

そして、upした時のデフォルトのプロジェクト名はymlファイルが入っているディレクトリ名になるみたいです。

ディレクトリ名が同じ場合は被って立ち上げられないので、下記のようにA環境とB環境を用意した場合は片方しか立ち上がりません。

A環境.
.docker/
    |_ docker-compose.yml

B環境.
.docker/
    |_ docker-compose.yml

ディレクトリ名をそれぞれ別のものにしておくと大丈夫でした。。

A環境.
.docker_a/
    |_ docker-compose.yml

B環境.
.docker_b/
    |_ docker-compose.yml

コメント

タイトルとURLをコピーしました