기본 개념
가상화
파이썬으로 개발을 하다보면 다양한 라이브러리를 갖다 쓰는 과정에서 의존성 충돌이 나거나, OS에 따라 제대로 동작하지 않는 경험들을 한 적이 있을 겁니다. 개발하는 일련의 프로세스, Local 환경에서 개발하고 완료되면 Staging 서버에 올리고 최종적으론 Production 서버에 배포를 살펴봤을 때 Local 환경과 Production 환경이 다르기 때문에 올바르게 작동하지 않을 수 있기 때문입니다. 이러한 문제를 해결하기 위해 가상화라는 기술이 등장했습니다.
가상화란 컴퓨터와 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어로, 물리적인 컴퓨터 자원을 논리적인 단위로 나누고 통합하여 자원을 활용할 수 있게 하는 기술입니다.[1] 그 중 소프트웨어 가상화는 Research / Production 환경에서 공통적으로 사용하는 환경 정도로 간단하게 정의할 수 있습니다. 즉, 애플리케이션을 활용하기 위한 환경을 구분하고 이를 필요한 상황에서 적재적소에 활용할 수 있도록 도와줍니다.
가상화를 위해서 애플리케이션이 구동하는 환경을 잘 정리해둘 필요가 있는데, 이를 사람이 기록한다면 작성 중 실수가 있거나 누락 가능성이 있습니다. 따라서, 자동화가 필요하게 되었고 이를 위한 기술이 필요합니다.
Docker
가상환경을 자동으로 만들어주는 기술은 여러 가지가 있지만, 대표적인 것 중 하나가 '컨테이너'입니다. 이는 애플리케이션 실행에 필요한 모든 파일을 포함해 전체 런타임 환경에서 애플리케이션을 패키징하고 격리하는 기술을 말합니다. 즉, 환경 자체를 하나의 템플릿으로 제공하는 것이죠.
이러한 컨테이너 기술을 사용할 수 있도록 나온 오픈소스가 Docker입니다. Docker를 사용하기에 앞서 아래 4가지 정도는 알아야 추가적인 설명을 이해할 수 있기 때문에 간단하게 기록하고 넘어가겠습니다. 앞으로 기재하는 많은 표현에서 Docker는 편의상 생략될 수 있습니다.
- Docker Image : 컨테이너를 실행할 때 사용할 수 있는 템플릿 (Read Only). OS, 설정 등을 포함한 실행 환경으로 다른 사람들이 만든 Docker Image를 어느 환경에 가져와서도 실행 가능
- Docker Container : Docker Image를 활용해 실행된 인스턴스 (수정 가능)
- Docker Compose : 여러 개의 Docker Image를 실행하기 위해서 사용하는 방법
- Container Registry : 자신만의 Docker Image를 만들어 저장. 다른 사람에게 공유하거나 다른 사람의 소프트웨어를 받아서 사용 가능
Docker의 기본 활용
Image 다운로드
애플리케이션 구동을 위한 템플릿인 이미지를 다운로드 받기 위해서는 git처럼 pull을 해오면 됩니다.
docker pull [이미지 이름]:[태그]
필요한 이미지들은 깃허브 처럼 Dockerhub 같은 레지스트리에서 이미지를 pull하는 방법을 안내하고 있으니 참고하면 좋을 것 같습니다.
다운로드 받은 이미지들은 images를 통해 확인할 수 있습니다.
docker images
Image 실행
다운로드 받은 이미지들은 다음과 같은 명령어로 실행할 수 있습니다.
docker run [옵션] [이미지 이름]:[태그]
위 코드로 실행할 수 있으나 여러가지 옵션이 있습니다.
- --name : 이름 지정
- -e : 환경변수 설정
- -d : 데몬(백그라운드) 모드
- -p : 포트 지정 옵션으로 로컬 호스트 포트:컨테이너 포트 형태로 지정
Dockerfile 작성
Docker Image를 빌드하기 위해 필요한 정보를 입력합니다. 주요하게 입력할 것들은 아래와 같습니다.[2]
주요 내용 | 설명 |
FROM <img> | 이미지 빌드에 사용할 베이스 이미지 지정 |
RUN <cmd> | 실행할 리눅스 명령어 실행. 여러 명령어가 있는 경우 && \로 이어서 아래로 줄바꾸면서 작성 |
WORKDIR <dir> | 명령어를 실행할 컨테이너 경로 지정 |
COPY <src> <dst> | 로컬 디렉토리<src>에서 컨테이너 내 디렉토리<dst>로 복사 |
CMD <cmd> | 실행할 명령어, 인자를 지정해서 띄어쓰기를 하지 않고 사용. 예를 들어, ["python","main.py"]로 하면 python main.py를 실행. |
ENV <path> | 컨테이너 내 환경변수를 지정. 파이썬 애플리케이션에서는 아래를 보통 지정 ENV PYTHON=/app ENV PYTHONBUFFERED=1 |
EXPOSE <port> | 컨테이너 외부에 노출할 포트 지정. 예를 들어, localhost:8000에서 8000 같은 것을 지정 |
ENTRYPOINT <cmd> | 이미지를 컨테이너로 띄울 때 항상 실행하는 명령어 지정. CMD도 컨테이너 실행 시점에 명령어 적용 가능하지만, 오버라이딩이 불가. (보안에서 안전) |
위와 같이 Dockerfile을 만들고 나면 이미지를 생성(빌드)합니다. 생성할 때는 아래와 같은 코드를 활용할 수 있습니다. 만약 현재 폴더에 Dockerfile이 있으면 .만 작성해주면 됩니다.
docker build -t [빌드 이미지 이름:태그 이름] "Dockerfiile 경로"
이렇게 만든 이미지를 인터넷에 올릴 수 있습니다. 깃허브처럼 push 명령어를 사용합니다. 또한, push한 이미지는 pull도 가능합니다.
docker push [이미지 이름:태그]
Docker Compose
하나의 Docker Image가 아니라 여러 개를 동작시키고 싶다면 docker-compose.yml 파일에 작성해서 Docke Compose를 가능하도록 하면 됩니다. yaml 파일 작성을 위해 필요한 것들을 간단히 살펴보겠습니다.
services는 실핼할 컨테이너를 정의합니다. 각 서비스는 하나의 컨테이너로 세부 설정을 저장하며, 아래의 예시를 살펴보면 web과 redis라는 서비스로 구성되는 것을 확인할 수 있습니다. 각 서비스의 구성 요소는 dockerfile에 있는 내용과 동일합니다.
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
이렇게 작성한 docke-compose.yml 파일이 있따면 아래 코드를 통해 적용하면서 실행할 수 있습니다.
docker-compose up
그 외에도 아래와 같은 추가적인 기능들이 있습니다.
docker-compose -d # 백그라운드 실행
docker-comopse down # 서비스 중단 (컨테이너, 볼륨 등 삭제)
docker-compose logs <서비스명> # 로그 확인
참고자료
[1] https://terms.tta.or.kr/dictionary/dictionaryView.do?subject=%EA%B0%80%EC%83%81%ED%99%94
[2] https://docs.docker.com/build/concepts/dockerfile/
[3] https://docs.docker.com/compose/gettingstarted/
[4] 변성윤. "Docker". boostcamp AI Tech.
'Tools' 카테고리의 다른 글
[VS Code] Copilot 무료 적용하기 | Windows (2) | 2024.12.20 |
---|---|
[Docker] Docker Image 용량 최적화 방법 정리 (2) | 2024.12.17 |
VS Code에서 파이썬 가상환경 활성화 및 비활성화하기 (0) | 2024.12.12 |
CVAT로 Labeling 해서 영수증 OCR 데이터셋 만들기 (2) | 2024.11.08 |
[QGIS] 서울 4대문 CSV 좌표 업로드 및 바운더리 형성 | 포인트를 폴리곤으로 변경하기 (0) | 2022.06.20 |