“`html
Docker 입문: 컨테이너 기술로 개발 환경 구축하기
최근 몇 년간 Docker는 소프트웨어 개발 및 배포 방식에 혁명을 가져왔습니다. 개발, 테스트, 배포 환경을 일관성 있게 유지하고 복잡한 의존성 문제를 해결하는 데 탁월한 도구입니다. 이 글에서는 Docker의 기본 개념부터 시작하여 실제 프로젝트에 적용할 수 있는 방법까지 단계별로 자세히 설명합니다. Docker를 처음 접하는 분들도 쉽게 이해할 수 있도록 친절하고 실용적인 예제를 곁들여 설명하겠습니다.
Docker란 무엇인가?
Docker는 컨테이너 기반의 가상화 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정)을 패키징하는 표준화된 단위입니다. 이러한 컨테이너는 운영체제 커널을 공유하면서 격리된 환경에서 실행되므로, 다양한 환경에서 일관된 동작을 보장합니다.
컨테이너 vs 가상 머신 (VM)
컨테이너와 가상 머신은 모두 격리된 환경을 제공하지만, 작동 방식에는 큰 차이가 있습니다. VM은 전체 운영체제를 가상화하는 반면, 컨테이너는 호스트 OS의 커널을 공유합니다. 따라서 컨테이너는 VM에 비해 훨씬 가볍고 빠르게 시작하며, 시스템 자원 효율성도 뛰어납니다. 개인적으로는, 개발 환경을 구축할 때 Docker 컨테이너가 훨씬 편리하고 자원 소모도 적어서 선호합니다.
Docker의 주요 이점
Docker를 사용하면 다음과 같은 이점을 얻을 수 있습니다.
* **일관성 있는 개발 환경:** 개발, 테스트, 프로덕션 환경을 동일하게 유지하여 “내 컴퓨터에서는 잘 돌아갔는데…” 문제를 방지합니다.
* **빠른 배포:** 컨테이너는 가볍고 빠르게 시작되므로 애플리케이션 배포 속도를 크게 향상시킵니다.
* **자원 효율성:** VM에 비해 자원 소모가 적어 서버 비용을 절감할 수 있습니다.
* **확장성:** 컨테이너는 쉽게 복제하고 확장할 수 있어 클라우드 환경에 적합합니다.
* **이식성:** Docker 컨테이너는 다양한 운영체제 및 클라우드 플랫폼에서 실행될 수 있습니다.
Docker 설치 및 기본 명령어
Docker를 사용하기 위해서는 먼저 Docker Engine을 설치해야 합니다. 운영체제에 따라 Docker Desktop 또는 Docker Engine을 설치할 수 있습니다. 설치 방법은 Docker 공식 문서를 참조하는 것이 가장 정확합니다.
Docker 설치
Docker 공식 웹사이트 ([https://www.docker.com/](https://www.docker.com/))에서 운영체제에 맞는 설치 파일을 다운로드하여 설치합니다. Docker Desktop은 GUI 환경을 제공하여 초보자가 사용하기에 편리하며, Docker Engine은 명령줄 인터페이스(CLI)를 통해 Docker를 제어합니다. 제 경험상 Docker Desktop은 초기 학습에, Docker Engine은 서버 환경에 적합합니다.
기본 Docker 명령어
Docker 설치가 완료되면 다음 명령어를 사용하여 Docker를 제어할 수 있습니다.
* `docker run`: 컨테이너를 생성하고 실행합니다.
* `docker ps`: 실행 중인 컨테이너 목록을 표시합니다.
* `docker stop`: 실행 중인 컨테이너를 중지합니다.
* `docker rm`: 컨테이너를 삭제합니다.
* `docker images`: 로컬에 저장된 Docker 이미지 목록을 표시합니다.
* `docker pull`: Docker Hub에서 이미지를 다운로드합니다.
* `docker build`: Dockerfile을 사용하여 이미지를 빌드합니다.
예를 들어, `docker run hello-world` 명령어를 실행하면 Docker Hub에서 `hello-world` 이미지를 다운로드하여 컨테이너를 생성하고 실행합니다. 이 컨테이너는 간단한 메시지를 출력하고 종료됩니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile은 Docker 이미지를 빌드하기 위한 레시피입니다. Dockerfile에는 베이스 이미지, 애플리케이션 코드 복사, 필요한 패키지 설치, 실행 명령어 등 이미지 생성에 필요한 모든 정보가 포함되어 있습니다.
Dockerfile 작성 예제 (Python 애플리케이션)
다음은 간단한 Python 애플리케이션을 위한 Dockerfile 예제입니다.
“`dockerfile
# 베이스 이미지 설정 (Python 3.9)
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` 파일에 정의된 패키지를 설치하고, 애플리케이션 코드를 복사한 후 `app.py`를 실행합니다.
이미지 빌드 및 실행
Dockerfile이 있는 디렉토리에서 다음 명령어를 실행하여 이미지를 빌드합니다.
“`bash
docker build -t my-python-app .
“`
`-t` 옵션은 이미지에 태그를 지정합니다. 이 경우 이미지 이름은 `my-python-app`이 됩니다. 빌드가 완료되면 다음 명령어를 사용하여 컨테이너를 실행할 수 있습니다.
“`bash
docker run my-python-app
“`
실제로 사용해보니, Dockerfile을 잘 작성하는 것이 Docker 사용의 핵심이라고 생각합니다. 필요한 패키지, 환경 변수 등을 꼼꼼히 설정해야 예상치 못한 오류를 방지할 수 있습니다.
Docker Compose로 멀티 컨테이너 애플리케이션 관리
Docker Compose는 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 데 사용되는 도구입니다. Docker Compose 파일을 사용하여 컨테이너 간의 의존성을 정의하고, 네트워크 및 볼륨 설정을 관리할 수 있습니다.
Docker Compose 파일 작성 (docker-compose.yml)
다음은 웹 애플리케이션과 데이터베이스를 함께 실행하는 Docker Compose 파일 예제입니다.
“`yaml
version: “3.9”
services:
web:
build: .
ports:
– “8000:8000”
depends_on:
– db
environment:
DATABASE_URL: “postgresql://user:password@db:5432/mydb”
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
“`
이 `docker-compose.yml` 파일은 `web` 서비스와 `db` 서비스를 정의합니다. `web` 서비스는 현재 디렉토리의 Dockerfile을 사용하여 빌드되고, 8000번 포트를 호스트의 8000번 포트에 매핑하며, `db` 서비스에 의존합니다. `db` 서비스는 Postgres 13 이미지를 사용하고, 데이터베이스 사용자, 비밀번호, 데이터베이스 이름을 환경 변수를 통해 설정합니다.
Docker Compose 실행
Docker Compose 파일이 있는 디렉토리에서 다음 명령어를 실행하여 애플리케이션을 실행합니다.
“`bash
docker-compose up -d
“`
`-d` 옵션은 컨테이너를 백그라운드에서 실행합니다. Docker Compose는 자동으로 필요한 이미지를 다운로드하고, 컨테이너를 생성하며, 네트워크를 구성합니다. 컨테이너가 실행되면 웹 애플리케이션은 `localhost:8000`에서 접속할 수 있습니다.
결론 및 다음 단계
이 글에서는 Docker의 기본 개념, 설치 방법, Dockerfile 작성, 이미지 빌드, Docker Compose 사용법 등 Docker 입문에 필요한 내용을 다루었습니다. Docker는 개발 생산성을 높이고 애플리케이션 배포를 간소화하는 강력한 도구입니다. 이제 Docker를 사용하여 실제 프로젝트에 적용해보고, Docker Hub를 통해 이미지를 공유하고, Docker Swarm이나 Kubernetes와 같은 컨테이너 오케스트레이션 도구를 학습하는 것을 추천합니다.
제 경험상, Docker는 처음에는 어렵게 느껴질 수 있지만, 꾸준히 사용하다 보면 그 편리함과 강력함에 감탄하게 될 것입니다. Docker를 통해 더 효율적인 개발자가 되시길 바랍니다!
“`