“`html
Docker 입문: 컨테이너 기술로 개발 환경 구축하기
Docker란 무엇일까요?
컨테이너 기술의 등장 배경
소프트웨어 개발 방식은 끊임없이 진화하고 있습니다. 과거에는 서버 환경에 직접 코드를 배포하는 방식이 일반적이었지만, 환경 설정의 어려움, 의존성 충돌 등의 문제점이 빈번하게 발생했습니다. 이러한 문제를 해결하기 위해 가상화 기술이 등장했고, 그중에서도 Docker는 컨테이너 기반의 가상화 기술로 개발 환경을 혁신적으로 변화시켰습니다.
Docker는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등)을 컨테이너라는 격리된 환경에 패키징하여, 어떤 환경에서도 동일하게 실행될 수 있도록 보장합니다. 마치 택배 상자에 물건을 담아 어디든 안전하게 배송하는 것과 같습니다. 제 경험상, Docker를 사용하기 전에는 개발 환경 구축에 많은 시간을 쏟았지만, Docker를 도입한 후에는 생산성이 눈에 띄게 향상되었습니다.
Docker의 핵심 개념
Docker를 이해하기 위해서는 몇 가지 핵심 개념을 알아야 합니다. 먼저, Docker Image는 애플리케이션 실행에 필요한 모든 것을 담고 있는 읽기 전용 템플릿입니다. Docker Container는 이 이미지를 기반으로 생성된 실행 가능한 인스턴스입니다. 마치 설계도(Image)를 보고 집(Container)을 짓는 것과 같습니다. Dockerfile은 이미지를 만들기 위한 설정 파일이며, 이미지 레이어를 정의합니다. 마지막으로, Docker Hub는 Docker 이미지를 공유하고 관리하는 중앙 저장소입니다. GitHub와 비슷한 역할을 한다고 생각하면 이해하기 쉽습니다.
컨테이너는 호스트 OS의 커널을 공유하기 때문에 가상 머신보다 훨씬 가볍고 빠릅니다. 가상 머신은 게스트 OS를 포함하기 때문에 시스템 자원을 더 많이 사용합니다. 따라서 Docker는 더욱 효율적인 개발, 테스트, 배포 환경을 제공합니다.
Docker 설치 및 기본 명령어
Docker 설치
Docker는 Windows, macOS, Linux 등 다양한 운영체제에서 사용할 수 있습니다. Docker Desktop을 설치하면 Docker Engine, Docker CLI, Docker Compose 등을 한 번에 설치할 수 있어 편리합니다. 각 운영체제에 맞는 설치 가이드는 Docker 공식 홈페이지(https://www.docker.com/)에서 확인할 수 있습니다.
설치가 완료되면 터미널 또는 명령 프롬프트에서 `docker –version` 명령어를 실행하여 Docker가 정상적으로 설치되었는지 확인할 수 있습니다. 만약 버전 정보가 출력된다면 Docker가 성공적으로 설치된 것입니다.
기본 명령어
Docker를 사용하기 위한 기본적인 명령어는 다음과 같습니다.
- `docker pull <이미지 이름>`: Docker Hub에서 이미지를 다운로드합니다.
- `docker run <이미지 이름>`: 이미지를 기반으로 컨테이너를 실행합니다.
- `docker ps`: 실행 중인 컨테이너 목록을 표시합니다.
- `docker ps -a`: 모든 컨테이너 목록 (실행 중/중단)을 표시합니다.
- `docker stop <컨테이너 ID>`: 실행 중인 컨테이너를 중지합니다.
- `docker rm <컨테이너 ID>`: 컨테이너를 삭제합니다.
- `docker images`: 로컬에 저장된 이미지 목록을 표시합니다.
예를 들어, `docker run hello-world` 명령어를 실행하면 “Hello from Docker!” 메시지를 출력하는 간단한 컨테이너가 실행됩니다. 이 명령어는 Docker가 제대로 작동하는지 확인하는 데 유용합니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile 작성
Dockerfile은 이미지를 만들기 위한 설정 파일입니다. Dockerfile에는 베이스 이미지, 필요한 소프트웨어 설치 명령어, 환경 변수 설정, 애플리케이션 코드 복사 등 이미지에 포함될 모든 내용이 정의됩니다. 개인적으로는 Dockerfile을 통해 개발 환경을 자동화하는 것이 매우 중요하다고 생각합니다.
다음은 간단한 Python 웹 애플리케이션을 위한 Dockerfile 예시입니다.
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
각 명령어의 의미는 다음과 같습니다.
- `FROM`: 베이스 이미지를 지정합니다. 여기서는 Python 3.9 슬림 버전을 사용합니다.
- `WORKDIR`: 컨테이너 내 작업 디렉토리를 설정합니다.
- `COPY`: 호스트 머신의 파일을 컨테이너로 복사합니다.
- `RUN`: 컨테이너 내에서 명령어를 실행합니다. 여기서는 `pip`를 사용하여 필요한 패키지를 설치합니다.
- `CMD`: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
이미지 빌드
Dockerfile을 작성한 후에는 `docker build` 명령어를 사용하여 이미지를 빌드할 수 있습니다. 명령어 형식은 다음과 같습니다.
docker build -t <이미지 이름> .
`.`은 Dockerfile이 있는 현재 디렉토리를 의미합니다. 예를 들어, `docker build -t my-python-app .` 명령어를 실행하면 `my-python-app`이라는 이름의 이미지가 빌드됩니다.
이미지 빌드가 완료되면 `docker images` 명령어를 통해 빌드된 이미지를 확인할 수 있습니다.
Docker Compose를 이용한 멀티 컨테이너 애플리케이션 관리
Docker Compose란?
Docker Compose는 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 도구입니다. 예를 들어, 웹 애플리케이션, 데이터베이스, 캐시 서버 등을 하나의 설정 파일로 관리할 수 있습니다. Docker Compose는 YAML 형식의 `docker-compose.yml` 파일을 사용하여 서비스를 정의합니다.
docker-compose.yml 작성
다음은 웹 애플리케이션과 데이터베이스를 함께 실행하는 `docker-compose.yml` 파일 예시입니다.
version: "3.9"
services:
web:
build: .
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
각 서비스의 의미는 다음과 같습니다.
- `web`: 웹 애플리케이션 서비스. 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드하고, 호스트의 8000번 포트를 컨테이너의 8000번 포트에 매핑합니다. `depends_on`을 사용하여 `db` 서비스에 의존성을 설정합니다.
- `db`: 데이터베이스 서비스. Docker Hub에서 PostgreSQL 13 이미지를 사용하고, 환경 변수를 설정합니다.
Docker Compose 실행
`docker-compose.yml` 파일을 작성한 후에는 `docker-compose up` 명령어를 사용하여 서비스를 실행할 수 있습니다. 명령어 형식은 다음과 같습니다.
docker-compose up -d
`-d` 옵션은 detached 모드로 실행하여 백그라운드에서 서비스를 실행합니다. 서비스를 중단하려면 `docker-compose down` 명령어를 사용합니다.
결론 및 다음 단계
Docker는 개발 환경을 표준화하고 애플리케이션 배포를 간소화하는 강력한 도구입니다. 이 글에서는 Docker의 기본 개념, 설치 방법, 기본 명령어, Dockerfile 작성, 이미지 빌드, Docker Compose 사용법 등을 살펴보았습니다. 실제로 사용해보니, Docker는 개발 생산성을 크게 향상시켜 주었습니다.
다음 단계로는 Docker Hub를 이용하여 이미지를 공유하고, Docker Swarm 또는 Kubernetes와 같은 컨테이너 오케스트레이션 도구를 학습하여 더욱 복잡한 애플리케이션을 관리하는 것을 추천합니다. 또한, CI/CD 파이프라인에 Docker를 통합하여 자동화된 배포 환경을 구축하는 것도 좋은 방법입니다.
Docker를 꾸준히 학습하고 활용하여 더욱 효율적인 개발 환경을 구축하시기 바랍니다.
“`