“`html
처음 만나는 Docker: 개발 환경 구축부터 배포까지 완벽 가이드
애자일 개발 방식이 보편화되면서 개발 환경의 일관성과 효율성이 더욱 중요해지고 있습니다. 이러한 요구를 충족시켜주는 강력한 도구가 바로 Docker입니다. Docker는 컨테이너 기반의 가상화 기술로, 애플리케이션과 그에 필요한 모든 환경을 하나의 패키지 형태로 묶어 제공하여 개발, 테스트, 배포 과정을 단순화하고 자동화합니다. 이 글에서는 Docker를 처음 접하는 개발자를 위해 Docker의 기본 개념부터 설치, 사용법, 그리고 실제 배포까지 완벽하게 안내합니다.
Docker란 무엇일까요?
Docker는 컨테이너 기반의 가상화 플랫폼입니다. 기존의 가상 머신(VM) 방식과 달리, Docker는 OS 커널을 공유하며 애플리케이션과 그에 필요한 라이브러리, 설정 파일 등을 묶어 컨테이너라는 독립적인 실행 환경을 제공합니다. 이러한 컨테이너는 어떤 환경에서도 동일하게 실행되기 때문에, 개발 환경과 운영 환경의 불일치 문제를 해결하고 애플리케이션의 이식성을 높여줍니다.
Docker의 핵심 개념
Docker를 이해하기 위해서는 몇 가지 핵심 개념을 알아야 합니다.
- 이미지 (Image): 애플리케이션 실행에 필요한 파일과 설정값을 담고 있는 읽기 전용 템플릿입니다. 이미지는 Docker Hub와 같은 레지스트리에서 다운로드하거나 직접 만들 수 있습니다.
- 컨테이너 (Container): 이미지를 기반으로 생성된 실행 가능한 인스턴스입니다. 컨테이너는 격리된 환경에서 애플리케이션을 실행하며, 이미지의 변경 없이 데이터를 저장할 수 있습니다.
- Docker Hub: Docker 이미지를 공유하고 관리하는 클라우드 기반의 레지스트리 서비스입니다.
- Dockerfile: Docker 이미지를 자동으로 생성하기 위한 설정 파일입니다. Dockerfile에는 베이스 이미지, 필요한 패키지 설치, 파일 복사, 실행 명령어 등이 정의됩니다.
Docker의 장점
Docker는 개발자에게 다양한 이점을 제공합니다.
- 환경 일관성: 개발, 테스트, 운영 환경을 동일하게 유지하여 환경 불일치로 인한 문제를 해결합니다.
- 빠른 배포: 컨테이너를 통해 애플리케이션을 빠르게 배포하고 확장할 수 있습니다.
- 자원 효율성: 컨테이너는 VM보다 훨씬 가볍고 자원 효율성이 높습니다.
- 이식성: 컨테이너는 어떤 환경에서도 동일하게 실행되므로 애플리케이션의 이식성이 뛰어납니다.
Docker 설치 및 기본 사용법
이제 Docker를 설치하고 기본적인 사용법을 알아보겠습니다.
Docker Desktop 설치
Docker를 가장 쉽게 설치할 수 있는 방법은 Docker Desktop을 사용하는 것입니다. Docker Desktop은 Windows와 macOS를 지원하며, Docker 엔진, Docker CLI, Docker Compose 등 필요한 모든 구성 요소를 포함하고 있습니다.
- Docker Desktop 공식 웹사이트에서 운영체제에 맞는 설치 파일을 다운로드합니다.
- 설치 파일을 실행하고 안내에 따라 설치를 진행합니다.
- 설치가 완료되면 Docker Desktop을 실행합니다.
제 경험상 Docker Desktop은 초보자가 Docker를 시작하기에 가장 편리한 방법입니다. 필요한 모든 도구가 포함되어 있어 별도의 설정 없이 바로 사용할 수 있습니다.
Docker CLI 기본 명령어
Docker CLI는 Docker 엔진과 상호 작용하기 위한 명령줄 인터페이스입니다. 다음은 자주 사용되는 Docker CLI 명령어입니다.
- `docker version`: Docker 버전 정보를 확인합니다.
- `docker images`: 로컬에 저장된 Docker 이미지 목록을 확인합니다.
- `docker pull <이미지 이름>`: Docker Hub에서 이미지를 다운로드합니다. 예를 들어, `docker pull ubuntu`는 Ubuntu 이미지를 다운로드합니다.
- `docker run <이미지 이름>`: 이미지를 기반으로 컨테이너를 생성하고 실행합니다. 예를 들어, `docker run -it ubuntu bash`는 Ubuntu 컨테이너를 실행하고 bash 쉘에 접속합니다.
- `docker ps`: 실행 중인 컨테이너 목록을 확인합니다.
- `docker ps -a`: 모든 컨테이너 목록 (실행 중, 중단된 컨테이너 포함)을 확인합니다.
- `docker stop <컨테이너 ID>`: 컨테이너를 중지합니다.
- `docker rm <컨테이너 ID>`: 컨테이너를 삭제합니다.
- `docker rmi <이미지 ID>`: 이미지를 삭제합니다.
개인적으로는 `docker ps -a` 명령어를 자주 사용합니다. 어떤 컨테이너가 생성되었고, 어떤 상태인지 한눈에 파악할 수 있기 때문입니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile은 Docker 이미지를 자동으로 생성하기 위한 설정 파일입니다. Dockerfile에는 베이스 이미지, 필요한 패키지 설치, 파일 복사, 실행 명령어 등이 정의됩니다.
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"]
각 명령어의 의미는 다음과 같습니다.
- `FROM python:3.9-slim-buster`: 베이스 이미지로 Python 3.9 slim 버전을 사용합니다.
- `WORKDIR /app`: 컨테이너 내의 작업 디렉토리를 /app으로 설정합니다.
- `COPY requirements.txt .`: requirements.txt 파일을 현재 디렉토리로 복사합니다.
- `RUN pip install –no-cache-dir -r requirements.txt`: requirements.txt에 정의된 Python 패키지를 설치합니다.
- `COPY . .`: 현재 디렉토리의 모든 파일을 컨테이너 내의 /app 디렉토리로 복사합니다.
- `CMD [“python”, “app.py”]`: 컨테이너가 시작될 때 실행할 명령어를 정의합니다.
이미지 빌드
Dockerfile을 작성한 후에는 다음 명령어를 사용하여 이미지를 빌드할 수 있습니다.
docker build -t my-python-app .
`-t` 옵션은 이미지의 이름을 지정하는 옵션입니다. 위 명령어는 현재 디렉토리의 Dockerfile을 사용하여 `my-python-app`이라는 이름의 이미지를 빌드합니다.
실제로 사용해보니 Dockerfile을 잘 작성하면 개발 환경을 쉽고 빠르게 구축할 수 있습니다. 특히 여러 개발자가 협업하는 프로젝트에서는 Dockerfile을 통해 환경 일관성을 유지하는 것이 매우 중요합니다.
Docker Compose를 활용한 복잡한 환경 구축
Docker Compose는 여러 개의 컨테이너를 정의하고 관리하기 위한 도구입니다. Docker Compose 파일을 통해 애플리케이션의 모든 서비스를 정의하고, 한 번의 명령어로 모든 컨테이너를 실행할 수 있습니다.
Docker Compose 파일 예시
다음은 웹 애플리케이션과 데이터베이스를 함께 실행하는 Docker Compose 파일 예시입니다.
version: "3.9"
services:
web:
image: my-web-app
ports:
- "80:80"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
위 파일은 `web`과 `db`라는 두 개의 서비스를 정의합니다. `web` 서비스는 `my-web-app` 이미지를 사용하고, 80번 포트를 호스트의 80번 포트에 매핑합니다. `db` 서비스는 `postgres:13` 이미지를 사용하고, 데이터베이스 사용자 이름, 비밀번호, 데이터베이스 이름을 설정합니다. `depends_on` 옵션은 `web` 서비스가 `db` 서비스에 의존한다는 것을 명시합니다.
Docker Compose 실행
Docker Compose 파일을 작성한 후에는 다음 명령어를 사용하여 모든 서비스를 실행할 수 있습니다.
docker-compose up -d
`-d` 옵션은 컨테이너를 백그라운드에서 실행하는 옵션입니다. 위 명령어는 Docker Compose 파일에 정의된 모든 서비스를 실행합니다.
결론 및 다음 단계
이 글에서는 Docker의 기본 개념부터 설치, 사용법, 그리고 Docker Compose를 활용한 복잡한 환경 구축까지 알아보았습니다. Docker는 개발 환경의 일관성을 유지하고 애플리케이션 배포를 자동화하는 데 매우 유용한 도구입니다. Docker를 활용하여 개발 생산성을 높이고, 애플리케이션 배포 과정을 간소화해보세요.
다음 단계로는 다음 사항을 학습해보는 것을 추천합니다.
- Docker 네트워크
- Docker 볼륨
- Docker Swarm 또는 Kubernetes를 이용한 컨테이너 오케스트레이션
- CI/CD 파이프라인에 Docker 통합
“`