web-technical-blog

web開発に関する技術メモ

Docker compose

  • npmコマンドが使用できる必要あり
  • docker-composeコマンドが使用できる必要あり

docker-compose.ymlファイルとは

docker-compose.ymlファイルは以下のようにyaml形式でDockerコンテナに関する起動オプション(buildオプションも含まれることもある)を記述したファイル

docker-compose.ymlサンプル

web:
  build: .
  ports:
    - "5000:5000"
  volumes:
    - .:/code
  links:
    - redis
  redis:
    image: redis

# yaml の記載方法については下記を参照
# https://docs.docker.com/compose/compose-file/

Docker Compose概要

Docker composeとは複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を用意にする機能 Docker composeでは、composeファイルを用意してコマンドを1回実行することで、そのファイルから設定を読み込んで全てのコンテナサービスを起動することができる

Docker Composeを使うまでの主なステップ

  • それぞれのコンテナのDockerfieを作成する(既にあるイメージを使う場合は不要)
  • docker-compose.ymlを作成し、それぞれ独立したコンテナの起動定義を行う(場合によっては構築定義も含まれる)
  • docker-compose upコマンドを実行してdocker-compose.ymlで定義したコンテナを開始する

動作確認を行う環境について

(Working dir)
+- docker-compose.yml
+- app-server/
    +- Dockerfile
    +- src/
        +- app.js

Docker composeを使用した簡単なサンプル

Docker composeを使用した複数コンテナでひとつのサービスを作成するサンプルを実施してみる redisを使用してアクセス数をカウントする簡単なアプリケーションを作成してみる

application側の作成

アプリケーション側はnode.jsを使用する nodeの公式レポジトリを使用するための、Dockerfileは以下のように簡単なもの

app-server/Dockerfile

FROM node:5
RUN npm -g install redis
ENV NODE_APTH /usr/local/lib/mode_modules

ENTRYPOINT ["node", "app.js"]

npmはnode.jsのpackageを管理するためのツール ENTRYPOINT ["node", "app.js"]は nodeコマンドの引数にapp.jsを渡している

Redis側の作成

Redis側のコンテナの作成を行うが、公式のRedisイメージを使用するため、Dockerfileは不要

Docker composeファイルの作成

アプリ側のnodeのアプリケーションとredis側のアプリケーションをbuild,runするための定義をdocker-coposeファイルに記載する

docker-compose.yml

nodeapp:
  build: "./app-server"
  container_name: "nodeapp"
  working_dir: "/usr/src/app"
  ports:
   - "10080:10080"
  volumes:
   - "$PWD/app-server/src:/usr/src/app"
  links:
   - "noderedis"
noderedis:
  image: "redis:3"
  container_name: "noderedis"

nodeのアプリケーションが乗るコンテナは、Dockerfileからイメージをbuildしてそこからnodeappという名前のコンテナを起動する redisが乗るコンテナについては、DockerfileからイメージをせずDocker hubからpullしてきた公式イメージを利用し、そこからnoderedisという名前のコンテナを起動する

docker-compose.ymlファイルのあるディレクトリ移動し、docker-compose upコマンドを実行する

$ docker-compose up

動作確認

$ curl http://localhost:10080
You accessed here 1 times.
$ curl http://localhost:10080
You accessed here 2 times.

docker-composeコマンドで作成されるイメージ名

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wk_nodeapp          latest              c36a03206379        15 minutes ago      649MB
redis               3                   256639e384de        8 weeks ago         99.7MB
node                5                   12b4a63115bc        17 months ago       648MB

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
9fa382e87f70        wk_nodeapp          "node app.js"            15 minutes ago      Up 15 minutes       0.0.0.0:10080->10080/tcp   nodeapp
dba91dafd516        redis:3             "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       6379/tcp                   noderedis

docker-compose.yml

nodeapp:                            # <- サービス名
  build: "./app-server"             # <- Dockerfile のあるファイルの場所(Dockerfile のある場所。git リポジトリのURL も指定可能)
  container_name: "nodeapp"         # <- コンテナ名。指定しなかった場合はDocker compose で勝手に決められる
  working_dir: "/usr/src/app"       # <- コンテナ内のワーキングディレクトリ。docker run コマンドの-w/--workdir に相当
  ports:                            # <- Expose するポート。docker run コマンドの-p/--publish に相当
   - "10080:10080"
  volumes:                          # <- Bind mount するディレクトリ。volume。docker run コマンドの-v/--volume に相当
   - "$PWD/app-server/src:/usr/src/app"
  links:                            # <- 他のコンテナと接続するときのコンテナ名。docker run コマンドの--link に相当
   - "noderedis"
noderedis:
  image: "redis:3"                  # <- イメージIDとtag
  container_name: "noderedis"

参考URL https://qiita.com/TsutomuNakamura/items/7e90e5efb36601c5bc8a