今更ですが、Macで表題の環境を作らなくてはいけなくなったので、構築してみました。
備忘録として書いておきます。
#環境
マシン macOS Catalina 10.15.7
#構成
ファイル、ディレクトリの構成はざっくりと以下のようにします。
任意のディレクトリ
│
├── docker-compose.yml
│
├── html/
│ └── index.html
│
├── mysql/
│ ├── Dockerfile
│ ├── data/
│ ├── init/
│ │ └── init.sql
│ └── my.cnf
│
├── php-apahce/
├── Dockerfile
└── php.ini
#この構築の重要な部分
docker-compose.ymlとDockerfileがこの構築の重要な部分になります。
ファイル名 | 説明 |
---|---|
docker-compose.yml | コンテナの構成を定義するもの。コンテナ間通信の定義もできる。 |
Dockerfile | dockerのイメージに対する定義。 |
###docker-compose.ymlの要素
調べて自分が認識している限りだと以下の通り
名称 | 意味 |
---|---|
build | Dockerfileがある位置を指定 |
volumus | ローカル内のマウントされる場所:コンテナ内のマウントする場所 |
ports | ポートフォワード |
container_name | コンテナの名前 docker container lsのname |
environment | 環境変数?変数名で何を意味するかがなんとなくわかる |
###Dockerfileの要素
調べて自分が認識している限りだと以下の通り
名称 | 意味 |
---|---|
FROM | 何をどのバージョンで |
EXPOSE | どのポートを使用するか |
ADD | ローカルファイルをコンテナ内ファイルに追記 |
CMD | コンテナ起動時に実行されるやつ |
COPY | ローカルファイルをコンテナ内ディレクトリにコピーする |
RUN | イメージ作成時に呼ばれるやつ。なのでパッケージのインストール等を書く。 |
#構築
本編はここからです。
##確認
まずコンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
何もいません
##./docker-compose.yml
docker-compose.ymlとは、コンテナの構成を定義するファイル
version: '3'
services:
php-apache:
build: ./php-apache/
volumes:
- ./html:/var/www/html
ports:
- 8080:80
container_name: web
mysql:
build: ./mysql/
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
environment:
- MYSQL_ROOT_PASSWORD=docker
- MYSQL_DATABASE=mydb
- MYSQL_USER=appuser
- MYSQL_PASSWORD=appuser1
container_name: db
ports:
- 3306:3306
ymlに書いている属性?で、自分が理解していることを以下の表に書いてみる
(間違っているところを指摘してくれる優しい人いたら教えてください)
##./html/index.php
動作確認するために使用。
とりあえず、DBのデータを表示できれば良しとする。
volumesの定義により、htmlがドキュメントルートとなる。
<?php
try {
$db = sprintf('mysql:host=%s:3306;dbname=%s', 'mysql', 'mydb');
$dbh = new PDO($db, 'appuser', 'appuser1');
foreach($dbh->query('select * from users') as $row) {
echo $row['name'] . '<br>';
}
$dbh = null;
} catch (PDOException $e) {
echo $e;
die();
}
$dbh = null;
hostの指定で「'mysql'」としていますが、これはdocker-compose.ymlのservice名と理解しています。
mysql: ←これ!!!
build: ./mysql/
volumes:
##./mysql/Dockerfile
mysql側のDockerfile
DockerfileとはDockerイメージの定義を書くファイルです。
FROM mysql:8.0
EXPOSE 3306
ADD ./my.cnf /etc/mysql/conf.d/my.cnf
CMD ["mysqld"]
##./mysql/init/init.sql
適当なテーブルとデータを詰め込むような記述にしておく
use mydb;
CREATE TABLE users (
id int(10) unsigned not null auto_increment,
name varchar(255) not null,
primary key (id)
);
insert into users(name) values('hogeo');
insert into users(name) values('fugao');
##./mysql/my.cnf
[mysqld]
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[mysql]
default-character-set=utf8
[client]
default-character-set=utf8
###default_authentication_plugin=mysql_native_passwordについて
mysqlのデフォルト認証プラグインが変わったので、デフォルトの認証プラグインを変更しています。
mysqlの環境変数でユーザ(appuser)作っていますが、mysql_native_passwordという認証プラグインで設定されます。
デフォルトのままだと、phpがmysqlへのアクセスで失敗します。
##./php-apache/Dockerfile
色んなサイトを見て参考にさせてもらいました。
FROM php:7.4-apache
COPY ./php.ini /usr/local/etc/php/
RUN apt-get update
RUN apt-get install -y zip unzip vim libpng-dev libpq-dev
RUN docker-php-ext-install pdo_mysql
##./php-apache/php.ini
色んなサイトを見て参考にさせてもらいました。
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
##docker-compose build
上記を作った後、docker-compose.ymlと同階層で以下のコマンド実行
ksk@ksknoMacBook-Pro work % docker-compose build
〜〜〜中略〜〜〜
Successfully built e5b1c15e825e
Successfully tagged work_php-apache:latest
Building mysql
Step 1/4 : FROM mysql:8.0
---> d4c3cafb11d5
Step 2/4 : EXPOSE 3306
---> Using cache
---> e11d55e213ab
Step 3/4 : ADD ./my.cnf /etc/mysql/conf.d/my.cnf
---> Using cache
---> 6dd70a6b7ecd
Step 4/4 : CMD ["mysqld"]
---> Using cache
---> c22190479ddf
Successfully built c22190479ddf
Successfully tagged work_mysql:latest
##コンテナ作成&起動
ksk@ksknoMacBook-Pro work % docker-compose up -d
Creating web ... done
Creating db ... done
##確認
コンテナの状態確認
ksk@ksknoMacBook-Pro work % docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b416b97d3f7b work_mysql "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp db
9985abb2eb90 work_php-apache "docker-php-entrypoi…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp web
コンテナが確認できました
##画面確認
http://localhost:8080
こちらへアクセス
以上!