前回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コマンドで確認した時などに、こんな感じで表示されていい感じです。
PORTS | NAMES |
---|---|
80/tcp, 0.0.0.0:8080->8080/tcp | codelike_web_nginx |
0.0.0.0:8888->80/tcp | codelike_web_phpmyadmin |
9000/tcp | codelike_web_php |
33060/tcp, 0.0.0.0:13306->3306/tcp | codelike_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
コメント