๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
devOps/Docker

[ ๋„์ปค(Docker) ] docker-compose dev, prod ๋ชจ๋“œ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ

by YWTechIT 2022. 3. 16.
728x90

๐Ÿ“ docker-compose dev, prod ๋ชจ๋“œ๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ

docker-compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nginx๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ๋งค๋ฒˆ ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ SSL์„ ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด nginx.conf์˜ server์ฝ”๋“œ๋ฅผ 80์—์„œ 443์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์ธ์ฆ์„œ์˜ ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •๊ณผ docker-compose - volumes์— letsencrypt ์ธ์ฆ์„œ๋ฅผ ๋„ฃ๋Š” ๊ณผ์ •์ด ํฌํ•จ๋๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ SSL์„ ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋‹ค ๋ณด๋‹ˆ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋ฌด์—‡๋ณด๋‹ค ๊ท€์ฐฎ์•˜๋‹ค. ๊ทธ๋ž˜์„œ docker-compose์— ์•„์˜ˆ SSL์„ ์ ์šฉํ•œ ๋ฒ„์ „๊ณผ SSL์„ ์ ์šฉํ•˜์ง€ ์•Š์€ ๋ฒ„์ „์œผ๋กœ ๋‚˜๋ˆ„๋ฉด ์–ด๋–จ๊นŒ?๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

 

docker ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ -f ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํŒŒ์ผ์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋งŒ์•ฝ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ docker-compose ํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹ถ์œผ๋ฉด -f๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ  -f๋ฅผ ์‚ฌ์šฉํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋นŒ๋“œํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ์—ˆ๋‹ค. ๋˜ docker-compose์˜ service ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด ์ด์ „ ํŒŒ์ผ์— overrideํ•œ๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด์žˆ๋‹ค.

728x90

๊ทธ๋ž˜์„œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์กด์— docker-compose.yml ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด docker-compose.yml, docker-compose-dev.yml, docker-compose-prod.yml์ฒ˜๋Ÿผ ํŒŒ์ผ์„ 3๊ฐœ๋กœ ๋‚˜๋ˆ„์—ˆ๊ณ , ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” docker-compose.yml ํŒŒ์ผ์— ์ž‘์„ฑํ•˜๊ณ  SSL์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์€ docker-compose-dev.yml์— ์ €์žฅํ•˜๊ณ , SSL์„ ์ ์šฉํ•˜๋Š” ๋ฒ„์ „์€ docker-compose-prod.yml์— ์ €์žฅํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ณตํ†ต์œผ๋กœ ์ž‘์„ฑํ•œ ํŒŒ์ผ์— dev ๋ฒ„์ „๊ณผ prod ๋ฒ„์ „์ด override๋˜๋‹ˆ๊นŒ ๋ช…๋ น์–ด๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ nginx์˜ volume ๋˜ํ•œ SSL์„ ์ ์šฉํ•  ๋•Œ์˜ nginx.conf์™€ SSL์„ ์ ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ์˜ nginx.dev.conf๋กœ ๋‚˜๋ˆ„์–ด ์ ์šฉํ–ˆ๋”๋‹ˆ ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

doc์„ ๋”ฐ๋ผ ์ž‘์—…ํ•ด๋ณด๋‹ˆ ์ด ๋ฐฉ์‹์€ ํ”„๋ก ํŠธ์—์„œ webpack์„ ์‚ฌ์šฉํ•  ๋•Œ webpack-merge๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ development์™€ production ๋ชจ๋“œ๋กœ ๋‚˜๋ˆŒ ๋•Œ webpack.config.js๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  webpack.common.js, webpack.dev.js, webpack.prod.js๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

๋‚˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋กœ ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ–ˆ๋Š”์ง€ ๋ช…๋ น์–ด, docker-compose, nginx ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉฐ ๊ธ€์„ ๋งˆ์น˜๊ฒ ๋‹ค.

# before command
docker-compose -f docker-compose.yml up -d --build

# after command
docker-compose -f docker-compose.yml -f docker-compose-prod.yml up -d --build
# before refactor docker-compose.yml
# docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx
    volumes:
      - ./Frontend/dist/:/usr/share/nginx/html
      - ./Nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - backend

  backend:
    build:
      context: ./Backend
      dockerfile: Dockerfile
    ports:
      - "7777:7777"
    env_file:
      - ./Backend/.env

# after refactor docker-compose.yml
# docker-compose.yml
version: "3"
services:
  backend:
    build:
      context: ./Backend
      dockerfile: Dockerfile
    ports:
      - "7777:7777"
    env_file:
      - ./Backend/.env

# docker-compose-dev.yml
version: "3"
services:
  nginx:
    image: nginx
    volumes:
      - ./Frontend/dist/:/usr/share/nginx/html
      - ./Nginx/nginx-dev.conf:/etc/nginx/nginx.conf
    ports:
      - "1111:80"
    depends_on:
      - backend

  backend:
    build:
      context: .
      args:
        NODE_ENV: development
    volumes:
      - ./:/app
    command: npm run dev

# docker-compose-prod.yml
version: "3"
services:
  nginx:
    image: nginx
    volumes:
      - ./Frontend/dist/:/usr/share/nginx/html
      - ./Nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./dhparam:/etc/nginx/dhparam
      - /etc/letsencrypt:/etc/nginx/ssl
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - backend

  backend:
    build:
      context: ./Backend
      dockerfile: Dockerfile
      args:
        NODE_ENV: production
    command: npm run deploy
# nginx.conf
user nginx; 
worker_processes 1; 

events {
    worker_connections 1024;
}

http {
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name <domain>;
        root /usr/share/nginx/html/;

        location ~ /.well-known/acme-challenge {
            allow all;
            root /usr/share/nginx/html/;
        }

        location / {
            return 301 <domain>;
        }
    }

    server {
        listen 443 ssl;
        server_name <domain>;
        root /usr/share/nginx/html/;
        server_tokens off;
        ssl_certificate /etc/nginx/ssl/live/<domain>/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/live/<domain>/privkey.pem;
        ssl_dhparam /etc/nginx/dhparam/dhparam-2048.pem;

        ssl_buffer_size 8k;
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

        location / {
           try_files $uri /index.html;
        }

        location /api {
            proxy_pass http://backend:7777;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

# nginx.dev.conf
user nginx; 
worker_processes 1; 

events {
    worker_connections 1024;
}

http {
    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name localhost;
        root /usr/share/nginx/html/;

        location / {
            try_files $uri /index.html;
        }

        location /api {
            proxy_pass http://backend:7777;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

reference

  1. https://docs.docker.com/compose/reference/#use--f-to-specify-name-and-path-of-one-or-more-compose-files
  2. https://docs.docker.com/compose/reference/#specifying-multiple-compose-files
  3. https://webpack.kr/guides/production/#setup
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€