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

2014년 6월에 정식 출시된 컨테이너를 활용하여 소프트웨어를 배포 및 구동하기 위한 오픈 소스 플랫폼
한 가지 상황을 가정해보자.
우리가 A 라는 클라우드 플랫폼에 서버를 호스팅하고, 이곳에서 서버 운영에 필요한 환경변수 설정을 하였다.
그러다가 상황의 변화로 인해 A -> B 플랫폼으로 이주를 해야하는 경우 이 설정들을 하나하나 일일이 재설정해줘야 한다.
이러한 과정은 에러 발생 가능성 유발과 함께 많은 시간을 소비하게 만든다.
Docker 는 위와 같은 단점을 보완하기 위해, 소프트웨어 컨테이너라는 유닛으로 이를 패키징하고 애플리케이션 실행에 필요한 모든 의존성과 설정을 하나로 묶어 표준화한다.
이를 통해 어느 플랫폼에서든 이미지를 실행하는 것만으로 이전과 동일한 운영 환경을 재현해낼 수 있다.
Download Docker Desktop 버튼을 클릭하여 다운로드 후 설치한다.docekr --version 을 통해 설치확인 후 이를 실행한다.


Dockerfile 이라는 파일을 확장자 없이 생성한다.
# 파이썬 버전 가져오기
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"]
터미널에서 docker build -t [이미지이름] . 명령어를 실행하여 이미지 굽기

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


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

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-compose로 켰다면 docker-compose down
docker run으로 켰다면 docker stop [컨테이너ID]
