#Dockerって何??
開発者やシステム管理者が、コンテナでアプリケーションを **構築(build)、実行(run)、共有(share)**するためのプラットフォームのことを指します。
###イメージとコンテナについて
コンテナとは、ホストマシン(例: 自分のpc)の上に仮想的に利用する箱みたいなもの。ホストマシンとは別の世界を作る感じ。
イメージとは、コンテナの実行に必要な概念としてのパッケージ(ファイルやメタ情報の集合体)である。
参考サイトイメージとコンテナの違いについて
文字より下記の写真の内容のほうがわかるかもです!!
#実際のコードを利用して
今回はPHPのDockerファイルとdocker-compose.ymlの情報を解説していきます!
その前にDockerfileとdocker-compose.ymlの違いについて
・Dockerfileには個々のコンテナを構築するために必要な細かい手順(どんなツールをインストールするかなど)を記載する場所
・docker-compose.yamlには個々のコンテナの起動定義(どんな感じで起動していくか)を記載する場所
・要は、Dockerfileは個々のコンテナに関する説明書、docker-compose.ymlはコンテナ全体に関する説明書
コマンド操作については、他の方の投稿内容を参考サイトとして使用します。
Dockerコマンド一覧
##Dockerfileの記述
FROM php:8.0-fpm-buster
#この記述でphp8.0のベースイメージを指定して利用しますよといった命令文
LABEL maintainer="ucan-lab <yes@u-can.pro>"
#LABEL命令はイメージに対してメタデータを追加します。
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]
#シェル形式のコマンドに使用
# timezone environment
ENV TZ=UTC \
# locale
LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8 \
# composer environment
COMPOSER_ALLOW_SUPERUSER=1 \
COMPOSER_HOME=/composer
#ENV命令は環境変数を設定します。
COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer
#新しいファイルまたはディレクトリをコンテナのパスにコピーします。--from オプションを付けると別のイメージのファイルを指定できます。(マルチステージビルド)composer のインストールがとてもシンプルになっています。
RUN apt-get update && \
apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales libfreetype6-dev libjpeg62-turbo-dev libpng-dev && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
locale-gen en_US.UTF-8 && \
localedef -f UTF-8 -i en_US en_US.UTF-8 && \
mkdir /var/run/php-fpm && \
docker-php-ext-install intl pdo_mysql zip bcmath && \
docker-php-ext-configure gd --with-freetype --with-jpeg &&\
composer config -g process-timeout 3600 && \
composer config -g repos.packagist composer https://packagist.org && \
docker-php-ext-install -j$(nproc) gd exif
#RUN命令は現在のイメージの上に任意のコマンドを実行した結果をコミットします。Laravelに必要なライブラリー等のインストールを行っています。
COPY ./infra/php/php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf
COPY ./infra/php/php.ini /usr/local/etc/php/php.ini
#ホスト側に置いているPHPの設定ファイルのコピーをしているだけです。
WORKDIR /work/laravel
#WORKDIR命令はワークディレクトリを設定します。
##docker-compose.ymlの記述
app, web, db の3つのコンテナを定義しています。
version: "3.3"
#docker-composeのバージョン
volumes:
php-fpm-socket:
db-store:
#名前付きボリューム(ボリュームとは、データを永続化できる場所のことである。外部HDDのようなイメージ。)をマウント(利用できる状態にすること)しています。
#unixソケット(php-fpm-socket)のボリュームは app コンテナと web コンテナで共用したいのでマウントしてます。
#unixソケットとは、まず、ソケットの意味「受け口、接合部」の意味。「UNIXドメインソケット」とは、LinuxなどのUNIX系OS(オペレーティングシステム)で実行されるプロセス間のデータ通信の終点に使われるインターフェースのことをいう。
#データベース(db-store)のデータはコンテナを破棄しても残しておきたいのでボリュームとして定義しています。
services:
app:
build:
context: .
dockerfile: ./infra/php/Dockerfile
volumes:
- php-fpm-socket:/var/run/php-fpm
- ./laravel:/work/laravel
environment:
- DB_CONNECTION=mysql
- DB_HOST=db
- DB_PORT=3306
- DB_DATABASE=${DB_NAME:-laravel_local}
- DB_USERNAME=${DB_USER:-phper}
- DB_PASSWORD=${DB_PASS:-secret}
#app(アプリケーションサーバ)コンテナの定義です。PHPを実行します。
#build で ./infra/php/Dockerfile を指しています。
#volumes で名前付きボリュームとホストパスをコンテナにマウントしてます。
#../Laravel:/work/backendはLaravelのソースコードをマウントしてます。
#environmentで環境変数を定義している。
web:
build:
context: .
dockerfile: ./infra/nginx/Dockerfile
ports:
- ${WEB_PORT:-80}:80
volumes:
- php-fpm-socket:/var/run/php-fpm
- ./laravel:/work/laravel
#web(ウェブサーバ)コンテナの定義です。PHP以外の静的コンテンツを返却します。
#ports ポートを公開します。(HOST:CONTAINER)
#volumes で名前付きボリュームとホストパスをコンテナにマウントしてます。
#nginxのデフォルトのポート番号は 80 番です。
db:
build:
context: .
dockerfile: ./infra/mysql/Dockerfile
ports:
- ${DB_PORT:-3306}:3306
volumes:
- db-store:/var/lib/mysql
environment:
- MYSQL_DATABASE=${DB_NAME:-laravel_local}
- MYSQL_USER=${DB_USER:-phper}
- MYSQL_PASSWORD=${DB_PASS:-secret}
- MYSQL_ROOT_PASSWORD=${DB_PASS:-secret}
#db(データベース)コンテナの定義です。
#build で ./infra/mysql/Dockerfile を指しています
#ports ポートを公開します。
#volumes で名前付きボリュームとホストパスをコンテナにマウントしてます。
#MySQLのデフォルトのポート番号は 3306 番です。
#environmentで環境変数を定義している。
#参考にしたサイト
この方の内容で解説していただいており、そちらを主に参考に使用しました。
ほとんど、この方の情報を基に書いたので感謝しかないですが、これを自分のものにしていきたいです。