2021.03.07  

Docker入門-Nginxの検証環境を作る

Docker,  Nginx    

この記事の目的
・Dockerの概念を理解する
・DockerでNginxの検証環境を構築できるようになる

参考動画:
https://www.udemy.com/course/docker-k/learn/lecture/21936598

Dockerとは何か

一言でいうと...
コンテナ型仮装環境を作成・実行・管理するためのツールのこと。

コンテナとは
仮想環境の一種。

PCやサーバー上にコンテナを作成することで、PythonやNginxなどの実行環境を素早く構築できる。

また、Dockerの設定ファイルを共有することで、別のPCやサーバーでも同じ仮想環境を用意できる。

Dockerの言語
Go言語で作成されている。

Dockerコマンドの出力形式を指定する場合にGoテンプレートを使用するので、知識があると多少使いやすい。

Dockerを使うメリット

    メリット
  1. プログラムの実行環境を素早く構築できる
  2. 再現性のある環境を用意できる
  3. PCの環境を汚さずに済む

解説
(1)Docker コンテナイメージと設定ファイルを使用することで、コマンドひとつでプログラムの実行環境を構築できる。

(2)パッケージやライブラリをコンテナ単位でインストールするので、どのPCやサーバーで実行しても環境のずれが起こりにくい。

(3)PCへプログラムの実行に必要なパッケージをインストールする必要がないので、PC環境を綺麗な状態にできる。

Dockerで構築できる環境

docker hub というサイトに用意されているコンテナのイメージを使用することで、

簡単にWebサーバーやDBサーバーを構築することができる。

具体的には、Apache、Nginx、MySQL、PostgreSQL、Pythonなどのイメージが用意されている。

こちらのURLからどのようなコンテナイメージがあるか確認できる。
https://hub.docker.com/search?q=&type=image

コンテナイメージとは

ここで、コンテナイメージという単語がでてきました。

いったいこれは何者なのでしょうか。

コンテナイメージとは、コンテナを作成するための元ネタのことです。

例えば Linux + Pythonのイメージであれば、

LinuxOS であればインストール前のISOファイルを、

Pythonであればインストール前のパッケージを、

ひとまとめにしたものがコンテナイメージです。

Dockerはこのイメージを元にコンテナを作成します。

Dockerのインストール

以下のサイトでMacとWindows 10に対応したDockerをインストールできます。
 https://www.docker.com/products/docker-desktop

インストール方法の説明については割愛。

Nginxコンテナの作成

次のコマンドを実行すると、Nginxコンテナの作成と起動が行われます。

docker run --name my_nginx -d -p 8000:80 nginx

オプション説明
run : コンテナを起動状態まで作成する。
--name : コンテナの名前を指定する。名前は任意。
-d : Dockerコンテナの実行をバックグラウンドで行う。
-p : 使用するポートを指定。<ホスト側のポート>:<コンテナ側のポート>で指定。
nginx : Nginxのイメージを使用する。
    イメージがローカルにない場合は、Ducker Hubからダウンロードされる。
    Apacheのコンテナを作成したい場合は「httpd」を指定する。

Nginxの起動確認

コマンドを実行すると、次のように表示される。

$ docker run --name my_nginx -d -p 8000:80 nginx
Unable to find image 'nginx:latest' locally
docker.io/library/nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3: Pulling from library/nginx
852e50cd189d: Pull complete 
571d7e852307: Pull complete 
addb10abd9cb: Pull complete 
d20aa7ccdb77: Pull complete 
8b03f1e11359: Pull complete 
Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
Status: Downloaded newer image for nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
Tagging nginx@sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3 as nginx:latest
c02f362d6ee116553d0e68e4e2dcbae7b9eeef3b83089cab705007d500afb292

コマンド実行後にブラウザで「http://127.0.0.1:8000/」へアクセスすると、Nginxが起動してることを確認できる。

コンテナの起動・停止

コンテナ作成時に「--name」で指定した名前を使用することで、コンテナの起動停止が行える。

コンテナの起動

docker start my_nginx

コンテナの停止

docker stop my_nginx

コンテナの状態は「docker ps」コマンドで確認できます。

コンテナ起動時

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS              PORTS                  NAMES
65ff486b6b5b   nginx     "/docker-entrypoint.…"   12 minutes ago   Up About a minute   0.0.0.0:8080->80/tcp   my_nginx

コンテナ停止時

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

コンテナをカスタムする - Dockerfile

先程作成したコンテナは、Docker Hub からダウンロードしたイメージをそのまま使用しているだけなので、特に細かい設定などは行っていません。

コンテナの内容をカスタマイズしたい場合はDockerfileを使用します。

Dockerfileとは、コンテナイメージの構成情報を記述するファイルのことです。

以下は例として、Nginxの設定をDockerfileに定義したものです。

# 使用するイメージを設定
FROM nginx

# ローカルの default.conf をコンテナ内の /etc/nginx/conf.d/ にコピーする
COPY ./default.conf /etc/nginx/conf.d/

# ローカルの htmlファイル をコンテナ内の /var/www/html/ にコピーする
COPY ./*.html /var/www/html/

説明
FROM : 元になるDockerイメージを指定する。
COPY : ローカルからコンテナへファイルをコピーする。
    <ローカルのファイル> <コンテナ内のディレクトリ>

この例ではDocker Hub にある Nginx のイメージを元に、ローカルに配置してある default.conf と htmlファイルをそれぞれのコンテナにコピーするように設定しています。

こうすることで、ローカルの設定ファイルをコンテナに渡すことができます。

今回、コンテナ内に配置するファイルは、以下の内容となります。

default.conf
server {
    listen 80;
    server_name my_nginx;
    charset UTF-8;

    location / {
        root /var/www/html;  # htmlファイルの配置場所を指定
        index  index.html index.htm;  # 最初に表示するhtmlファイルを指定 
    } 
}
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>testページ</title>
  </head>
  <body>
    <h1>testページ</h1>  <!-- testページ という文字が画面に表示される想定 -->
  </body>
</html>

ファイルは任意のフォルダへ以下のように配置します。

[任意のフォルダ]
├── Dockerfile
├── default.conf
└── index.html

Dockerfile を使用してコンテナイメージを作成する

先程作成したDockerfileを使用し、Dockerイメージを作成します。

Dockerfileを使用して作成するのは「コンテナ」ではなく、コンテナを作成するために使用する「コンテナイメージ」であることに注意してください。

docker build コマンドでDockerイメージを作成することができます。

docker build -t my_nginx_img .

build オプションはdodkerfileからDockerイメージを作成する際に指定します。

-t オプションは、作成するコンテナイメージに名前をつけたい場合に使用します。

最後の「.」は読み込むDockerfileの配置先を記述する箇所です。

今回はカレントディレクトリにDockerfileがある想定なので「.」を設定しています。

[任意のフォルダ]の中でコマンドを実行します。

[任意のフォルダ]
├── Dockerfile
├── default.conf
└── index.html

コマンドを実行すると次のように表示されます。

$ docker build -t my_nginx_img .
[+] Building 0.5s (8/8) FINISHED                                                
 => [internal] load build definition from Dockerfile                       0.1s
 => => transferring dockerfile: 253B                                       0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/nginx:latest            0.0s
 => [1/3] FROM docker.io/library/nginx                                     0.1s
 => => resolve docker.io/library/nginx:latest                              0.0s
 => [internal] load build context                                          0.1s
 => => transferring context: 1.08kB                                        0.0s
 => [2/3] COPY ./default.conf /etc/nginx/conf.d/                           0.1s
 => [3/3] COPY ./*.html /var/www/html/                                     0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:3a1a2286fc9a7a953ed121de959716f6c5b00a03b0906  0.0s
 => => naming to docker.io/library/my_nginx_img                              0.0s

これで、Nginxのコンテナイメージが作成できました。

コンテナイメージを使用してコンテナを作成する

作成したコンテナイメージを元にコンテナを作成します。

コンテナの作成には、先程と同じくdocker run コマンドを使用します。

前回と違うのは、末尾の「nginx」が「my_nginx_img」になっているところです。

$ docker run --name my_nginx_2 -d -p 8000:80 my_nginx_img 

ブラウザで結果を確認してみます。

Dockerfileに default.conf と index.html を取り込むよう設定していたので、

画面の表示が「testページ」に変わりました。

これで、Nginxの設定を自由に変えられるようになりました。

ここまでがDockerの基礎編です。

コンテナの連携 - Docker Compose

Dockerコンテナ同士を連携させるツールにDocker Composeというものがあります。

Docker Compose を利用すると、複数のコンテナで構成されるアプリケーションのビルドや各コンテナの起動・停止などを簡単に行えるようになります。

例えば、Nginx - Django - MySQl のコンテナがそれぞれ連携して動作するような環境を簡単なコマンドを実行するだけで作成できます。

Docker Compose の動作イメージ

使用方法は、Webサーバー、WebAPサーバー、DBサーバーなどの定義を一つのyamlファイルに記述しておき、そのyamlファイルを元に各コンテナをコマンドで一括起動するようなイメージとなります。

Docker Compose で Nginx - Django - MySQl を連携させる

こちらの記事で作成したソースを公開しているので、もしよければ覗いて見てください。

リンク

【Docker Compose】 Nginx - Django - MySQl の検証環境を作成

コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信