読者です 読者をやめる 読者になる 読者になる

Melchior

バンクーバーあたりで働くエンジニアの備忘録

Dockerでローカル開発環境のセットアップ

概要

開発環境のセットアップをVagrantからDockerに移行しました。 サーバ間通信のテストもしているので今回は同時にNode.jsのクラスタサーバをセットアップします。

一番の目的は、新人さんがWindowsやらUbuntuやらでうまくVagrantfileが動かなかったのでこれを機にDockerでセットアップすることにしました。 これで文句は言わせまい。

docker-composeの作成

yamlファイルはこちらです。

# mysql
version: "3"
services:
  mysql:
    container_name: mysql
    image: mysql:5.7.17
    ports:
      - "3306:3306"
    expose:
      - "3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql
  redis:
    container_name: redis
    image: redis
    ports:
      - "6379:6379"
  nginx:
    container_name: nginx
    restart: always
    build: ./nginx
    ports:
      - "80:80"

開発の作業はローカルで行いたいので、MysqlはDockerの外部からアクセスが必要なためexposeします。docsが優秀なので何か特別なことをやりたい場合は公式ドキュメントを参照してください。NginxはNode.jsのクラスタ用です。Nginxの中身はこちらを参考にしました。NginxのconfigはWebsocket用の設定です。

nginx
└─ Dockerfile
└─ sites-enabled 
  └─ default
# Dockerfile
FROM tutum/nginx
RUN rm /etc/nginx/sites-enabled/default
ADD sites-enabled/ /etc/nginx/sites-enabled
# default
upstream websockets {
  server localhost:3000;
  server localhost:3001;
}

server {
  listen 80;
  location / {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_pass http://websockets;
  }
}

開発環境のセットアップ

docker-compose up -dを実行すれば空のMySQL、Redis、Nginxが立ち上がるのですが、新人さんが嵌りそうなのでどうにか自動化できないかなぁとshellスクリプトも書くことにしました。 Windows以外は自動的にセットアップが完了するかなぁと思います。もしNginxがうまく動かなかったら手動で設定する必要があります。

#! /bin/sh

# Hostの取得
if type ipconfig; then
  # mac
  HOST=$(ipconfig getifaddr en0) 
elif type netstat; then
  # linux (引用元が見つかりませんでした…すみません><)
  HOST=$(netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}')
else
  HOST=""
fi

# Nginxの設定
nginxconf="./nginx/sites-enabled/default"
if [ "$HOST" != '' ]; then
  echo HOST: $HOST
  sed -i.bak -e "s/localhost/$HOST/g" $nginxconf
  # TODO sed~
  rm $nginxconf.bak
else
  echo "WEARING: need to modify nginx ip address"
fi

# Dockerの起動
docker-compose up --build -d

# 依存ファイルのインストール
npm i
npm i -g mocha pm2

# MySQLの自動セットアップ
...

# サーバの起動
pm2 start pm2.json
// pm2.json
{
  "name": "test-cluster",
  "script": "server.js",
  "exec_mode": "fork",
  "instances": 2,
  "merge_logs": true,
  "out_file": "./log/pm2/out.log",
  "error_file": "./log/pm2/error.log"
}

Docker上のNginxでローカルのipアドレスがうまく解決できなかったので、無理やり解決しています、もっといい方法があるかもしれません。。

まとめ

docker-composeがとても便利でした。 来週新人さんが来るのでうまく動くことを祈っています、おそらくmacユーザではないです。

リンク