4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dockerでapache7.4+mysql8環境構築(初期データ入り)(自分メモ)

Last updated at Posted at 2021-01-17

今更ですが、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とは、コンテナの構成を定義するファイル

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がドキュメントルートとなる。

index.php
<?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名と理解しています。

docker-compose.yml
  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

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
こちらへアクセス

qiita_20200117_01.png

以上!

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?