docker-composeで簡単PHP開発環境

Docker
スポンサーリンク

前提

  • 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

コンテナ間のブリッジネットワークの設定
ここは私もよくわからないのでこれから勉強が必要です

今回使用したソース群

Build software better, together
GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over...
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したソースを確認して下さい

コメント