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를 실행하면 미리 설정한 순서에 맞게 실행이 될 것이다.