“`html
Docker 입문: 컨테이너 기반 개발 환경 구축 완벽 가이드
최근 몇 년간, Docker는 소프트웨어 개발 및 배포 방식을 혁신적으로 변화시켰습니다. 개발자, 시스템 관리자, 그리고 데브옵스 엔지니어에게 Docker는 없어서는 안 될 필수 도구가 되었습니다. 이 글에서는 Docker가 왜 중요한지, Docker를 어떻게 시작해야 하는지, 그리고 실제 개발 환경에 어떻게 적용할 수 있는지에 대해 자세히 알아보겠습니다.
Docker란 무엇일까요?
Docker는 컨테이너 기반의 가상화 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등)을 패키징하는 표준화된 방법입니다. 쉽게 말해, 애플리케이션을 실행하기 위한 모든 것을 하나의 ‘상자’에 담아 이동시키고 실행할 수 있게 해주는 기술이라고 생각하시면 됩니다.
컨테이너와 가상 머신(VM)의 차이점
컨테이너와 가상 머신은 모두 격리된 환경을 제공하지만, 작동 방식에 큰 차이가 있습니다. VM은 전체 운영 체제를 가상화하는 반면, 컨테이너는 호스트 운영 체제의 커널을 공유합니다. 이 때문에 컨테이너는 VM보다 훨씬 가볍고 빠르며 효율적입니다. 제 경험상, 개발 환경에서 컨테이너를 사용하면 VM을 사용할 때보다 훨씬 빠른 속도로 애플리케이션을 빌드하고 테스트할 수 있습니다.
Docker의 주요 장점
Docker는 다음과 같은 다양한 장점을 제공합니다.
- 일관성 있는 개발 환경: 개발, 테스트, 프로덕션 환경에서 동일한 환경을 유지할 수 있습니다.
- 빠른 배포: 애플리케이션을 컨테이너 이미지로 패키징하여 빠르게 배포할 수 있습니다.
- 리소스 효율성: 컨테이너는 VM보다 훨씬 가볍고 적은 리소스를 사용합니다.
- 확장성: 컨테이너를 쉽게 확장하고 관리할 수 있습니다.
- 이식성: 컨테이너는 다양한 플랫폼에서 실행될 수 있습니다.
Docker 설치 및 기본 사용법
Docker를 시작하기 위해서는 먼저 Docker를 설치해야 합니다. 각 운영 체제별 설치 방법은 Docker 공식 문서를 참고하시는 것이 가장 좋습니다. (https://docs.docker.com/get-docker/)
Docker 설치 (예: Ubuntu)
Ubuntu를 예로 들어 Docker 설치 과정을 간단히 살펴보겠습니다.
- 패키지 인덱스 업데이트:
sudo apt update
- Docker 설치에 필요한 패키지 설치:
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
- Docker의 공식 GPG 키 추가:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- Docker 저장소 추가:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 다시 패키지 인덱스 업데이트:
sudo apt update
- Docker 설치:
sudo apt install docker-ce docker-ce-cli containerd.io
기본 Docker 명령어
Docker 설치 후, 몇 가지 기본적인 명령어를 익혀두면 Docker를 사용하는 데 큰 도움이 됩니다.
docker pull [이미지 이름]
: Docker Hub에서 이미지를 다운로드합니다.docker run [이미지 이름]
: 이미지를 기반으로 컨테이너를 실행합니다.docker ps
: 실행 중인 컨테이너 목록을 보여줍니다.docker stop [컨테이너 ID]
: 컨테이너를 중지합니다.docker images
: 로컬에 저장된 이미지 목록을 보여줍니다.docker rmi [이미지 ID]
: 이미지를 삭제합니다.
예를 들어, docker run hello-world
명령어를 실행하면 Docker Hub에서 hello-world 이미지를 다운로드하여 실행하고, 간단한 메시지를 출력합니다. 실제로 사용해보니, 이 명령어를 통해 Docker가 정상적으로 설치되었는지 빠르게 확인할 수 있었습니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile은 컨테이너 이미지를 빌드하기 위한 명령어 집합을 담고 있는 텍스트 파일입니다. Dockerfile을 사용하면 애플리케이션을 실행하는 데 필요한 모든 단계를 자동화할 수 있습니다.
Dockerfile 기본 구조
Dockerfile은 일반적으로 다음과 같은 구조를 가집니다.
FROM
: 베이스 이미지를 지정합니다.MAINTAINER
: 이미지 관리자를 지정합니다.COPY
: 로컬 파일을 컨테이너 내부로 복사합니다.RUN
: 컨테이너 내부에서 명령어를 실행합니다.EXPOSE
: 컨테이너가 노출할 포트를 지정합니다.CMD
: 컨테이너가 실행될 때 실행할 명령어를 지정합니다.
간단한 Python 애플리케이션 Dockerfile 예시
다음은 간단한 Python 애플리케이션을 위한 Dockerfile 예시입니다.
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
이 Dockerfile은 Python 3.9 이미지를 베이스 이미지로 사용하고, /app
디렉토리를 작업 디렉토리로 설정합니다. 그런 다음, requirements.txt
파일을 복사하고, 필요한 Python 패키지를 설치합니다. 마지막으로, 모든 소스 코드를 복사하고, app.py
를 실행합니다.
이미지 빌드 및 실행
Dockerfile을 작성한 후에는 docker build
명령어를 사용하여 이미지를 빌드할 수 있습니다.
docker build -t my-python-app .
이미지가 빌드되면 docker run
명령어를 사용하여 컨테이너를 실행할 수 있습니다.
docker run -p 8000:8000 my-python-app
이 명령어는 컨테이너의 8000번 포트를 호스트의 8000번 포트에 매핑합니다. 이제 웹 브라우저에서 localhost:8000
에 접속하여 애플리케이션을 확인할 수 있습니다. 개인적으로는, Dockerfile을 통해 애플리케이션 배포 과정을 자동화하는 것이 개발 생산성을 크게 향상시킨다고 생각합니다.
Docker Compose를 활용한 다중 컨테이너 관리
Docker Compose는 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 데 사용되는 도구입니다. Docker Compose를 사용하면 복잡한 애플리케이션을 쉽게 관리하고 배포할 수 있습니다.
Docker Compose 파일 (docker-compose.yml)
Docker Compose 설정은 docker-compose.yml
파일에 정의됩니다. 이 파일은 서비스, 네트워크, 볼륨 등 애플리케이션을 구성하는 모든 요소를 정의합니다.
Docker Compose 파일 예시
다음은 웹 애플리케이션, 데이터베이스, 레디스를 포함하는 애플리케이션을 위한 docker-compose.yml
파일 예시입니다.
version: "3.9"
services:
web:
build: ./web
ports:
- "8000:8000"
depends_on:
- db
- redis
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
volumes:
- db_data:/var/lib/postgresql/data
redis:
image: redis:6
volumes:
db_data:
이 파일은 세 개의 서비스를 정의합니다: web
, db
, redis
. web
서비스는 ./web
디렉토리에 있는 Dockerfile을 사용하여 빌드됩니다. db
서비스는 PostgreSQL 13 이미지를 사용하고, redis
서비스는 Redis 6 이미지를 사용합니다. depends_on
옵션을 사용하여 서비스 간의 의존성을 설정할 수 있습니다.
Docker Compose 명령어
docker-compose.yml
파일을 작성한 후에는 다음과 같은 명령어를 사용하여 애플리케이션을 실행할 수 있습니다.
docker-compose up
: 애플리케이션을 빌드하고 실행합니다.docker-compose down
: 애플리케이션을 중지하고 삭제합니다.docker-compose logs [서비스 이름]
: 서비스의 로그를 확인합니다.
Docker Compose를 사용하면 여러 컨테이너로 구성된 복잡한 애플리케이션을 쉽게 관리할 수 있습니다. 제 경험상, 마이크로서비스 아키텍처를 사용하는 경우 Docker Compose는 필수적인 도구입니다.
결론 및 다음 단계
이 글에서는 Docker의 기본 개념, 설치 방법, Dockerfile 작성, 그리고 Docker Compose를 사용한 다중 컨테이너 관리 방법에 대해 알아보았습니다. Docker는 소프트웨어 개발 및 배포 방식을 혁신적으로 변화시키는 강력한 도구입니다. Docker를 사용하면 개발 환경을 일관성 있게 유지하고, 애플리케이션을 빠르게 배포하고, 리소스를 효율적으로 사용할 수 있습니다.
다음 단계로는 다음과 같은 것들을 시도해 볼 수 있습니다.
- Docker Hub에서 다양한 이미지를 탐색하고 사용해보기
- 자신만의 Dockerfile을 작성하여 애플리케이션 컨테이너화하기
- Docker Compose를 사용하여 복잡한 애플리케이션 관리하기
- Kubernetes와 같은 컨테이너 오케스트레이션 도구 학습하기
Docker는 끊임없이 발전하고 있는 기술입니다. 꾸준히 학습하고 실습하면서 Docker 전문가로 성장해 나가시길 바랍니다.
“`