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 !!