Docker入門と基礎知識(2)

前回のDocker入門と基礎知識(1)ができるようになったら、Docker内で実際に小さなプロジェクトを動かしてみます。
むかーしむかしはローカルPC内にApacheを起動させたりxamppやmamppでwebサーバーを作ったり、もっとむかしはIISとかでwebサーバーを作っていたはずです。それがコンテナ内で比較的お手軽に制作でき且つそのままデプロイできるというのが魅力です。

Dockerはコマンドライン操作が基本ですが面倒くさい操作は、

  • Dockerfile
  • .dockerignore
  • docker-compose.yml

というファイルに、かくかくしかじかの設定情報を書いてまとめてビルドします。
いわゆるpackage.jsonとかcomposer.jsonとか諸々の設定ファイルみたいなものです。

プロジェクトを立ち上げる

Dockerを使ってローカル環境にサンプルのプロジェクトをつくってみましょう。ここではnode.jsと Expressで簡易的な動作だけ確認できる環境を作ります。なのでnode.jsが使える環境であることが前提となります。

node -v
v9.2.0

プロジェクトファイルを作成します。

nodeApp [D]
├─ node [D]
│   ├─ app  [D]   
│   ├─ Dockerfile
│   └─ .dockerignore
└─ docker-compose.yml

Dockerfileの作成

Docker構築の設計図というかコマンドみたいなもので、これらの定義を読み込んでDockerは構築されます。長ったらしいコマンドラインはこれで解消されます。
Dockerfile リファレンス
Best practices for writing Dockerfiles

# ベースイメージを指定
# 今回は LTS の 8.9.4 にする
# alpine は 軽量の linux OS
FROM node:8.9.4-alpine

# node.js の環境変数を定義する
ENV NODE_ENV=development

# 雛形を生成するのに必要なパッケージのインストール
RUN npm install -g express-generator@4.16.0

# ディレクトリを移動する
WORKDIR /app

# ポート3000でリスン
EXPOSE 3000

ベースイメージ FROM

感覚的にはのっけるOSみたいなものを指定します。上記では「node:8.9.4-alpine」ですが、「centos:7」とか「ubuntu:15.04」とかいろいろ指定できます。自分が作成したいイメージ(そのOSみたいなもの)をどうするのかは、いろんなところにDockerfileの書き方が載っているのでそれを参考にしましょう。Dockerfile リファレンス

環境変数 ENV

環境変数はDockerの中で利用が可能です。

ENV KEY=VALUE
(or)
ENV VALUE1 VALUE2 VALUE3 

という形式で記述できます。
Dockerfile リファレンス#ENV

実行 RUN

そのまんまです。Dockerを立ち上げたときに実行されるスクリプトです。ファイルの実行パーミッションに注意。

WORKDIR

WORKDIRはDockerfileでRUN,CMD,ENTRYPOINT,COPY,ADD 命令実行時の作業ディレクトリ(working directory)を指定します。

ポート EXPOSE

EXPOSEは、特定のネットワーク・ポートをコンテナが実行時にリッスンするポートの指定です。

ここまでで概ねDockerfileの設定はOKです。

docker-compose.ymlの作成

version: '3'
services:
  webserver:
    build: node
    image: node-express-dev:1.0
    container_name: node
    tty: true
    volumes:
      - ./node/app:/app
    ports:
      - "8080:3000"

services 以下にコンテナの情報を記述していく

webserver

Docker が構築する Network でのホスト名になる(任意の名前で良い)
例えばこの場合、別のコンテナから node に繋げたいときは http://webserver:3000 といった感じ。

build

Dockerfile があるディレクトリを指定する。省略した場合は local または Docker Hub からイメージを取得する。

image

イメージの名前を指定する。build の有無で意味が変わる。

container_name

コンテナ名

tty

コンテナ内の標準出力とホストの出力を繋げるためのもの
docker run 時の -t オプションに対応。これがないとコンテナがすぐ終了してしまうため、基本的にtrue

volumes

ボリュームには2種類あるので気をつけること
この場合はコンテナのディレクトリをホスト(Mac)のディレクトリにマウントするという意味。

現時点でホストには ./node/app というディレクトリは存在しないが
この状況で Compose を立ち上げるとホストにディレクトリが生成され、コンテナ内のディレクトリとしてマウントされる。
こうすることで VSCode などのエディタでホストのファイルを直接編集すればコンテナ内のファイルを編集したことになるので、開発がすごく楽になる

ports

この場合はコンテナのポートとホストのポートを繋げる役割
例えば http://localhost:8080でnodeコンテナの3000番に繋がる。

コンテナを起動する

docker-compose.yml が置いてあるディレクトリに移動する。

$ cd nodeApp

Dockerfile からイメージをビルドする。
Docker Compose

$ docker-compose build

Building webserver
Step 1/5 : FROM node:8.9.4-alpine
 ---> 406f227b21f5
Step 2/5 : ENV NODE_ENV=development
 ---> Using cache
 ---> 2d270711879d
Step 3/5 : RUN npm install -g express-generator@4.16.0
 ---> Using cache
 ---> d782896579c8
Step 4/5 : WORKDIR /app
 ---> Using cache
 ---> 5d9b871e9df3
Step 5/5 : EXPOSE 3000
 ---> Using cache
 ---> 93f692187593
Successfully built 93f692187593
Successfully tagged node-express-dev:1.0

コンテナを生成と起動 スタート(start)ではなく初回の生成(up)になります。*1

$ docker-compose up -d
node is up-to-date

upするとnodeApp内(カレントディレクトリ内)にappディレクトリが生成されます。
生成されたappに移動します。

$ cd app

psで稼働中のプロセス確認します。

$ docker ps
CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                    NAMES
d3da274bf159        node-express-dev:1.0   "node"              2 hours ago         Up 2 hours          0.0.0.0:8080->3000/tcp   node

nodeを立ち上げる。(たぶんプロンプトが/appになるはず)
Dockerを通してnodeを立ち上げるってことになりますか。

$ docker exec -it node /bin/sh

ここですでにappでの実行環境になっているのでDockerを通す必要がなくなっているのかな。。

$ npm install

Expressを立ち上げる。

$ npm start

ブラウザーでhttp://localhost:8080/にアクセスするといつものExpress画面が見れます。



停止・削除

Dockerコンテナ停止

$ docker-compose stop
Stopping node ... done

次回からdocker-compose startで起動することができます。(*1)

$ docker-compose start

削除する場合は、

$ docker rm node (or d3da274bf159)


Dockerfileを書いてみる

Last update: 2018.09.13 (木)