0から始める初心者向けDocker構築

Windows環境でDockerイメージとコンテナーを取り扱うための環境のセットアップ手順と、その構成の学習を目的とします。

最終目標としてDocker環境をサーバにデプロイし、本運用を見越したDocker環境でのリリースを実施します。


環境
・Windows 10
・VSC version 1.83.1
・Docker Desktop

1. Docker環境構築


1-1. WSLのインストール

DockerはLinux環境で動作するツールなので、Windows上にLinux環境を用意する必要があります。

Dockerコンテナを動作させる方法は次の2つの方法のいずれかを用いることで実現できます。


 ・Hyper-Vの上にLinux OSをインストールしたうえで、そのLinux OS環境にDockerをインストールする

 ・WSL2の上にLinux OSをインストールしたうえで、そのLinux OS環境にDockerをインストールする


Hyper-Vを用いる場合、Windows10 Proエディション以上が求められるため、今回はWSL2を使用します。

WSL2はWindows 10 Homeでも利用可能であるため汎用性が高いです。


WSL2はWindows 10のオプション機能(設定で有効化する)として導入でき、特にライブラリの追加などせずにそのまま実行できます。

wsl --install

実行するとOSの再起動を求められ、再起動後は自動でUbuntuのインストールが実行されます。

その際にユーザー名とパスワードを求められるので、こちらはメモして保管しておきましょう。

1-2. Docker Desktop for Windowsのインストール

下記サイトからDocker Desktop for Windowsをダウンロードしてインストールを実施します。

https://docs.docker.com/desktop/install/windows-install/

インストール後は再起動を求められるので、再起動を実施します。


再起動後にdockerが自動で立ち上がるので、ターミナルから起動状態のテストを実施します。

下記コマンドを実施すると80番ポートのテスト用イメージが起動するので、docker psで起動状態を確認します。

docker run -d -p 80:80 docker/getting-started
docker ps


テスト用のイメージが起動していることが確認できたので、この状態で http://localhost/ にアクセスをすると、dockerのチュートリアルページに遷移します。

これはコンテナ上にページが用意されてあるため、表示されています。

2. 開発環境を用意する


ここまでで、docker環境は動作することが確認できました。

ここからはPHP環境を用意し、開発環境の構築を行っていきます。


構築する環境としては下記を想定しています。

Laravel 5.0

PHP 8.2

nginx 2.0

Mysql 5.7

2-1. docker-compose.ymlを用意する

まずは、docker-compose.ymlファイルを用意し、アプリケーションとネットワーク、データベースをそれぞれ設定できるように各イメージの構築を行っていきます。

今回は下記のような構成でdocker-compose.ymlファイルを用意しました。

version: "3"
services:
  app:
    container_name: app
    build: ./docker/php
    volumes:
    - .:/var/www
  nginx:
    image: nginx
    container_name: nginx
    ports:
    - 8000:80
    volumes:
    - .:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /var/www
    depends_on:
    - app
  db:
    image: mysql:5.7
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: db-user
      MYSQL_PASSWORD: db-pass
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306

nginxとdbには既存のイメージを利用し、phpは設定の上書を行ったりするため、php用のディレクトリにDockerfileを作成してそちらから作成します。

2-2. PHP用のイメージを用意する

まず最初にphp.iniを作成します。

設定としては最小限の記述のみをしておきます。

expose_php = Off

post_max_size = 128M
upload_max_filesize = 128M

date.timezone ="Asia/Tokyo"

mbstring.language = Japanese
mbstring.encoding_translation = Off
mbstring.detect_order = auto

続いてDockerfileを用意します。

FROM php:8.2-fpm
COPY php.ini /usr/local/etc/php/

php:fpmと指定することでDocker公式が提供しているPHPイメージをインストールします。

そのまま使用すると設定が違うため、先ほど作成したphp.iniで既存のphp.iniを上書しています。


これだけだと、phpのイメージコンテナ内でmysqlやcomposerなど、使用できないコマンドがあるため、別途必要なパッケージをインストールする記述を追記していきます。

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
  && docker-php-ext-install zip pdo_mysql

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

2-3. nginxの設定ファイルを用意する

次にnginxの設定ファイルを用意します。

こちらも先ほどのphp.iniと同様、最低限の記述のみを書きます。

http{
    listen 80;
    server_name www.example.com;
    root /var/www/laravel-project/public;
    index index.php;
    charset UTF-8;
}

2-4. コンテナを起動する

最低限の設定ができたので、この状態でdocker-compose.ymlを使い、Dockerコンテナを起動します。

docker compose up -d


実行するとイメージコンテナの作成・起動が実行されます。

この状態でdocker psすると、下図のように、アプリケーション、nginx、dbのコンテナがそれぞれ起動している状態になります。



こちらからアプリケーションのコンテナにログインします。

docker compose exec app bash

Dockerコンテナの中に入れたので、以下コマンドを実行します。

composer create-project --prefer-dist laravel/laravel laravel-project "10.*"

以上で設定は終了です。

Laravelが起動したことを確認するため、ブラウザで以下URLへアクセスします。

http://localhost:8000

成功していれば、Laravelのウェルカムページが表示されます。