グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



Webアプリケーションの構造を理解し、dockerを用いた開発環境を構築できるようになる(構築編)

前回の知識編では、webアプリケーションの構造を理解すること、そしてそれを理解した上でdocker・docker-composeとはどんなものかを改めて理解することが目的でした。

今回の構築編では、実際にdockerを利用して弊社で用いる開発環境を構築していきたいと思います。

前提

  • Apache2.4
  • PHP7.4
  • MySQL8.0

ディレクトリ構成

ディレクトリ構成は下記のようになっています。

.
├ .docker/		# このディレクトリ以下にそれぞれのコンテナについての定義を記述する。dockerコンテナについての定義の記述ですよ、と分かりやすいように `.docker`ディレクトリと命名しているだけで、命名は自由です。
│    ├ db/
│    │  ├ Dockerfile
│    │  └ my.cnf	# MySQLの設定を記述するファイル 
│    │
│    └ php/
│        ├ 000-default.conf		# Apacheの設定を記述するファイル
│        ├ Dockerfile
│        └ php.dev.ini		# PHPの設定に追記するためのファイル
│
├ .env		# MySQLのユーザー情報等を記述するファイル
├ db-data/		# MySQLのデータが消えないように保存しておくディレクトリ。通常コンテナをdropすると、MySQLのデータが消えます。そのためデータが消えないようにしたい時はこのディレクトリを作成しておきます。
├ docker-compose.yml
└ www/
    └ html/		# 公開ディレクトリ。弊社でよくある公開サーバの公開ディレクトリが `www/html/`なのでそれに合わせています。こちらも命名は自由です。
        └ app/

Webサーバコンテナを用意する

ディレクトリ構成の該当部分です。

.
├ .docker/
│    │
~    ~
│    └ php/
│        ├ 000-default.conf
│        ├ Dockerfile
│        └ php.dev.ini

Dockerfile

# dockerイメージの指定
FROM php:7.4.0-apache

# `apt-get install`で任意の自身に必要なミドルウェアを指定しインストールする
# `a2enmod rewrite`でApacheの設定を.htaccessで上書きできるようにしている(筆者はSlim4の開発環境構築時に記述せずに詰まった経験あり)
# `curl -sS https://getcomposer.org ~~`でComposerのインストール
RUN apt-get update \
  && apt-get install -y zlib1g-dev libpq-dev mariadb-client git vim zip unzip libzip-dev\
  && docker-php-ext-install zip pdo_mysql mysqli \
  && docker-php-ext-enable mysqli \
  && a2enmod rewrite \
  && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Dockerイメージのデフォルト設定ファイルを元に、php.iniを作成
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
# 上書きしたい項目だけをconf.d/以下に配置する。
COPY php.dev.ini "$PHP_INI_DIR/conf.d/"

# 設定ファイルをdockerコンテナ内のPHPとApacheに読み込ませる
COPY 000-default.conf /etc/apache2/sites-enabled/

000-default.conf

<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/>
           AllowOverride All
       </Directory>
</VirtualHost>

php.dev.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

DBコンテナを用意する

ディレクトリ構成の該当部分です。

.
├ .docker/
│    ├ db/
│    │   ├ Dockerfile
│    │   └ my.cnf
~    ~
│
├ .env
├ db-data/
~

Dockerfile

# dockerイメージの指定
FROM mysql:8.0

# 設定ファイルをdockerコンテナ内のMySQLに読み込ませる
COPY ./my.cnf /etc/mysql/conf.d/

my.cnf

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8

.env

MYSQL_ROOT_PASSWORD=root_pass
MYSQL_DATABASE=app
MYSQL_USER=user
MYSQL_PASSWORD=pass

db-data/

中身は空で作成しておきます。

docker-composeを使ってコンテナを立ち上げる

まずはdocker-compose.ymlを記述します

version: '3'

services:

# [php-apache]
# `build:`でPHPのDockerfileが配置してあるPathを指定する。
# `container_name:`で任意のコンテナ名を付けられる。なくても可。
# `depends_on:`でコンテナが立ち上がる順番を指定している。今回はdbコンテナが立ち上がった後にphpコンテナが立ち上がるようにしている。
# `volumes:`でホスト側とコンテナ側のディレクトリを同期する場所を指定する。今回だと、ホスト側の`./www/html/`とコンテナ側の`/var/www/html`を同期するということ。
  php:
    build: ./.docker/php
    container_name: php_container
    ports:
      - "80:80"
    depends_on:
      - db
    volumes:
      - ./www/html:/var/www/html

# [mysql]
# `volumes:`で今回はホスト側の`./db-data`にコンテナ側の`/var/lib/mysql`以下に配置されるMySQLのデータを同期する。これでデータの永続化が可能になる。
  db:
    build: ./.docker/db
    container_name: db_container
    env_file: .env
    ports:
      - "3306:3306"
    volumes:
      - ./db-data:/var/lib/mysql

docker-composeコマンドを叩いていきます

1. Dockerfileからコンテナimageを作成します

$ docker-compose build

2. コンテナをdbコンテナ・phpコンテナの順で立ち上げます。その後psコマンドを使って立ち上がったかどうか確認します。

$ docker-compose up -d
$ docker-compose ps

Stateの列がdb_container、php_container共にUpとなっており、無事立ち上がりました。

3. downコマンドを使ってそれぞれのコンテナを落とします。

$ docker-compose down

おわりに

今回の構築編では、実際にdockerを利用して弊社で用いる開発環境を構築しました。

分かり辛い、理解し辛い部分に適宜コメントを入れるように心掛けました。Dockerfile一つ取っても他に様々な書き方があると思いますが、今回の記事が初めて環境構築に挑戦する方々の参考になれば幸いです。

この記事を書いた人

KJG
KJGソリューション事業部 システムエンジニア
大学4年時春に文系就職を辞め、エンジニアになることを決意し、独学でRuby、Ruby on Railsを学習。
約1年間の独学期間を経てアーティスへWebエンジニアとして入社。現在はWebエンジニアとして、主にシステムの開発・運用に従事している。
抽象的なもの、複雑なものを言語化して文章にするのが好きで得意。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします