Docker
Docker のメリット、デメリットについてはこの記事が詳しい。
個人的に大事かなと思うProsは以下のふたつ。
複数人で開発する際に、環境の差が生まれない。
バージョンに依存した開発をしてる場合などに、同一の環境である保証ができる。
「It works on my machine!!」とか言えなくなる。
コンテナを捨てる・再生成するのが容易。
たとえば、Node.jsのバージョンを変えたい場合、Dockerfileのimageを書き換えるだけで出来る。
ただDocker自体、職人技とかクセが多かったりもするのでVagrantでいいじゃんとなることもありますが。。。
ここでやること
この記事ではExpress4でnode.jsのプロジェクトを作成してHello Worldを表示するnode.jsコンテナ
ポート80番をnode.jsの3000番にポートフォワードするnginxコンテナ、
使わないかもですが、node.jsコンテナから接続するmysqlコンテナを作成して連携させます。
環境
最近Docker for Macが出たので、ついにVirtualBoxが必要なくなりました ![]()
- Macbook
- Docker for Mac
- Docker Compose
- Node.js v6.9 ※
- Express 4
- MySQL 5.6
※ローカルにもnode.jsが必要です。
express-generator で雛形作成
$ npm install -g express
$ npm install -g express-generator
$ express hello-world
warning: the default view engine will not be jade in future releases
warning: use `--view=jade' or `--help' for additional options
create : hello-world
create : hello-world/package.json
create : hello-world/app.js
create : hello-world/public
create : hello-world/routes
create : hello-world/routes/index.js
create : hello-world/routes/users.js
create : hello-world/public/images
create : hello-world/views
create : hello-world/views/index.jade
create : hello-world/views/layout.jade
create : hello-world/views/error.jade
create : hello-world/public/javascripts
create : hello-world/public/stylesheets
create : hello-world/public/stylesheets/style.css
create : hello-world/bin
create : hello-world/bin/www
install dependencies:
$ cd hello-world && npm install
run the app:
$ DEBUG=hello-world:* npm start
$ cd hello-world/
docker-compose.ymlの作成
node.jsのイメージは公式リポジトリの6.9-alpineを使います。
※ alpineは軽量化されたLinuxイメージです。例えばvimとかインストールされてません。
基本的に必要がなければalpineで進めます。
docker-compose.yml
version: '2'
services:
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "80:80"
volumes:
- "./conf.d:/etc/nginx/conf.d"
links:
- node_express
node_express:
image: node:6.9-alpine
container_name: node_express
hostname: node_express
volumes:
- ".:/src"
working_dir: /src
command: [sh, -c, npm install && npm start]
ports:
- "3000:3000"
links:
- mysql
mysql:
image: mysql:5.6
container_name: mysql56
hostname: mysql
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
ports:
- "3306:3306"
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=sample"
/conf.d/nodejs.conf
80番から3000番ポートフォワーディング
server {
listen 80;
server_name _;
client_max_body_size 10M;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://node_express:3000/;
}
}
proxy_pass http://node_express:3000/;はdocker-compose.ymlのhostnameを指定してます。
一旦これで動くと思うので試してみます。
$ docker-compose -p hello_project up -d --build
http://localhost:3000かhttp://localhostにアクセスするとexpressの画面が表示されるはずです。
docker-composeを止めます。
$ docker-compose -p hello_project kill
Makefileの作成
docker-composeでよく使うコマンドはMakefileにまとめてしまいましょう。
Makefile
PROJECT = hello_project
.PHONY: start
start:
docker-compose -p $(PROJECT) up -d --build
.PHONY: logs
logs:
docker-compose -p $(PROJECT) logs
.PHONY: restart
restart:
docker-compose -p $(PROJECT) kill && \
docker-compose -p $(PROJECT) rm -f && \
docker-compose -p $(PROJECT) up -d --build
.PHONY: kill
kill:
docker-compose -p $(PROJECT) kill
.PHONY: ps
ps:
docker-compose -p $(PROJECT) ps
make start,make restart,make logs,make kill,make psでdocker-composeを操作できるようになりました。
$ make start
docker-compose -p hello_project up -d --build
Creating mysql56
Creating node_express
Creating nginx
$ make ps
docker-compose -p hello_project ps
Name Command State Ports
-----------------------------------------------------------------------------------
mysql56 docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp
nginx nginx -g daemon off; Up 443/tcp, 0.0.0.0:80->80/tcp
node_express sh -c npm install && npm start Up 0.0.0.0:3000->3000/tcp
HostからMySQLコンテナに接続してみる。
$ mysql -h 0.0.0.0 -uroot -proot
$ make kill
docker-compose -p hello_project kill
Killing nginx ... done
Killing node_express ... done
Killing mysql56 ... done
Enjoy your docker life !!
