배포 자동화 - docker

docker의 특징과 사용방법에 대해서 알아봅시다

작성자

홍세민

홍세민

MarcusHong

docker

한 서버에 웹서버, api서버, admin서버, 결제서버등과 같이 여러 프로젝트를 실행하는 경우, docker로 올리는 것이 서로간에 충돌을 피할 수 있는 좋은 방법이다. pm2로 배포 후 docker로 빌드하는 방법을 알아보자.(pm2에 대한 설명은 이전 포스팅 배포자동화 - pm2를 참고.)

Dockerfile

이미지를 빌드할 때 필요한 파일을 복사한다.

FROM node:10-alpine

ARG NODE_ENV
ENV NODE_ENV $NODE_ENV

WORKDIR /app

COPY ./package*.json ./
RUN npm i --production

COPY ./backend ./backend

docker-compose.yml

테스트 서버의 환경변수와 빌드 이미지 이름 지정

version: '3.6'
services:
  api:
    image: example/api-dev:latest
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - NODE_ENV=development
    ports:
      - 3000:3000
    restart: always
    command: npm start

docker-compose-production.yml

프로덕션 서버의 환경변수와 빌드 이미지 이름 지정

version: '3.6'
services:
  api:
    image: example/api:latest
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - NODE_ENV=production
    ports:
      - 3000:3000
    restart: always
    command: npm start

pre-setup.sh

setup에서 docker 설치

#!/usr/bin/env bash

#update instance
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common -y

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose
sudo usermod -a -G docker $USER

ecosystem.config.js

--build 옵션을 넣어주면 docker를 빌드 후 docker 이미지를 실행 혹은 재실행한다.

module.exports = {
  deploy: {
    dev: {
      key: '~/.ssh/{key path}',
      user: '{root user}',
      host: '{host address}',
      ref: 'origin/develop',
      repo: '{git repo}',
      ssh_options: ['StrictHostKeyChecking=no', 'PasswordAuthentication=no', 'ForwardAgent=yes'],
      path: '{install path}',
      'pre-setup' : 'scripts/pre-setup.sh',
      'post-deploy': `docker-compose -p api up -d --build`
    },
    production: {
      key: '~/.ssh/{key path}',
      user: '{root user}',
      host: '{host address}',
      ref: 'origin/develop',
      repo: '{git repo}',
      ssh_options: ['StrictHostKeyChecking=no', 'PasswordAuthentication=no', 'ForwardAgent=yes'],
      path: '{install path}',
      'pre-setup' : 'scripts/pre-setup.sh',
      'post-deploy': 'docker-compose -f docker-compose-production.yml -p api up -d --build'
    }
  }
}

정리

하나의 프로젝트만 업로드 할 경우에는 굳이 docker를 쓸 필요는 없다고 보지만, 여러 프로젝트가 같이 있을 경우에는 프로젝트간 간섭을 피하는 방법에는 docker를 사용하는 것이 좋다.

Tags : docker 

comments powered by Disqus