Dockerを使ってローカル開発環境にお手軽にLAMP、Wordpress環境を作った
今更だが掲題の通りDockerをローカル環境として導入してGithubにもリポジトリを作った。
きっかけとしては下記がしたかったから。
・モダンな環境作り
・開発環境作る時間短縮化
・PC端末に依存しない開発環境作り
結論から言うとめちゃめちゃいい。
なんで今まで使ってこなかったんだろうと思うくらいに。
散々言われてることだが個人的に感じた大きなメリットデメリットを上げると↓
メリット
・Vagrantより環境作成が圧倒的に早い
・そのうちKubernetesとかに対応するときもスムーズ
・コンテナ内ということでPC環境が汚れないしプロジェクトが終わっても掃除する必要なし
デメリット
・学習コスト
こんな感じ。
実際の手順などは下記に記載した。
目的
・バージョン違いによるミスが起きない
複数人で開発をしていると、Rubyやnode.jsなどの実行環境のバージョン違いで動かなくなることがある。Docker上で動かすことで実行環境は固定されるので、そのようなミスが起きない。
ミドルウェアの構成を含めて他の人(未来の自分)にシェアできる
「MySQLを起動していなかった」「nginxを挟んでいなかったから動きが変わっていた」など、アプリケーションを開発しているとよくある問題。
Docker Composeという機能を使えば、そのようなミドルウェアの構成を含めてコード化できるので、コマンドひとつで同じ構成で立ち上がる。
そして、それはGitHub上で共有できる。例えばElasticsearchを組み込んでみたサンプルがあるとすると、それを誰もがcloneして、コマンドひとつで実行できる。アプリケーションのコードだけでなく、ミドルウェアをどう使うのかというTipsも簡単に共有できるようになる。
PCが変わったりしても安心。
Docker Composeとは
Dockerは、1コンテナ1プロセスという思想が基本。1つのコンテナにすべての機能を詰め込まず、複数のコンテナを起動して、協調してシステムを構成しましょうと。
例えば、リバースプロキシのnginx、バックエンドのアプリケーション、データベースをそれぞれ別のコンテナで起動して、システムを構築する。それをYAMLの設定ファイルひとつで簡単に実現するのがDocker Compose。
docker-compose.ymlという設定ファイルに、どのコンテナを立ち上げるかを記述し、docker-compose upというコマンド1つ実行するだけで、必要なサービスがすべて立ち上がる。
これを活用することで、ミドルウェアの構成まで含めた開発環境の統一が可能になる。
準備
Docker for macをインストール
https://hub.docker.com/editions/community/docker-ce-desktop-mac
※Windows版もあるけど割愛
起動するとdockerコマンドが利用可能になる。(docker-composeも含まれている)
実践1(MySQL,PHP7.3,Apache2.4/Wordpressなしの純粋なPHP環境ならこれ)
Gitからクローン
git clone https://github.com/h-murayama/docker-lamp.git cd docker-lamp
起動(バックグランドで起動)
docker-compose up -d
ブラウザで127.0.0.1にアクセス。
※Chromeからlocalhostにアクセスするとかなり遅い(バグらしい)が、Firefoxなどならlocalhostでも一瞬で表示可能。
Chromeでみたいので一旦IPアドレスでよさそう。(hostsで好きなものに変えてもいい)
構造解説
./docker-compose.yml
├── README.md
├── docker-compose.yml
├── html
│ └── index.html
├── mysql
│ ├── Dockerfile
│ └── my.cnf
└── php
├── Dockerfile
└── php.ini
役割の説明は下記
docker-compose.yml
使うコンテナやパラメータなどを記述した手順書。YAML形式なのでインデントに注意
Dockerfile
ここに記載したものを元にイメージをビルドする。
ホストマシンからコンテナ内のmysqlに接続
mysql -u root -p -h 127.0.0.1 --port 3333
実践2(Wordpress導入する場合はコレ)
git clone https://github.com/h-murayama/docker-wordpress.git cd docker-wordpress/ docker-compose up -d
基本的には上述したdocker-composeを使っているが、気をつけたポイントは
.envファイルにパスワードなどを別ファイルとして記載しておき、Gitには含めないことでセキュアに保つ。
※.envは.ymlファイルじゃなくなるので、
WORDPRESS_DB_NAME: wordpress
じゃなく、
WORDPRESS_DB_NAME=wordpress
というふうにイコールで記載する必要があるところは注意。
参考
https://tech.recruit-mp.co.jp/infrastructure/post-11266/
https://necosystem.hirokihomma.com/archives/245/
実践2の発展版(Wordpress導入/ よく使うプラグインを自動インストール)使い方例
1.本番環境のDBをsql,dumpファイルなどにしてダウンロード
2.内容を置換してdb-dataフォルダに格納。
(置換例:hogehoge.com→127.0.0.1:8000)
※更にサイトURLも一箇所だけ変更しないと管理画面に入れずリダイレクトされる可能性あるため必要に応じて変更
クローン&移動
git clone https://github.com/h-murayama/docker-wordpress-original.git cd docker-wordpress-original/
docker-compose.ymlの指定ファイルを変更
(29行目あたりのコロン左側のファイル指定がローカルの場所なのでここを変更する)
env_file: .env volumes: - ../wordpress/wp-content/themes/hogehoge:/var/www/html/wp-content/themes/hogehoge - ../css:/var/www/html/css - ../img:/var/www/html/img - ../js:/var/www/html/js - ../movie:/var/www/html/movie #- ./docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
コンテナ立ち上げ
docker-compose up -d
これで記事などがそのまま入ったローカル環境がつくれたはず。
※メディアアップロードは入らないため、そこまで再現するならインポートツールなど検討
・他にも自動でインストールさせたいプラグインがある場合、my-wordpress/Dockerfileに追記するだけで可能。
・dumpファイルがあればかなり手軽にローカル環境ができる。
・コンテナ内でDBを登録してもコンテナを終了したらリセットされるところがミソ。
・docker-compose.ymlファイルのパスは案件ごとに適宜変更すること。
・このフォルダを流用すれば他の案件にも使える
ローカルPCの中身(hogehogeというプロジェクトの場合)
hogehoge
├── css
├── docker-wordpress-settings ←コレを追加(ファイル名任意)
│ ├── db-data
│ └── my-wordpress
├── img
├── js
├── movie
└── wordpress
├── css
├── img
├── js
├── movie
└── wp-content
└── themes
└── hogehoge
├── README.md
├── db-data
│ ├── hogehoge.dump
│ └── mysql.dump.sql
├── docker-compose.yml
├── docker-entrypoint.sh
└── my-wordpress
└── Dockerfile
逆引きコマンド集
イメージの確認
sudo docker images
起動中コンテナ確認(コンテナID確認)
sudo docker ps
コンテナに入る
docker exec -it 自分でつけたdockerコンテナのDBの名前(起動してるやつ) bash
初回起動(docker-compose up は(imageがなければimageビルドから)コンテナの起動までを行う)
# foregroundで起動
docker-compose up
# backgroundで起動
docker-compose up -d
停止
# foregroundで起動していた場合
## Ctr + C
# backgroundで起動していた場合
docker-compose stop
再起動 or 実装変更を反映させる(restartでは、コンテナはそのままでソースコードの変更だけ反映可能)
# foregroundで起動していた場合
docker-compose up
# backgroundで起動していた場合
docker-compose restart
コンテナの再構築(docker-compose.ymlの変更を反映)
# foregroundで起動
docker-compose up
# backgroundで起動
docker-compose up -d
Dockerfile or ビルド処理の変更を反映させる
# foregroundで起動
docker-compose up --build
# backgroundで起動
docker-compose up -d --build
アプリのログを見る
backgroundで起動中のサービスのログを表示する
# 最新5行からtailする
docker-compose logs -f --tail="5"
# 最新5行からタイムスタンプ付きでtailする
docker-compose logs -f --tail="5" -t
コンテナ停止
docker stop <コンテナID or name>
後片付け
# 停止&削除(コンテナ・ネットワーク)
docker-compose down
# 停止&削除(コンテナ・ネットワーク・イメージ)
docker-compose down --rmi all
# 停止&削除(コンテナ・ネットワーク・ボリューム)
docker-compose down -v
# すべての利用中ボリュームを含んだコンテナ削除
docker rmi -f $(docker images -a -q)
# すべてのimage削除
docker rmi -f $(docker images -a -q)