Docker를 활용해 nginx 컨테이너 + 여러개의 웹 어플리케이션 컨테이너를 올려서 단일 OS에 다중 웹 서비스를 제공하는 법을 작성함
같은 OS에 여러개의 웹 어플리케이션을 구동함으로써 자원을 효율적으로 활용하고 관리를 수월하게 할 수 있음
결론적으로 해당 방법을 구현하기 위해서는 nginx의 server
설정을 여러개 만들고, 그 안의 server_name
설정을 다르게 해줌
웹 프레임워크는 Python
의 Flask
를 사용하고 웹 서버 통신을 위한 인터페이스는 uwsgi
를 사용하여 컨테이너를 구축
FROM python:3.6.8
ADD . /www
WORKDIR /www
RUN python -m pip install --upgrade pip
RUN pip3 install flask
RUN pip3 install uwsgi
CMD uwsgi uwsgi.ini
uwsgi.ini
[uwsgi]
chdir=/www/src
socket=:5050
wsgi-file=/www/src/app.py
callable=app
master=true
processes=4
threads=2
Dockerfile
: dockerhub
의 nginx
이미지를 그대로 가져온 후 설정할 내용을 default.conf
파일로 작성하여 /etc/nginx/conf.d
디렉토리에 복사
FROM nginx:1.17.4
COPY default.conf /etc/nginx/conf.d/default.conf
CMD ["nginx", "-g", "daemon off;"]
default.conf
의 server
설정을 여러개 작성하여 listen
포트는 80
으로 같지만, 클라이언트가 접근할 server_name
을 다르게 설정함으로써 웹 서비스를 다중으로 제공 할 수 있음
upstream [웹어플리케이션컨테이너명1] {
server [웹어플리케이션컨테이너1]:5050;
}
upstream [웹어플리케이션컨테이너명2] {
server [웹어플리케이션컨테이너2]:5050;
}
server {
listen 80;
server_name [클라이언트 쪽에서 접근하는 서버 도메인1];
location / {
include uwsgi_params;
uwsgi_pass [웹어플리케이션컨테이너명1];
uwsgi_read_timeout 18000;
}
}
server {
listen 80;
server_name [클라이언트 쪽에서 접근하는 서버 도메인2];
location / {
include uwsgi_params;
uwsgi_pass [웹어플리케이션컨테이너명2];
uwsgi_read_timeout 18000;
}
}
nginx
컨테이너와 웹 어플리케이션 컨테이너를 같은 Docker
네트워크에 실행해야함docker network create [임의의 네트워크명]
nginx
에서 설정한 네트워크명과 같아야 함)docker run -d --name [웹어플리케이션컨테이너명1] --network [임의의 네트워크명] [이미지명]
docker run -d --name [웹어플리케이션컨테이너명2] --network [임의의 네트워크명] [이미지명]
docker run -d -p 80:80 --name nginx --network [임의의 네트워크명] --restart=unless-stopped [이미지명]