Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Docker-composeを使ってnode.jsの環境構築をしてみたのよ。

More than 1 year has passed since last update.

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の考え方として
messageImage_1577953535239.jpg

この考え方が定着してると理解しやすいのかなと思います。
まずは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を実行してコンテを作成するのか。

イメージ作成→コンテ起動

これをどのように実現するかだけです。
それでも各オプションでまた挙動は違うので、そこは随時調べながらやっていこうと思います!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away