Masayan tech blog.

  1. ブログ記事一覧>
  2. Dockerの概念やメリット、使用方法についてざっくり紹介してみる

Dockerの概念やメリット、使用方法についてざっくり紹介してみる

公開日

Dockerとは

Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

Dockerを使用すると、環境構築に必要な設定を"コードで管理"できるため、コード化したファイルを開発者間で共有することで容易に環境構築を行うことが可能になります。(Infrastracture as Codeと呼ばれる)

Dockerを用いたサーバー構築の流れ

  1. docker pull でコンテナのベースとなるDockerイメージを入手する
    Dockerhubなどにコンテナを立ち上げるために必要なミドルウェアなどの設定やコマンドが、ひとまとめになったテンプレートが用意されているレジストリ(料理する際のレシピのようなもの)
  2. Dockerイメージをビルドする
    Dockerイメージのビルドにより、ベースとなるイメージに対して、ユーザイメージ(自分独自のイメージ)を作り出す
  3. イメージをもとにコンテナを起動する
    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/www
Dockerfileで使用できるコマンド

コマンド名

内容

補足

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.conf
version

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 build

4.コンテナ起動

docker-compose up -d

5.nginxの起動確認

localhost:8020にアクセスして下図のような画面が表示されていれば、成功です。

6.開発

以下のコマンドを実行して適当なファイルを作成します

touch hello.php

そうすると、前述のvolumeの設定によりホスト側とdockerコンテナ側で同期が取られているので、hello.phpというファイルがコンテナ内にも作成されていると思います。

以上です。

まとめ

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