ずっと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で構築後にそれぞれ入れたいものはやっぱり出てくると思う。そんなときに再度入れ直すのは面倒なのでやはりコンテナのバックアップは取っていきたいと考えている。
ご意見がある方はぜひ教えていただければ幸いです。