#Docker-composeを使ってnode.jsの環境構築をする。
こちらが前回の記事。
Dockerについて基本的なことなぞってみたのよ
こちらでDockerの基本的なことをなぞったので今回はdocker-composeを使っていこうと思います。
##docker-composeとDockerfileどう違う?
docker-composeはdocker-compose.ymlの記述をdocker-compose
コマンドを使ってdockerイメージを作成します。
Dockerfileはdocker build
コマンドでdockerイメージを作成します。
Dockerfile・・・docker image作成手順
docker compose・・・複数のコンテナのアプリケーション定義を記述でき、それぞれのコンテナのdocker imageを作成できる。
この考え方が定着してると理解しやすいのかなと思います。
まずはdocker imageを作成するのが先です。
以下のコマンドでdocker imageを作成することができます。
※認識不足だったら教えてください。
# docker hubからdocker imageをpullする
$ docker pull [IMAGE_NAME]
# 既存のdocker imageからオリジナルのdocker imageを作成する
$ docker commit [CREATE_IMAGE_NAME] [IMAGE_NAME]
# Dockerfileからイメージを作成
$ docker build -t[イメージに名前を設定] [IMAGE_NAME] [Dockerfile/path]
# docker-compose.ymlからイメージを作成
$ docker-compose build
その後docker containerを起動します。
その時のコマンドがこちら
# 単発での起動
$ docker run
# docker-composeでの起動
$ docker-compose up
imageがあってのcontainerと言う考えができたので、早速docker composeを使っていきます。
###docker composeを使う。
おきまりのバージョン確認から。
$ docker-compose -v
docker-compose version 1.24.1, build 4667896b
OKですね。
今回はnode.jsを取り入れていきます。
参考にした記事はこちらです。
【初心者向け】Dockerで手軽にNode.js開発環境構築 (2)
初期のディレクトリ構成はこちら。
MyApp
├─ node
│ ├─ Dockerfile
│ └─ .dockerignore
└─ docker-compose.yml
Dockerfileに記述していきます。
# ベースイメージを指定
FROM node
# node.js の環境変数を定義する
# 本番環境では production
ENV NODE_ENV=development
# 雛形を生成するのに必要なパッケージのインストール
RUN npm install -g express-generator
# ディレクトリを移動する
WORKDIR /app
# ポート3000番を開放する
EXPOSE 3000
次はdocker-compose.yml
version: '3'
services:
webserver:
build: node
image: node-express-dev:1.0
tty: true
volumes:
- ./node/app:/app
ports:
- "8080:3000"
このbuild
と言う部分に注目。
ここにはDockerfileのパスを書きます。
つまりnodeディレクトリの中にあるDockerfileを使ってdocker imageを作成しますよと言う意味なんですね。
なんとなくDockerfileとdocker-composeの関係性が分かったかと思います。
Dockerfileとdocker-compose.ymlの記述が済んだらdocker imageを作成します。
$ docker-compose build
Step 1/5 : FROM node
(省略)
Successfully built c3154d2017fb
Successfully tagged node-express-dev:1.0
と表示されるかと思います。
結局のところ、docker-compoesと言ってもDockerfileからdocker imageを作成していたんですね。
なので、docker-compose.ymlを使うと依存関係なども定義しつつ、複数コンテナのDockerfileを実行できると言った利点があると言ったところでしょうか。
次行きます。
docker images
で先ほどのイメージが作成されてるのを確認したらコンテナを起動させます。
$ docker-compose up -d
docker ps
でコンテナが起動している確認します。
起動していたらログインします。
$ docker exec -it [CONTAINER_NAME] /bin/sh
express-generator で雛形を作成します。
$ express -f --view=pug /app
npmをインストール
$ npm install
サーバー立ち上げ
$ npm start
ブラウザで http://localhost:8080 にアクセスします。
「Express
Welcome to Express」
と表示されればOKです。
以上。
##まとめ
docker runだったり、docker-compose upだったり似たようなコマンドがいっぱいあるので最初は戸惑いますが、やってることはイメージ作成→コンテ起動
だけです。
その方法がたくさんあるだけです。
imageはhubからpullしてくるのか、runでイメージを自動ダウンロードするのか、はたまた既存のイメージを使ってdocker commitでオリジナルイメージを作成するのか、Dockerfileを使ってコードとしてイメージ作成を管理するのか。
コンテナ起動も一緒です。
docker runで取得したイメージでコンテナを作成するのか、docker-compseコマンドでdocker-compose.ymlを実行してコンテを作成するのか。
イメージ作成→コンテ起動
これをどのように実現するかだけです。
それでも各オプションでまた挙動は違うので、そこは随時調べながらやっていこうと思います!