docker-compose(Docker for mac)로 실용적인 node.js 개발 환경 만들기

도커



Docker의 장점과 단점은 이 기사
개인적으로 소중하다고 생각하는 Pros는 이하의 2개.

여러 사람이 개발할 때 환경의 차이가 생기지 않습니다.

버전에 의존한 개발을 하고 있는 경우 등에, 동일한 환경인 보증을 할 수 있다.
"It works on my machine!!"라고 말할 수 없게 된다.

컨테이너를 버리거나 재생성하기 쉽습니다.

예를 들어, Node.js 의 버젼을 바꾸고 싶은 경우, Dockerfileimage 를 재기록하는 것만으로 할 수 있다.
단지 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.ymlhostname 를 지정합니다.

    일단 이것으로 움직인다고 생각하므로 시험해 보겠습니다.
    $ 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 !!

    좋은 웹페이지 즐겨찾기