目次
Dockerとは
Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
Dockerを使用すると、環境構築に必要な設定を"コードで管理"できるため、コード化したファイルを開発者間で共有することで容易に環境構築を行うことが可能になります。(Infrastracture as Codeと呼ばれる)
Dockerを用いたサーバー構築の流れ
- docker pull でコンテナのベースとなるDockerイメージを入手する
 Dockerhubなどにコンテナを立ち上げるために必要なミドルウェアなどの設定やコマンドが、ひとまとめになったテンプレートが用意されているレジストリ(料理する際のレシピのようなもの)
- Dockerイメージをビルドする
 Dockerイメージのビルドにより、ベースとなるイメージに対して、ユーザイメージ(自分独自のイメージ)を作り出す
- イメージをもとにコンテナを起動する
 Dockerイメージをもとに作られたWebサーバやDBサーバなどが動く仮想環境のことです。
基本的なdockerコマンド
| コマンド名 | 内容 | 補足 | 
| docker ps -a | 全コンテナの情報を参照したい | |
| docker ps | 実行中の全コンテナの情報を参照したい | NAMES列には、ホストからコンテナを指定する際に使用することができる名称が表示されます | 
| docker inspect <コンテナ名> | コンテナを指定して、詳細情報を見たい | |
| docker logs -f --tail=500 <コンテナ名> | コンテナのログを出力したい | |
| docker stop | コンテナを停止したい | |
| docker rm <コンテナ名> | コンテナを削除したい | |
| docker rm $(docker ps -q -a) | 停止しているすべてのコンテナを削除したい | |
| docker restart | コンテナを再起動したい | 
Dockerを用いたサーバー構築
1.ディレクトリ構造
面倒な方は、cloneしていただいても良いです。
php-docker
└docker
└php
Dockerfile
└nginx
default.conf
docker-compose.yml
index.php
2.各ファイルの説明
Dockerfile
主に元となるイメージファイルを指定したり、コンテナを作成する際にあらかじめ環境変数を設定したりgitやvimなどのツールをインストールしたりする役割です。(docker imageを作るための設計図)
# https://hub.docker.com/_/phpにあるイメージファイルを指定
FROM php:8.0-fpm
WORKDIR /var/wwwDockerfileで使用できるコマンド
| コマンド名 | 内容 | 補足 | 
| CMD | コンテナ起動後に実行する処理を指定 | |
| COPY | ビルドコンテキストからイメージへファイルをコピーする際に使用 | |
| ENV | イメージ中の環境変数 | |
| FROM | Dockerfileのベースイメージを指定 | |
| RUN | 指定された命令をコンテナ内で実行 | |
| WORKDIR | RUN、COPYなどの命令が実行される作業ディレクトリを指定 | 
default.conf
主にサーバー側の待受ポートやドキュメントルート、ルーティングの設定を行います。
(ブラウザからのリクエストを一旦受けて、それをAPサーバーへ投げる)
fastcgi_passの"php"の部分はymlファイルのサービス名と合わせてください。
server {
  listen 8000;
  root /var/www/;
  index index.php index.html;
  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # php-fpmが起動しているサーバーのIPとポート番号
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    # /var/www/ + fastcgi_script_name(URLのドメイン以降のパスが入る)
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}docker-compose.yml
version: "3.8"
services:
  php:
    container_name: php_container
    build: ./docker/php
    volumes:
      - ./:/var/www
  nginx:
    container_name: nginx_container
    image: nginx
    ports:
      - 8020:8000
  volumes:
    - ./:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.confversion
ymlファイルの書き方がversionにより異なるため、明示しておく必要がある
services
アプリケーションを構成するコンテナの集合体。それぞれのサービスを識別するために名称をつける必要があります。(結構重要です。)
container_name
コンテナの名称です
build
dockerhubのイメージを直接指定するか、Dockerfileを別途作成してそちらを参照するように指定するかの2パターンがあります。(ビルド時に複雑なことをする場合はDockerfileに記載する必要がある)
volumes
Dockerコンテナを使用した開発では、コンテナ内に入って開発作業をする必要があるので、開発に際して作成したファイルやフォルダはホストOS側にも同期が取られる必要があります。volumesでは、ホストOS側のディレクトリ:コンテナ側のディレクトリという形で指定することで同期が取れるようになります。
ports
localhost:8020にアクセスすると、dockerコンテナ上で起動したwebサーバーのポート8000番に繋がるという仕組みです(※ホストOS側のポート番号は重複しているとエラーが生じるので注意)
ビルドコンテキスト
docker buildコマンドを実行したときの、カレントなワーキングディレクトリのことを ビルドコンテキスト(build context)と呼びます。 デフォルトで Dockerfile は、カレントなワーキングディレクトリにあるものとみなされます。 ただしファイルフラグ(-f)を使って別のディレクトリとすることもできます。 Dockerfileが実際にどこにあったとしても、カレントディレクトリ配下にあるファイルやディレクトリの内容がすべて、ビルドコンテキストとして Docker デーモンに送られることになります。
index.php
これは画面表示確認用のファイルです。phpファイルがwebサーバ上で表示できることが確認できればなんでも良いです。
<?php
phpinfo();3.イメージビルド
docker-compose buildでイメージを再構築しても、再構築前のもともとのコンテナのボリュームは保持したままなので、データベースやキャッシュは保持されるため、キャッシュを使用せず完全に作り直したい場合は docker-compose build --no-cache のコマンドを使用する
docker-compose build4.コンテナ起動
docker-compose up -d5.nginxの起動確認
localhost:8020にアクセスして下図のような画面が表示されていれば、成功です。

6.開発
以下のコマンドを実行して適当なファイルを作成します
touch hello.phpそうすると、前述のvolumeの設定によりホスト側とdockerコンテナ側で同期が取られているので、hello.phpというファイルがコンテナ内にも作成されていると思います。

以上です。
まとめ
いかがでしたでしょうか。本記事では、Dockerの基本的な概念や採用することによるメリット、具体的な使用方法についてざっくり紹介しています。phpのイメージファイルを基に簡単なAPサーバーを構築する手順を紹介していますので、ぜひ参考にしてみてください。
