Docker를 활용한 여러개의 웹 어플리케이션 구축

king_co_king·2023년 10월 2일
0

0. 개요

Docker를 활용해 nginx 컨테이너 + 여러개의 웹 어플리케이션 컨테이너를 올려서 단일 OS에 다중 웹 서비스를 제공하는 법을 작성함

같은 OS에 여러개의 웹 어플리케이션을 구동함으로써 자원을 효율적으로 활용하고 관리를 수월하게 할 수 있음

결론적으로 해당 방법을 구현하기 위해서는 nginx의 server 설정을 여러개 만들고, 그 안의 server_name 설정을 다르게 해줌


1. 웹 어플리케이션

  • 웹 프레임워크는 PythonFlask를 사용하고 웹 서버 통신을 위한 인터페이스는 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

2. nginx

  • Dockerfile: dockerhubnginx 이미지를 그대로 가져온 후 설정할 내용을 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.confserver설정을 여러개 작성하여 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;
        }
    
    }

3. Docker Network 설정 및 컨테이너 실행

  • 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 [이미지명]

profile
난 왕코딩왕. 바퀴는 이미 발명됐다. 난 백미러를 만드는 사람.

0개의 댓글