* 주의: 해당 포스팅은 독자에게 도커에 대한 이해가 있다는 전재를 하고 작성되었다.
이제 내 도메인 주소로 토이 프로젝트에 접속할 수 있도록 설정해야 한다.
이를 위해서는 아래와 같은 사전조건이 필요하다.
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}

방금 컨테이너를 띄웠는데 진입 로그가 있는 걸 보니 해킹봇이 내 웹페이지에 요청을 한 모양이다.
정상적으로 떠있는 건 확인된 것 같다.
이러면 서버 세팅은 끝난 것 같다. 다음 포스팅에서 인증서 발급을 해보자.
- 참고 자료
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
'개인 프로젝트 > 하루하나 달성표' 카테고리의 다른 글
| [aws] Route53 등록 및 ec2 연동 (1) - Route53 등록 (0) | 2025.09.13 |
|---|