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

#Docker-composeを使ってnode.jsの環境構築をする。
こちらが前回の記事。
[Dockerについて基本的なことなぞってみたのよ](https://qiita.com/art_porokyu/items/bb96db922bf1e5742036)
こちらで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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302326/0cd5688b-72a1-11cb-8ccb-f8fa4846d34e.jpeg)


この考え方が定着してると理解しやすいのかなと思います。
まずは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)](https://qiita.com/yukin01/items/4f54496fd2f577c56b1d)

初期のディレクトリ構成はこちら。

```
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を実行してコンテを作成するのか。

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

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