【初心者向け】Dockerfileとdocker-compose.ymlの書き方

【初心者向け】Dockerfileとdocker-compose.ymlの書き方

CHOIJINHWAN

CHOIJINHWAN

新卒ブログとは?
2024年4月に新卒入社したLIGメンバーが、日々の学びや気づきを綴るブログです。彼らがふだんどんなことを学んでいるのか、気軽にのぞいてみてください。

こんにちは、テクニカルディレクターのチェです!

本記事は、Dockerの基礎から実践的な使い方までをわかりやすく解説するシリーズです。

前回の記事では、Dockerの基礎知識やメリット・デメリット、そしてDocker Composeの基本コマンドについて紹介しました。

今回は、実際にDockerイメージをビルドし、docker-compose.ymlを使ってLaravelのアプリケーション環境を立ち上げる手順を解説していきます。

Dockerfileの書き方

まずは、LaravelアプリケーションをDocker化するためのDockerfileを作成します。

Dockerfileとは?

Dockerfileとは、Dockerコンテナのイメージを作成するためのテキストファイルです。

このファイルは、Dockerイメージの設計図のようなもので、コンテナのベースイメージや環境設定、アプリケーションのインストール手順、実行コマンドなどが記述されています。

イメージはDocker Hubなどの外部レジストリからダウンロードして使うことも可能ですが、自分が作成するアプリケーションに適切な環境を構築するために、Dockerfileでカスタムイメージを作成することが一般的です。

Dockerfileの記述例

それでは、実際に簡単なDockerfileを作成してみましょう。

Dockerfile

FROM php:8.3
WORKDIR /app

RUN apt-get update && apt-get upgrade -y \
&& apt-get install -y libzip-dev unzip git \
&& docker-php-ext-install pdo_mysql \
&& php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
&& php -r "if (hash_file('SHA384', 'composer-setup.php') === trim(file_get_contents('https://composer.github.io/installer.sig'))) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \
&& php composer-setup.php --install-dir=/usr/local/bin --filename=composer \
&& php -r "unlink('composer-setup.php');"

COPY composer.json composer.lock /app/
RUN composer install

EXPOSE 8000
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=8000"]

Dockerfileの主要コマンド

各コマンドの役割を、一つひとつ解説します。

FROM

Dockerfileで最初に書くべき命令で、ベースイメージを指定できます。これによって、8.3バージョンのPHPがインストールされた状態でスタートすることができます。

WORKDIR

コマンドを実行する作業ディレクトリを指定するコマンドです。これによって読みやすくなり、パスを何度も書く手間を減らすことができます。

RUN

イメージをビルドする際に実行するコマンドです。今回RUNで実行しているコマンドは、以下になります。

  • パッケージ一覧を最新の状態にしたうえで、必要なソフトウェアをインストールする。
  • PHPの拡張機能をインストールする。
  • Composerをインストールし、/usr/local/bin/composerに保存するようにする。

COPY

ホストのプロジェクトのファイルやディレクトリをコンテナ内にコピーして使用できます。

この場合、composer.json と composer.lock をコンテナ内の /app/ ディレクトリにコピーしています。

RUN (composer install)

composer.jsonに記載された依存関係をインストールし、動作するために必要なパッケージがコンテナ内にセットアップされます。

EXPOSE

コンテナが外部に公開したいポートが設定できるコマンドです。

CMD

コンテナが起動したときに実行するコマンドを指定できます。ここでは開発サーバをポート8000で起動するように設定しています。

docker-compose.ymlの書き方

今回はdocker-compose.ymlを使って、Laravelで作成したアプリケーションとデータベース(MySQL)をコンテナで実行できるように設定していきます。

その前に、まずdocker-compose.ymlの意味やメリットについて説明していきます。

docker-compose.ymlとは?

docker-compose.ymlとは、複数のコンテナをまとめて管理するための設定ファイルです。

通常、Dockerはdocker runコマンドでコンテナを起動しますが、docker-compose.ymlを使うと複数のコンテナを簡単に起動・管理できます。

docker-compose.ymlのメリット

複数のコンテナを一括管理できる

Webサーバーとデータベースなど、複数のコンテナを一つの設定ファイルでまとめて管理することができるため便利です。

設定をYAML形式でまとめて書ける

docker runの長いコマンドを書かなくても、docker-compose.ymlに環境変数やポート設定を整理して記述できます。それにより設定が見やすくなり、あとから修正もしやすくなります。

一つのコマンドで起動・停止できる

docker compose upですべてのコンテナを一括起動、docker compose stopで一括停止をすることにより、複数のコンテナを個別に管理する必要がなく、手間が省けます。

docker-compose.ymlの記述例

それでは、実際に簡単なdocker-compose.ymlを作成してみましょう。

docker-compose.yml

services:
    app:
        build: .
        volumes:
            - .:/app
        ports:
            - "8000:8000"
        depends_on:
            - db

    db:
        image: mysql:8.0
        environment:
            MYSQL_DATABASE: laravel
            MYSQL_USER: sail
            MYSQL_PASSWORD: password
            MYSQL_ROOT_PASSWORD: root_password
        ports:
            - "3306:3306"
        volumes:
            - db_data:/var/lib/mysql
volumes:
    db_data:

docker-compose.ymlの主要構成要素

上記のコードを一行ずつ確認していきましょう。

service

ここでは、作成したいサービスを定義できます。今回は、”app”と”db”というコンテナの設定をそれぞれ記述しています。

appコンテナ

まず、appというコンテナから見ていきましょう。

  • build
    Dockerfileが置いてあるパスを指定します。この設定によってdocker-compose.ymlから直接コンテナイメージをビルドできます。
  • volumes
    volumesの設定が行えます。ホストのカレントディレクトリ(./)とコンテナ内の /app ディレクトリが同期され、ファイルの変更がリアルタイムに反映されます。
  • ports
    ホストのポートをコンテナのポートにマッピングします。指定の書き方はホストのポート:コンテナのポートなので、書き方に注意しましょう。
  • depends_on
    サービス間の起動順序を制御します。これにより、先に起動すべきサービスが起動し、その後に指定したサービスが起動するよう順序を指定できます。

DBコンテナ

次は、MySQLデータベースを管理するDBコンテナの設定を見ていきましょう。

  • image
    MySQL8.0のイメージを使用するように設定します。
  • environment
    コンテナ内で使用する環境変数の設定ができます。ここではDBの名前やパスワード、データベース名、rootユーザーのパスワードなどを設定しています。
  • ports
    ホストからMySQLにアクセス可能にするためにポート番号を設定しています。
  • volumes
    ホストのdb_dataボリュームをコンテナ内の /var/lib/mysqlにマウンドして、MySQLのデータを永続的に保存する設定です。

コンテナのビルドと起動

作成したDockerfileとdocker-compose.ymlをもとに、実際にビルドしてコンテナを起動します。

イメージのビルド

まず、以下のコマンドでDockerイメージをビルドします。
docker compose build

コンテナの起動

ビルドしたら、以下のコマンドでコンテナを起動します。
docker compose up -d

コンテナの確認

起動したら、以下のコマンドで確認をしましょう。
docker compose ps

動作を確認

確認が終わったら、実際にhttp://localhost:8000にアクセスしてみましょう。

ビルドや起動以外にも、Docker Composeに関するコマンドについては前回の記事「Dockerとは?概念や基本用語をまとめてみた」で確認できるので、興味のある方はぜひ確認してください。

まとめ

Dockerを学習している方や使い始めたばかりの方に向けて解説しましたので、今回の記事が役に立てば幸いです。

今回は簡単な設定について紹介しましたが、より詳細を知りたい方はDocker公式サイトをご覧ください。

新卒採用募集中!
LIGは、Webデザインからグローバルなシステム開発まで、幅広い分野のコンサルティングから制作、運用までおこなう企業です。

  • 日本・フィリピン・ベトナムでの活躍チャンス
  • 最先端技術と多言語環境での成長
  • 有識者による月1回の勉強会

現在、海外拠点(フィリピン、ベトナム)に関われるエンジニアを募集しています。日本だけじゃなく世界で活躍することに興味のある方は、以下よりぜひご応募ください!

新卒採用ページへ

この記事のシェア数

Technology部のCoEチームに所属し、大手企業のシステム開発業務に従事。最近はPHPのLaravelに関心を寄せている。専門学校時代にHTML、CSS、Java、PHPなどのWebに関するスキルを習得し、卒業後にLIGに新卒入社。

このメンバーの記事をもっと読む
LIG新卒ブログ【2024】 | 19 articles
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL