AWS EC2에서 NVIDIA GPU를 사용하는 FastAPI 백엔드 서버를 Docker Compose로 구동하고, Nginx 리버스 프록시를 통해 외부 접속 환경을 구축했다. 최종적으로 안정적인 배포 환경을 확보했지만, 그 과정은 결코 순탄하지만은 않았다.
우선 프로젝트 경로에 back 레포지토리를 클론했다.
ubuntu@hancom-team2:~/project$ git clone https://github.com/Newrun-way/back.git
'back'에 복제합니다...
remote: Enumerating objects: 175, done.
remote: Counting objects: 100% (175/175), done.
remote: Compressing objects: 100% (116/116), done.
remote: Total 175 (delta 68), reused 148 (delta 41), pack-reused 0 (from 0)
오브젝트를 받는 중: 100% (175/175), 918.49 KiB | 61.23 MiB/s, 완료.
델타를 알아내는 중: 100% (68/68), 완료.
ubuntu@hancom-team2:~/project$ ls
OWPML1 back
도커파일을 포함한 레포지토리의 내용이 잘 복제되었다. 속도가 무지막지하게 빨랐다. 그램 노트북과는 비교를 불허했다.
바로 도커 빌드를 하려고 하니,
ubuntu@hancom-team2:~/project/back$ sudo docker compose up -d --build
sudo: docker: 명령이 없습니다
ubuntu@hancom-team2:~/project/back$ docker compose up -d --build
명령어 'docker' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다:
sudo snap install docker # version 28.4.0, or
sudo snap install docker # version 28.1.1+1
sudo apt install podman-docker # version 3.4.4+ds1-1ubuntu1.22.04.3
sudo apt install docker.io # version 28.2.2-0ubuntu1~22.04.1
'snap info <snapname>'에서 추가 버전을 확인하십시오.
도커가 설치되지 않은 것을 확인할 수 있었다.
sudo 명령어로 설치를 할 수 있는지 권한을 확인해보려면, sudo whami를 사용해서 root가 출력되는지 확인하면 된다.
ubuntu@hancom-team2:~/project/back$ sudo whoami
root
ubuntu@hancom-team2:~/project/back$ sudo apt update
기존:1 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy InRelease
받기:2 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]
받기:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-backports InRelease [127 kB]
받기:4 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
받기:5 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [3,076 kB]
받기:6 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main Translation-en [475 kB]
받기:7 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/main amd64 c-n-f Metadata [19.0 kB]
받기:8 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [4,853 kB]
받기:9 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/restricted Translation-en [903 kB]
받기:10 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,242 kB]
받기:11 http://us-east-1.ec2.archive.ubuntu.com/ubuntu jammy-updates/universe Translation-en [308 kB]
받기:12 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [2,815 kB]
받기:13 http://security.ubuntu.com/ubuntu jammy-security/main Translation-en [408 kB]
받기:14 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [4,700 kB]
받기:15 http://security.ubuntu.com/ubuntu jammy-security/restricted Translation-en [876 kB]
받기:16 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [1,009 kB]
받기:17 http://security.ubuntu.com/ubuntu jammy-security/universe Translation-en [220 kB]
내려받기 21.3 M바이트, 소요시간 2초 (9,767 k바이트/초)
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료
4 패키지를 업그레이드할 수 있습니다. 확인하려면 'apt list --upgradable'를 실행하십시오.
나는 root가 출력되었고, 도커를 설치하기 위해 sudo apt update를 우선 진행했다.
이제 도커 설치를 해야하는데, 여러 옵션이 있어서 이를 gemini에게 물어봤다.

보안을 고려하여 커뮤니티 에디션을 설치하려고 했으나, GPG키 등록과 같은 복잡한 절차가 지금으로서는 불필요하다고 여겨 snap파일을 설치하기로 했다.
ubuntu@hancom-team2:~/project/back$ sudo snap install docker
docker 28.4.0 from Canonical✓ installed
ubuntu@hancom-team2:~/project/back$ sudo usermod -aG docker ${USER}
도커 설치 후 sudo usermod -aG docker ${USER} 명령어를 사용해 권한을 주었고, docker compose를 실행했더니, 명령어 부재 문제가 있었다. 이 오류 대응으로 많은 시간을 소비하게되었다. (snap방식 뿐만 아니라 io쪽에서도 문제가 있었으나 생략)
1. GPU 컨테이너 구동 문제 최종 해결
1.1 초기 문제와 원인
초기에는 docker compose 실행 시 libnvidia-ml.so.1: cannot open shared object file 오류가 반복됐다.
- 원인: nvidia-smi로 드라이버는 설치된 것을 확인했지만, Snap Docker가 시스템의 NVIDIA 라이브러리 경로를 컨테이너에 연결하지 못하는 격리 문제가 근본 원인이었다.
1.2 해결: 공식 Docker CE로 전환
문제를 해결하기 위해 Docker 환경 자체를 표준으로 바꿨다.
- Snap 제거: sudo snap remove docker로 기존 환경을 정리.
- Docker CE 설치: GPG 키 등록 후 docker-ce 및 docker-compose-plugin을 설치해서 공식 Docker 환경을 구축했다.
- 결과: 환경 전환 후 GPU 컨테이너 구동이 성공적으로 이루어지면서 NVIDIA 연동 문제를 해결했다.
2. 포트 및 서비스 충돌 정리
GPU 연동 후에도 8000번 포트 충돌 오류가 발생했다.
- 원인: docker-compose.yml에서 backend-cpu 서비스에 profiles 설정이 누락(개발의 편의를 위해 주석처리 했었다!)되어, --profile gpu를 써도 CPU 컨테이너가 자동으로 시작되어 포트를 선점했기 때문이었다.
또한 삭제한 도커에 남아있는 컨테이너 이름 충돌도 있었다.
2.1 최종 실행 및 서비스 분리
- 포트를 점유 중이던 컨테이너를 docker stop 및 docker rm으로 제거
- backend-cpu 서비스의 container_name을 owpml_backend에서 다른 이름으로 변경했다.
- 명령어에 backend-gpu 서비스 이름만 명시해서 실행했다.
docker compose --profile gpu up -d backend-gpu
이 명령으로 backend-gpu 컨테이너만 백그라운드에서 성공적으로 구동됐다.
3. Nginx 리버스 프록시로 외부 접속 오픈
서버에 올리는 이유는, 동료 개발자를 포함한 다른 일반 사용자도 접속이 가능하게 하기 위함이었다. AWS 보안 그룹에서 8000번 포트가 막혀 있었고, 내가 그걸 풀 권한은 없었다. Nginx 리버스 프록시를 써서 이 문제를 해결했다. nginx 서버블록은 전 직장에서 경험했어서 비교적 익숙했다.
- Nginx를 설치하고, 설정 파일(/etc/nginx/sites-available/fastapi)을 만들었다.
- 프록시 설정: Nginx가 열려 있는 80번 포트로 들어오는 요청을 Docker 컨테이너의 내부 8000번 포트로 전달하도록 구성했다.
- 결과: Nginx 설정 후, 인스턴스 공인 IP를 통해 http://52.21.185.171/docs로 접속했을 때 FastAPI Swagger UI에 정상적으로 접근되는 것을 확인하며 외부 서비스 환경 구축을 마무리했다.
server {
listen 80;
server_name _; # 인스턴스의 공인 IP 또는 도메인 이름 (IP 사용 시: 52.21.185.171)
location / {
# 요청을 Docker 컨테이너의 8000번 포트로 전달
proxy_pass http://localhost:8000;
# Docker Compose 컨테이너 이름을 사용해도 됩니다: http://back_gpu: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;
}
}
헬스체크를 해보니 응답이 제대로 온다.

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 2기 (B-log) 리뷰로 작성 되었습니다.
'한컴AI 2기' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI 2기 - 알랭 서비스 통합 (0) | 2025.11.28 |
|---|---|
| [스나이퍼팩토리] 한컴AI 2기 - 알랭 프로젝트 중간발표 회고 (1) | 2025.11.21 |
| [스나이퍼팩토리] 한컴AI 2기 - 알랭 RAG 로컬 도커에서의 구동기 (w FAISS 샤딩) (0) | 2025.11.10 |
| [스나이퍼팩토리] 한컴AI 2기 - OWPML 프로젝트 알랭 1주차 회고 (0) | 2025.11.09 |
| [스나이퍼팩토리] 한컴AI 2기 - OWPML 프로젝트 CLI와 백엔드 FastAPI 세팅 (0) | 2025.11.03 |