본문 바로가기

개인 프로젝트/하루하나 달성표

[aws] Route53 등록 및 ec2 연동 (2) - docker-compose를 사용한 서버 세팅

* 주의: 해당 포스팅은 독자에게 도커에 대한 이해가 있다는 전재를 하고 작성되었다. 

 

이제 내 도메인 주소로 토이 프로젝트에 접속할 수 있도록 설정해야 한다. 

이를 위해서는 아래와 같은 사전조건이 필요하다. 

 

1. 도메인을 적용할 웹 서버가 필요하다. (ex. nginx)

2. 도메인에 ssh 적용이 필요하다. 그래야 내 도메인에 https로 접속할 수 있다.

 

개발환경은 각자의 취향에 따라 세팅할 수 있겠으나, 나는 아래와 같이 구성했다. 

토이 프로젝트: python(fastapi) + uvicorn 
웹 서버: nginx 
인증서 등록: certbot 
→ docker-compose를 사용해서 구동 

 

즉, docker-compose를 실행했을 때 토이 프로젝트 + 웹 서버 + 인증서 서비스가 각각의 컨테이너로 실행되어야 한다. 

 

docker-compose.yml 파일을 설명하기 전에, 현재 내 서버 파일 디렉터리 구조를 먼저 공유한다. 이러는 편이 설명하기 더 쉬울 것 같다. 

/app 경로 아래에 Dockerfile, docker-compose.yml 파일이 있다. 

그리고 토이프로젝트 소스가 있는 haruhana-server 폴더, 그리고 서비스에 필요한 설정파일을 저장한 data 폴더가 있다.

 

아래가 내가 사용한 docker-compose.yml 파일이다. 

services:
  app:
    build:
      context: .
    command: uvicorn core.main:app --host 0.0.0.0 --port 8000 --reload
    volumes:
      - /app/haruhana-server:/app
    env_file:
      - ./haruhana-server/.env

  nginx:
    image: nginx:1.25
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./data/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot
    depends_on:
      - app
      - certbot

  certbot:
    image: certbot/certbot
    volumes:
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot

 

3개의 서비스가 뜨는 걸 확인할 수 있다. 

 

· app

내가 만든 토이프로젝트다. app.build.context를 현재 경로로 지정해서, 로컬에 위치한 Dockerfile을 빌드해서 서버를 실행하도록 만들었다. 

중요한 부분은 아니니 자세히 설명하지 않겠다. 

 

· nginx 

토이 프로젝트에서 uvicorn으로 서버가 실행되지만, 이와 별개로 앞단에 웹서버를 두는 게 더 안정적이라고 판단했다. 

설정을 보면 80, 443 포트를 열어준 걸 확인할 수 있다. 

그리고 volume 설정이 되어 있는데, 해당 부분이 중요하다. 

 

도커 컨테이너 속 저장소는 영구적이지 않다. 컨테이너를 내렸다가 다시 올리면 데이터가 날아간다는 의미다. 

그러나 한 번 발급받은 https 인증서는 영구적으로 보관되어야 한다. 

도커의 volume 기능을 사용하면 컨테이너 내부 저장소와 외부 저장소를 연결해준다. 

볼륨 부분만 따로 떼어내서 자세히 보자. 

    volumes:
      - ./data/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./data/certbot/conf:/etc/letsencrypt
      - ./data/certbot/www:/var/www/certbot

첫번째 줄은 로컬에 있는 ./data/nginx.conf 파일을, 도커 컨테이너 내부의 /etc/nginx/nginx.conf 경로로 마운트한다는 의미다. 맨 끝의 :ro는 read-only를 의미한다. 

도커 컨테이너에 직접 들어가서 nginx.conf 파일을 수정할 필요 없이, 로컬에 nginx.conf 파일을 미리 작성해놓고 컨테이너가 실행될 때 마운트한다. 

이를 보면 로컬 data 폴더 안에 nginx.conf 파일이 있는 것을 유추할 수 있다. 이는 아래에서 추가로 설명하겠다. 

 

두번째, 세번째 줄은 인증서 관련 설정이다. 

nginx랑 certbot은 같은 인증서 파일을 공유해야 한다. 따라서 폴더명만 봤을 때는 certbot에 필요한 속성 아닌가? 생각할 수 있지만, nginx에도 똑같이 적용해야 한다. certbot이 생성한 인증서를 nginx에서 참조해야 하기 때문이다. 

 

· certbot 

certbot은 Let's encrypt를 사용해서 ssl 인증서를 발급하게 해주는 도구다.

로컬 저장소에 인증서를 보관하기 위해, nginx 설정과 동일하게 볼륨 속성을 추가하였다. 

 

 

이제 ./data 폴더 내에 있는 파일을 살펴보자. 

certbot 폴더는 임의로 생성해두었다. 내부에는 아무것도 안 만들어도 괜찮다. certbot 컨테이너가 올라오면서 자동으로 파일이 생성된다. 

nginx.conf는 여러 블로그를 참고하며 설정을 작성하였다. 파일 내용은 아래와 같이 작성하면 된다. 

events {}

http {
        server {
                listen 80;
                server_name ${your_domain} www.${your_domain};

                location /.well-known/acme-challenge/ {
                        root /var/www/certbot;
                }

                location / {
                        proxy_pass http://app:8000;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                        proxy_set_header X-Forwarded-Proto $scheme;
                }
        }
}

 

내 도메인에 대해, 80번 포트로 라우팅이 되도록 설정한 파일이다. 443 포트는 아직 설정할 필요 없다. 인증서가 발급된 뒤에 설정한다.

server_name에는 내 도메인, 그리고 www 를 붙인 도메인을 공백으로 구분해서 적어줬다. 

/.well-known/acme-challenge/ 로 요청이 왔을 시 /var/www/certbot 으로 전송할 수 있도록 설정해준다. 

proxy_pass에서 http://app:8000; 으로 주소가 설정되어 있는데, 여기서 app은 docker-compose에서 띄운 서비스 이름이다. 

 

 

모든 설정이 완료되었으면 이제 도커를 실행한다. 

docker-compose up -d --build 

 

실제로 ps를 확인해서 컨테이너가 정상적으로 떠있는지 확인해야 한다. 

docker ps 

certbot은 안 떠있는게 맞다. nginx랑 app이 떠있는지 확인한다. 

 

필요 시 컨테이너 로그도 함께 확인한다. 

docker-compose logs ${service_name}

방금 컨테이너를 띄웠는데 진입 로그가 있는 걸 보니 해킹봇이 내 웹페이지에 요청을 한 모양이다.

정상적으로 떠있는 건 확인된 것 같다. 

 

 

이러면 서버 세팅은 끝난 것 같다. 다음 포스팅에서 인증서 발급을 해보자. 

 

 

- 참고 자료 

https://coor.tistory.com/45 

 

Nginx 다중 도메인 서버 설정하기

Nginx를 사용하여 단일 인스턴스에서 여러 도메인에 로드밸런싱과 HTTPS 연결하여 안전하게 운영하는 법에 대해 알아보겠습니다.  1. 도메인 구입하기가비아 사이트에서 1년 할인 받아서 15,000원

coor.tistory.com

https://bitgadak.tistory.com/6

 

certbot 으로 let's encrypt 인증서 발급받기

certbot 을 통해 let's encrypt 인증서를 발급받아보자. 현재로서는 가장 간단한 방법인 것 같다. 공식 사이트 가이드를 따라 진행한다. 아래 페이지를 참고했다. certbot 가이드: https://certbot.eff.org/instruc

bitgadak.tistory.com

 

https://seosh817.tistory.com/387#google_vignette

 

[Docker] 도커 컴포즈(Docker compose) - 개념 정리 및 사용법

이번 포스트에서는 도커 컴포즈에 대해 정리하겠습니다. 도커 컴포즈란? 도커 컴포즈는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업

seosh817.tistory.com