前提
- docker
- docker-compose
上記2つがインストールされていること
dockerの知識は最低限あればいい
私もDockerそんなに詳しくないです
今回作るもの
- dockerを利用したLAMP環境
docker-compose.yml
version: '3.5'
services:
web:
image: seiyu/web:latest
container_name: seiyu_web_server
ports:
- '80:80'
volumes:
- ./app:/var/www/html
- ./log:/var/log/apache2
networks:
default:
ipv4_address: 172.16.0.3
environment:
ENV: ${ENV}
db:
image: seiyu/db:latest
container_name: seiyu_db_server
ports:
- "3306:3306"
volumes:
# 初期データを投入するSQLが格納されているdir
- ./db/mysql_init:/docker-entrypoint-initdb.d
# 永続化するときにマウントするdir
- ./db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: tech
MYSQL_PASSWORD: tech
networks:
default:
ipv4_address: 172.16.0.2
networks:
default:
name: app_net
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.0.0/24
各項目について
web
web:
image: seiyu/web:latest
container_name: seiyu_web_server
ports:
- '80:80'
volumes:
- ./app:/var/www/html
- ./log:/var/log/apache2
networks:
default:
ipv4_address: 172.16.0.3
environment:
ENV: ${ENV}
port
image: seiyu/web:latest
公式イメージphp:7.2-apacheにcomposerなどを追加でインストールしたseiyuイメージ
ports
ports:
- '80:80'
ホストの80番ポートとコンテナの80番ポートの紐づけ
volumes
volumes:
- ./app:/var/www/html
- ./log:/var/log/apache2
./app(ホスト側)と/var/www/html(コンテナ側)を共有
これによりホスト側でファイルを変更するとコンテナ内も変更される
apacheのログをホスト側と共有
apacheの設定はimageを作るときに決めてしまったので、ここに設定だけ記述します
<VirtualHost *:80>
ServerName localhost
ServerAlias *.localhost
VirtualDocumentRoot "/var/www/html/%1/www"
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log common
</VirtualHost>
ローカル環境で簡単に開発環境を整えるために今回はVirtualDocumentRootを使用しています。
VirtualDocumentRootにするとRewriteなどに影響がでるらしいが、その時に対応することにする
ここではapp(ホスト側)とhtml(コンテナ側)が同じ階層になるので、
./app/hello-docker/www/index.htmlがあった場合、urlはhello-docker.localhostになる
networks
networks:
default:
ipv4_address: 172.16.0.3
コンテナ間通信をするためのブリッジネットワーク
environment
ENV: ${ENV}
既存のプロジェクトがconfファイル内でセクションにより環境を切り替えていて、dockerでの再現方法がわからずこの方法で動いたのでとりあえずこれを利用している
[dev]
dbhost: 192.168.1.2
[test]
dbhost: 192.168.1.3
[production]
dbhost: dbhost.test
このような設定ファイルがあった場合にdev環境,test環境と切り替える
docker-compose.ymlファイルと同じ階層にある.envファイル
ENV=dev
これによりコンテナを起動したときにENVにdevが代入されるのでphp側で
getenv('ENV')
で指定した値が取得し、その値を元にセクションから取得すると楽に既存のプロジェクトのコンテナ化も楽ちん
db
db:
image: seiyu/db:latest
container_name: seiyu_db_server
ports:
- "3306:3306"
volumes:
# 初期データを投入するSQLが格納されているdir
- ./db/mysql_init:/docker-entrypoint-initdb.d
# 永続化するときにマウントするdir
- ./db/mysql_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: tech
MYSQL_PASSWORD: tech
networks:
default:
ipv4_address: 172.16.0.2
image
image: seiyu/db:latest
今後変更などがあるかもしれないので一様自分のイメージを作成
公式のイメージをほぼそのまま利用
volumes
volumes
- ./db/mysql_init:/docker-entrypoint-initdb.d
- ./db/mysql_data:/var/lib/mysql
webと同様
/docker-entrypoint-initdb.dはイメージからコンテナを生成・起動するときにその中にあるsqlを実行してくれる
ここでは開発ユーザの追加をしている
GRANT ALL PRIVILEGES ON *.* TO tech IDENTIFIED BY 'tech' WITH GRANT OPTION;
FLUSH PRIVILEGES;
/var/lib/mysqlは永続化するためにホスト側とmysqlデータを共有
environment
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: tech
MYSQL_PASSWORD: tech
- ルートユーザのパスワード
- techユーザ作成
- techユーザのパスワード
networks
default:
name: app_net
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.0.0/24
コンテナ間のブリッジネットワークの設定
ここは私もよくわからないのでこれから勉強が必要です
今回使用したソース群

git clone https://github.com/seiyu-nico/docker-lamp.git
cd docker-lamp
docker-compose up
で起動して、urlにhello-docker.localhostで動作確認できます
- README.mdはそのうちちゃんと書きます
まとめ
- 簡単なphp開発環境を作成した
- すぐ使えることを目指したので設定などは少し適当な部分あり(VirtualDocumentRootとか)
- 本番環境での利用するにはまだまだ勉強が必要
- wordpressのソースの表示の仕方が難しいのでその辺をどうにかする
ソースがエスケープされていたり見づらい場所があると思うのでcloneしたソースを確認して下さい
コメント