CS/배포

docker로 nginx 설정하기(기본편)

기억용블로그 2022. 7. 2. 19:29
728x90

도커로 nginx를 설정해주는 방법은 크게 2가지 단계로 볼 수 있다.

1. nginx의 설정파일인 /etc/nginx/nginx.conf 수정하기

2. docker-compose.yml 작성 후 up 하기

 

nginx.conf 작성

/etc/nginx/nginx.conf 는 위치와 파일명이 정해져있는 값으로 디폴트로 파일이 주어지지만 

크게 의미있는 내용은 존재하지 않아 아예 다른 곳에 nginx.conf 파일을 새로 작성해서 container가 올라갈때 mount해주는 것이 편하다.

 

마운트될 nginx.conf는 어떤 위치에 작성해도 상관없으나 docker-compose.yml과 같은 디렉토리 혹은 그 밑에 있는 것이 관리측면에서 더 편할 것이라 생각하여 deploy 내에 docker-compose.yml nginx.conf 2개의 파일을 작성해줄 것이다.

 

nginx.conf

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    upstream api { # api는 arbitrary.
        server api:8080; # docker-compose.yml에서 올라가는 컨테이너명으로 작성.
        keepalive 1024;
    }
    server {
        listen 80; # nginx를 통해 외부로 노출되는 port.

        location / {
            proxy_pass         http://api/; # arbitrary한 upstream명
        }
    }
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

 

docker-compose.yml

 

network를 굳이 설정해주지 않아도 compose로 같이 올라가는 컨테이너들은 같은 네트워크로 묶이지만

프록시 서버는 api 서버만 알고 있으면 되고 db는 api 서버만 알고 있으면 되기에 같이 묶어주지 않고 

프록시 서버-api 서버, api 서버-db로 네트워크를 묶어주었다.

 

version: "3.8"

networks:
  front-connection:
    driver: bridge
  db-connection:
    driver: bridge

services:
  nginx:
    container_name: nginx
    image: nginx
    restart: always
    #외부와 소통하는 경우에는 ports로 포트 설정.
    ports: 
      - "80:80/tcp"
      - "443:443"
    volumes:
    #docker-compose.yml과 같은 레벨에 둔 nginx.conf를 mount.
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - front-connection
    environment:
      - TZ=Asia/Seoul
    depends_on:
      - api
      - db
  api:
    image: dockerhub의 image명
    container_name: api
    restart: always
    expose:
    # 외부로 노출되지 않고 같은 네트워크끼리 통신하는 경우에는 expose.
      - "8080"
    networks:
      - db-connection
      - front-connection
    depends_on:
      - db
    environment:
      - SPRING_PROFILES_ACTIVE=application-${profile}.properties로 배포할시 profile.
      - DB_HOST=도커에 올라가는 컨테이너명. (여기서는 mariadb)
      - DB_USERNAME=application.properties에 들어갈 DB 유저네임
      - DB_PASSWORD=application.properties에 들어갈 DB 비밀번호
  db:
    container_name: mariadb
    image: mariadb
    restart: always
    environment:
      - MARIADB_USER=DB 유저네임
      - MARIADB_PASSWORD=DB 비밀번호
      - MARIADB_ROOT_PASSWORD=DB ROOT 비밀번호
      - MARIADB_DATABASE=스키마 이름
    expose:
      - "3306"
    networks:
      - db-connection
    volumes:
    # 미리 생성한 volume
      - mariadb

 

이제 배포 서버에서 docker-compose up -d를 실행하면 미리 설정한 순서에 맞게 실행이 될 것이다.