“`html
Docker 입문: 컨테이너 기술로 개발 효율 높이기
Docker는 현대 소프트웨어 개발과 배포에 있어 필수적인 기술이 되었습니다. 복잡한 개발 환경을 컨테이너라는 가벼운 패키지로 만들어, 어떤 환경에서도 일관된 실행을 보장해주기 때문입니다. 이 글에서는 Docker의 기본 개념부터 시작하여, 실제 개발 환경에 적용할 수 있는 실용적인 방법까지 자세히 알아보겠습니다.
Docker란 무엇일까요?
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 좀 더 쉽게 설명하자면, 여러분의 애플리케이션과 그 애플리케이션이 실행되기 위해 필요한 모든 것(라이브러리, 시스템 도구, 코드, 런타임 등)을 하나의 패키지, 즉 컨테이너 안에 담아 어디서든 동일하게 실행될 수 있도록 해주는 도구입니다.
컨테이너와 가상 머신의 차이점
Docker를 처음 접하는 분들은 가상 머신(VM)과 컨테이너의 차이점을 궁금해하실 수 있습니다. 가상 머신은 운영체제 전체를 가상화하는 반면, 컨테이너는 운영체제 커널을 공유하며 애플리케이션 실행에 필요한 최소한의 리소스만 포함합니다. 따라서 컨테이너는 가상 머신보다 훨씬 가볍고 빠르며, 리소스 효율성이 높습니다. 제 경험상, 컨테이너를 사용하면 가상 머신에 비해 훨씬 빠른 시작 시간과 적은 리소스 사용량을 경험할 수 있었습니다.
Docker의 장점
Docker는 다음과 같은 다양한 장점을 제공합니다.
- 환경 일관성: 개발, 테스트, 배포 환경을 동일하게 유지하여 “내 환경에서는 잘 되는데…” 문제를 해결합니다.
- 리소스 효율성: 가상 머신보다 가볍고 빠르며, 시스템 자원을 효율적으로 사용합니다.
- 빠른 배포: 컨테이너 이미지를 통해 애플리케이션을 빠르게 배포할 수 있습니다.
- 확장성: 컨테이너를 쉽게 확장하고 관리할 수 있습니다.
- 격리성: 컨테이너는 호스트 시스템과 격리되어 보안성을 높입니다.
Docker 설치 및 기본 명령어
Docker를 사용하기 위해서는 먼저 Docker를 설치해야 합니다. Docker는 Windows, macOS, Linux 등 다양한 운영체제에서 사용할 수 있으며, Docker Desktop을 통해 GUI 환경에서 편리하게 관리할 수 있습니다.
Docker 설치 방법
Docker 설치는 운영체제별로 조금씩 다릅니다. Docker 공식 웹사이트(https://www.docker.com/)에서 자신의 운영체제에 맞는 설치 방법을 확인하고 설치를 진행하면 됩니다. Windows와 macOS에서는 Docker Desktop을 설치하는 것이 일반적이며, Linux에서는 패키지 관리자를 통해 설치할 수 있습니다.
기본 Docker 명령어
Docker를 설치했다면 이제 기본적인 명령어를 사용해볼 차례입니다. 다음은 자주 사용되는 Docker 명령어입니다.
- docker run: 새로운 컨테이너를 실행합니다. (예:
docker run ubuntu bash
) - docker ps: 실행 중인 컨테이너 목록을 보여줍니다.
- docker images: 로컬에 저장된 이미지 목록을 보여줍니다.
- docker pull: Docker Hub에서 이미지를 다운로드합니다. (예:
docker pull ubuntu
) - docker build: Dockerfile을 사용하여 이미지를 빌드합니다.
- docker stop: 실행 중인 컨테이너를 중지합니다.
- docker rm: 컨테이너를 삭제합니다.
명령어 사용 예시: docker run -it --name my-ubuntu ubuntu bash
는 Ubuntu 이미지를 기반으로 새로운 컨테이너를 실행하고, 터미널에 접속할 수 있도록 해줍니다. -it
옵션은 interactive terminal을 사용하겠다는 의미이고, --name my-ubuntu
는 컨테이너에 이름을 부여하는 것입니다.
Dockerfile 작성: 나만의 이미지 만들기
Dockerfile은 이미지를 빌드하기 위한 명령어들을 담고 있는 텍스트 파일입니다. Dockerfile을 사용하면 애플리케이션의 실행 환경을 코드 형태로 관리할 수 있으며, 이미지 빌드 과정을 자동화할 수 있습니다.
Dockerfile 기본 구조
Dockerfile은 다음과 같은 기본적인 구조를 가집니다.
- FROM: 기반 이미지 (base image)를 지정합니다.
- MAINTAINER: 이미지 작성자를 명시합니다.
- RUN: 이미지를 빌드하는 동안 실행될 명령어를 지정합니다.
- COPY: 로컬 파일을 이미지 안으로 복사합니다.
- ADD: COPY와 유사하지만, 압축 파일 자동 압축 해제 기능 등을 제공합니다.
- WORKDIR: 컨테이너 안에서 명령어를 실행할 작업 디렉토리를 지정합니다.
- EXPOSE: 컨테이너가 외부로 노출할 포트를 지정합니다.
- CMD: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
- ENV: 환경 변수를 설정합니다.
간단한 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
파일에 정의된 파이썬 패키지를 설치하고, 현재 디렉토리의 모든 파일을 이미지 안으로 복사한 후, app.py
파일을 실행합니다.
Dockerfile 작성 팁
- 기반 이미지를 신중하게 선택하세요: 작고 안전한 이미지를 선택하는 것이 좋습니다.
- 레이어 수를 최소화하세요: RUN 명령어를 묶어서 실행하면 이미지 크기를 줄일 수 있습니다.
- 캐시를 활용하세요: 변경 가능성이 낮은 명령어들을 Dockerfile 앞쪽에 배치하면 빌드 속도를 향상시킬 수 있습니다.
Docker Compose 활용: 여러 컨테이너를 하나로
Docker Compose는 여러 개의 컨테이너를 정의하고 실행하기 위한 도구입니다. 예를 들어, 웹 애플리케이션, 데이터베이스, 캐시 서버 등 여러 컨테이너를 함께 실행해야 하는 경우에 Docker Compose를 사용하면 편리하게 관리할 수 있습니다.
Docker Compose 파일 (docker-compose.yml)
Docker Compose는 docker-compose.yml
파일에 컨테이너 설정 정보를 정의합니다. 이 파일은 YAML 형식으로 작성되며, 서비스, 네트워크, 볼륨 등을 정의할 수 있습니다.
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
이 docker-compose.yml
파일은 web
서비스와 db
서비스를 정의합니다. web
서비스는 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드하고, 8000번 포트를 노출합니다. db
서비스는 Postgres 13 이미지를 사용하며, 환경 변수를 설정합니다. depends_on
옵션을 사용하여 web
서비스가 db
서비스에 의존하는 것을 명시합니다.
Docker Compose 명령어
Docker Compose를 사용하기 위한 기본적인 명령어는 다음과 같습니다.
- docker-compose up:
docker-compose.yml
파일에 정의된 모든 서비스를 시작합니다. - docker-compose down:
docker-compose.yml
파일에 정의된 모든 서비스를 중지하고 컨테이너를 삭제합니다. - docker-compose ps:
docker-compose.yml
파일에 정의된 서비스의 상태를 보여줍니다.
명령어 사용 예시: docker-compose up -d
는 docker-compose.yml
파일에 정의된 모든 서비스를 백그라운드에서 실행합니다. -d
옵션은 detached mode를 의미합니다.
결론: Docker를 활용하여 효율적인 개발 환경 구축하기
지금까지 Docker의 기본 개념부터 Dockerfile 작성, Docker Compose 활용까지 Docker를 활용하여 개발 효율을 높이는 방법을 알아보았습니다. Docker는 초기 학습 비용이 다소 있을 수 있지만, 익숙해지면 개발, 테스트, 배포 과정을 획기적으로 개선할 수 있는 강력한 도구입니다. 개인적으로는 Docker를 사용하면서 개발 환경 설정 시간을 줄이고, 애플리케이션 배포의 안정성을 높일 수 있었습니다.
다음 단계로는 Docker Hub를 이용하여 이미지를 공유하고, Docker를 CI/CD 파이프라인에 통합하는 방법을 학습하는 것을 추천합니다. Docker는 DevOps 엔지니어링에서 핵심적인 역할을 수행하며, 지속적인 학습과 실습을 통해 더욱 능숙하게 다룰 수 있게 될 것입니다.
“`