LoginSignup
3
2

DockerでUbuntu+Apache+PHP8+MariaDB環境を構築

Last updated at Posted at 2022-11-23

ずっとDockerは気になっていたものの実践で触れる機会が無く、新しく始めるプロジェクトでDockerでやってみようと決めていろいろ調べるところから始めたのでおかしな箇所があるかもしれません。
「これはこうしたほうが良い」というものがあったら是非教えてください。

Ubuntu+Apache+PHP8+MariaDB構成にしたい

表題通りの構成をやっている例が見つからず、初めてということもあってdocker-compose.ymlとDockerそれぞれにどう分けて書くかなども含めて結構時間がかかりました。PHPのパッケージを使うとDebian Linuxだったり。まあそれでもいいのですが、やっぱり普段使っているUbuntuに合わせたい!ということでこだわりが捨てられず。

ディレクトリ構成

├── docker
│   ├── php/
│   │   └── php.ini
│   ├── docker-compose.yml
│   ├── Dockerfile
│   └── .env

docker-compose.yml

services:
  web:
    build: .
    container_name: ${WEB_CONTAINER_NAME}
    tty: true
    depends_on:
      - db
    volumes:
      - ./${COMPOSE_PROJECT_NAME}/html:/var/www/html
    ports:
      - ${WEB_PORT}:80
    restart: always
  db:
    image: mariadb
    container_name: ${DB_CONTAINER_NAME}
    restart: always
    ports:
    - ${DB_PORT}:3306
    volumes:
      - "./${COMPOSE_PROJECT_NAME}/mysql:/var/lib/mysql"
      - "./${COMPOSE_PROJECT_NAME}/initdb:/docker-entrypoint-initdb.d"
    environment:
      - MYSQL_ROOT_PASSWORD=pass
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER_NAME}
      - MYSQL_PASSWORD=pass

Dockerfile

FROM ubuntu/apache2

EXPOSE 80

WORKDIR /var/www/html

# PHP8.0
RUN apt update -y && apt install -y vim
RUN apt -y install php8.1 php8.1-intl php8.1-mbstring php8.1-mysql php8.1-gd php8.1-fpm
RUN apt -y install libapache2-mod-php

ADD ./php/php.ini /etc/php/8.1/apache2

# Composerもついでに
COPY --from=composer /usr/bin/composer /usr/bin/composer

.env

好みで変更してください。

COMPOSE_PROJECT_NAME=projectx
COMPOSE_FILE=docker-compose.yml
COMPOSE_PATH_SEPARATOR=:

WEB_CONTAINER_NAME=${COMPOSE_PROJECT_NAME}_WEB
DB_CONTAINER_NAME=${COMPOSE_PROJECT_NAME}_DB

DB_PORT=3307
DB_NAME=${COMPOSE_PROJECT_NAME}
DB_USER_NAME=${COMPOSE_PROJECT_NAME}

WEB_PORT=8080

php.ini

こちらも好みで変更してください。

[global]
expose_php = Off
memory_limit = 128M
default_charset = "UTF-8"

[mbstring]
mbstring.language = Japanese

[Date]
date.timezone = Asia/Tokyo

[opcache]
opcache.jit_buffer_size=32M

あとはdocker-compose up -dすればOK。

Dockerを触ってみて戸惑ったこと

どのパッケージに何が入っているのか分かり辛かったこと。始め、PHPはPHPのパッケージだけかと思ってdocker-compose.ymlに入れたらOSも入っていてubuntuのパッケージとバッティングしているため(多分)動作状態にならなかったり。かと思えばDBは単体だったり。
複数のものがパッケージされている場合、自分の望んでいるものと完全に合致しているかどうかは動かしてみないと分からないのが不便だなと思いました。

仕組み的に無理なのかわからないけど、全部単体で用意されていて必要なパッケージをdocker-compose.ymlに羅列すればいいだけになればシンプルでわかりやすくなるのでは?と思いつつPHPはDockerfileでインストールするようにしました。なんかこの部分が気持ち悪い。

知りたいこと

複数のプロジェクトをDocker上で開発したいときはコンテナを分けたほうがいいのか、それとも一つのコンテナ内部で複数持つべきか。

コンテナを分けるメリット:
あるプロジェクトで別途インストールするライブラリなどが必要な場合もあるのでそのプロジェクト専用環境にできること。

コンテナ一つに複数プロジェクトを入れるメリット:
コンテナ管理が煩雑にならないこと。そもそもコンテナ自体をバックアップしたりするのはDocker的にはイケてないっぽいけど、docker-composeで構築後にそれぞれ入れたいものはやっぱり出てくると思う。そんなときに再度入れ直すのは面倒なのでやはりコンテナのバックアップは取っていきたいと考えている。

ご意見がある方はぜひ教えていただければ幸いです。

3
2
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
3
2