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