One Step Ahead

プログラミングやエンジニアリング全般について書いていきます

Docker Toolboxでnginxを起動する

はじめに


Widows環境でDockerを使う場合には、大半が”Docker for Windows”を使っているはず。
今回は今更ながら、”Docker Toolbox”を使って、開発環境用のnginxを立てることになったので、そのメモ。

環境


  • OS :Windows 10 home
  • Docker : Version 18.03.0-ce
  • Docker Compose : Version 1.20.1

フォルダ構成

// フォルダ構成
docker-nginx
|―build
|    |―nginx
|         |―default.conf
|         |―Dockerfile
|―logs
|    |―nginx
|―public
|    |―index.html
|―docker-compose.yml

logsフォルダには、nginxのlog出力フォルダをマウントするので、access.log、error.logが出力される。

Dockerfileの作成


まずはDockerfileの作成。

/* ./build/nginx/Dockerfile */
FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf

今回はDockerfileの中でdefault.confのコピーを指定しているが、docker-composeでもよい。
docker-composeにdefault.confのマウントを記述してしまうと、イメージの指定だけになるので、Dockerfile自体は作らなくても良い。
※ただ、開発をしていると個別に処理を追加したくなるのは良くある話なので、個人的にはDockerfileに分けておく方が好き。

default.confの作成


次はnginxの設定ファイルを定義する。これはDockerfileと同じフォルダに配置する。

server {
    listen         80;
    server_name    localhost;

    root           /var/www/html;
    index          index.html;

    access_log     /var/log/nginx/access.log;
    error_log      /var/log/nginx/error.log;
}

ここら辺は特に説明することもない感じで、いつも通り。

表示確認用のhtmlファイルを配置


表示確認用にhtmlファイルを設置しておく。これは本当に何でもよい。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
</head>
<body>
    <h1>Nginx Start!</h1>
</body>
</html>

ひとまず、コンテナ起動後にこれが表示されればOK!

docker-compose.ymlを作成


一番大事なdocker-compose.ymlを作成する。

version: '3'
services:
  nginx:
    environment:
      TZ: Asia/Tokyo
    build: ./build/nginx
    ports:
      - "8888:80"
    volumes:
      - ./logs/nginx/:/var/log/nginx
      - ./public:/var/www/html

地味に重要なのが、log出力先フォルダをマウントしておくこと。
これをしておくだけで、通信できない場合の原因調査のスピードが格段にあがる。
例をあげると...

  1. マウントできているか確認
    ⇒ access.log,error.logが出力されていればOK。出力されていなければ、nginxの設定ファイルとdocker-compose.ymlのマウントの設定を見直す。
  2. nginxが起動しているか確認
    ⇒ error.logしか出力されていない場合は正常に起動できていない。error.logの内容を確認して、修正する。
  3. 対象のサーバーへ通信できているか確認
    ⇒ localhost:8888を叩いても反応がない場合、まずはlogを確認。出力されていなければURLをまずは見直す。

世の中にはlogが全く役に立たないものもあるが、役に立つものが存在するのも事実なので、logを軽視しないこと。

コンテナを起動する


// まずはコンテナをビルド
> docker-compose build
Building nginx
Step 1/2 : FROM nginx
 ---> 719cd2e3ed04
Step 2/2 : COPY ./default.conf /etc/nginx/conf.d/default.conf
 ---> Using cache
 ---> eba186bd7522
Successfully built eba186bd7522
Successfully tagged nginx_nginx:latest

// 次にコンテナを起動
> docker-compose up -d
Creating network "nginx_default" with the default driver
Creating nginx_nginx_1 ... done

// コンテナの起動を確認
> docker-compose ps
    Name              Command          State          Ports
-------------------------------------------------------------------
nginx_nginx_1   nginx -g daemon off;   Up      0.0.0.0:8888->80/tcp

後は起動を確認するだけ。

起動確認


ここで躓きやすいのが、確認するURL。
http://localhost:8888をブラウザで叩いても、確認できない。
WindowsでDockerを動かしているので、localhostのPort:8888で待ち受けているわけではなく、dockerのデーモンが起動しているサーバーのPort:8888で待ち受けているの注意。 まずはdockerが起動している仮想マシンのIPを確認する。

> docker-machine env
$Env:DOCKER_TLS_VERIFY = "1"
$Env:DOCKER_HOST = "tcp://192.168.77.101:2376"
$Env:DOCKER_CERT_PATH = "***********"
$Env:DOCKER_MACHINE_NAME = "default"
$Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true"
# Run this command to configure your shell:
# & "C:\Program Files\Docker Toolbox\docker-machine.exe" env | Invoke-Expression

仮想マシンのホストIPは"192.168.77.101"なので、あとは192.168.77.101:8888にアクセスすれば確認ができる。