[웹서버] Docker 찍먹해보기

오규성·2026년 2월 3일

웹 서버 [FastAPI]

목록 보기
3/4

현재 개인 프로젝트를 하나 만들어가면서 서버가 필요해 웹서버를 구현중이다.
기초적인 부분들은 로컬환경에서 작업하며 진행했지만, 추후 웹서버 호스팅과 DB 서버 등이 필요하므로 이것저것 정보를 알아보던 중 Docker 라는 것에 대해 알게 되어 글을 작성해본다.


Docker 란?

2014년 6월에 정식 출시된 컨테이너를 활용하여 소프트웨어를 배포 및 구동하기 위한 오픈 소스 플랫폼

한 가지 상황을 가정해보자.

우리가 A 라는 클라우드 플랫폼에 서버를 호스팅하고, 이곳에서 서버 운영에 필요한 환경변수 설정을 하였다.
그러다가 상황의 변화로 인해 A -> B 플랫폼으로 이주를 해야하는 경우 이 설정들을 하나하나 일일이 재설정해줘야 한다.

이러한 과정은 에러 발생 가능성 유발과 함께 많은 시간을 소비하게 만든다.

Docker 는 위와 같은 단점을 보완하기 위해, 소프트웨어 컨테이너라는 유닛으로 이를 패키징하고 애플리케이션 실행에 필요한 모든 의존성과 설정을 하나로 묶어 표준화한다.

이를 통해 어느 플랫폼에서든 이미지를 실행하는 것만으로 이전과 동일한 운영 환경을 재현해낼 수 있다.

Docker 설치

  1. https://www.docker.com/ 에 접속하여 Download Docker Desktop 버튼을 클릭하여 다운로드 후 설치한다.
  2. 터미널에서 docekr --version 을 통해 설치확인 후 이를 실행한다.
  3. 아래 화면이 나오면 Finish 를 누른 후 시스템 패스워드 입력 (컴퓨터 패스워드)
  4. 다음과 같이 이메일 인증 화면이 이를 인증
  5. 실행이 완료된 것을 확인할 수 있다.

Docker 사용법

  1. 프로젝트 최상단 폴더(app/, venv/가 보이는 곳)에 Dockerfile 이라는 파일을 확장자 없이 생성한다.
  2. 해당 파일에 다음을 입력해준다.
# 파이썬 버전 가져오기
FROM python:[파이썬 버전]

# Work Directory: 컨테이너 내부에서 '/app'이라는 폴더를 작업 공간으로 씁니다.
WORKDIR /app

# requirements.txt 를 복사해서 라이브러리를 설치. 이 때, 캐시는 남기지 않게 설정
# 만약 requirements.txt 가 없으면 pip freeze > requirements.txt 실행 
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 나머지 소스 코드를 전부 컨테이너 안으로 복사
COPY . .

# 컨테이너가 시작될 때 실행할 명령어 지정
# 외부 접속을 위해 로컬호스트가 아닌 0.0.0.0 으로 실행
CMD ["uvicorn", "[FastAPI 앱 실행경로]", "--host", "0.0.0.0", "--port", "8000"]
  1. 터미널에서 docker build -t [이미지이름] . 명령어를 실행하여 이미지 굽기

  2. 위를 모두 완료하고 Docker DeskTop 을 실행하여 Images 에 들어가보면 파일이 저장된 것을 확인할 수 있다. (혹은 터미널에 docker images 입력)

  3. docker run -p [내컴퓨터포트, 상관없음]:[도커포트, 설정값] --env-file .env [실행할 이미지] 를 통해 도커 이미지 실행해보기

  4. 실행 결과

Docker-Compose.yml 생성

Docker 는 내부 코드가 수정되는 경우, 이를 파악하지 못하기 때문에 코드를 수정할 때마다 docker 이미지를 새로 빌드해야하는데, 이를 진행하기 위해서는 다음과 같은 코드들을 매번 실행해줘야한다.

docker stop [서버이름]
docker rm [서버이름]
docker build -t [이미지] .
docker run -d --name [서버이름] -p 8000:8000 --env-file .env --restart always [이미지]

실제로 개발자는 매 시간마다 코드를 수정해줘야하는데, 저것들을 반복하자니 매우 귀찮을 것이다.
이러한 행위를 방지하기 위해 우리는 docker-compose.yml 파일을 생성해서 이를 자동화 할 것이다.

루트 경로에 docker.compose.yml 파일을 생성해주고 다음 코드를 입력해주자

version: '3.8'

services:
  # docker-compose 의 service 이름을 바꾸면 이전과 다른 이미지로 판단하여 파일이 더 생김 ...!!
  # 서비스 이름 (아무거나 상관없음)
  backend:
    # 빌드는 현재 폴더에 있는 Dockerfile 로 빌드
    build: .
    container_name: [원하는 이름]
    ports:
      - "8000:8000"
    env_file:
      - .env
    # 꺼지면 자동으로 다시 실행
    restart: always

이 파일을 생성한 이후부터는 도커 이미지를 실행하기 위해 다음 코드를 사용하면 된다.

docker-compose up

만약 코드 수정이 이루어져 이미지를 재생성하고 바로 실행하기 위해서는 다음을 입력한다.

docker-compose up -d --build

Docker 종료법

docker-compose로 켰다면 docker-compose down
docker run으로 켰다면 docker stop [컨테이너ID]

profile
안드로이드 개발자 Gyu 의 개발 블로그 !

0개의 댓글