“`html
Docker 입문: 컨테이너 기술로 개발 효율 극대화하기
최근 몇 년 동안 Docker는 소프트웨어 개발 및 배포 방식을 혁신적으로 변화시켰습니다. 컨테이너 기술을 통해 개발 환경을 일관성 있게 유지하고, 어플리케이션을 어디서든 쉽게 실행할 수 있게 되었죠. 이 글에서는 Docker의 기본 개념부터 실제 사용법까지, 초보자도 쉽게 이해할 수 있도록 상세하게 설명해 드리겠습니다. Docker를 통해 개발 효율을 극대화하고, DevOps 환경을 구축하는 여정을 함께 시작해볼까요?
1. Docker란 무엇인가? 컨테이너 기술의 핵심
Docker는 컨테이너 기반의 가상화 플랫폼입니다. 컨테이너는 어플리케이션과 그 어플리케이션이 실행되는 데 필요한 모든 것(라이브러리, 시스템 도구, 코드, 런타임 등)을 패키징하는 표준화된 단위입니다. 이렇게 패키징된 컨테이너는 어디에서든 동일하게 실행될 수 있습니다.
1.1. Docker의 기본 개념: 이미지와 컨테이너
Docker의 핵심 개념은 이미지와 컨테이너입니다. 이미지는 읽기 전용 템플릿으로, 컨테이너를 생성하는 데 사용됩니다. 이미지는 어플리케이션을 실행하는 데 필요한 모든 것을 포함하고 있습니다. 컨테이너는 이미지의 실행 가능한 인스턴스입니다. 즉, 이미지를 기반으로 생성된 독립적인 실행 환경이라고 생각하면 됩니다.
제 경험상, Docker 이미지를 ‘설계도’, 컨테이너를 ‘설계도를 바탕으로 지어진 집’에 비유하면 이해하기 쉽습니다. 같은 설계도로 여러 채의 집을 지을 수 있는 것처럼, 하나의 Docker 이미지로 여러 개의 컨테이너를 생성할 수 있습니다.
1.2. 가상 머신과의 차이점
Docker는 가상 머신(VM)과 유사하게 어플리케이션을 격리된 환경에서 실행하지만, 작동 방식에는 큰 차이가 있습니다. 가상 머신은 전체 운영체제를 가상화하는 반면, Docker 컨테이너는 호스트 운영체제의 커널을 공유합니다. 따라서 Docker 컨테이너는 가상 머신보다 훨씬 가볍고 빠르게 실행됩니다.
개인적으로는 Docker를 사용하면서 가상 머신보다 훨씬 빠른 실행 속도와 낮은 리소스 사용량에 감탄했습니다. 개발 환경 구축 속도가 눈에 띄게 빨라졌죠.
2. Docker 설치 및 기본 명령어
Docker를 사용하기 위해서는 먼저 Docker Engine을 설치해야 합니다. Docker는 Windows, macOS, Linux 등 다양한 운영체제를 지원합니다. 공식 Docker 웹사이트에서 운영체제에 맞는 설치 파일을 다운로드하여 설치할 수 있습니다.
2.1. Docker 설치 방법 (Ubuntu 기준)
Ubuntu에서는 다음과 같은 명령어를 사용하여 Docker를 설치할 수 있습니다.
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
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
sudo apt install docker-ce docker-ce-cli containerd.io
설치가 완료되면 다음 명령어를 사용하여 Docker가 제대로 설치되었는지 확인할 수 있습니다.
docker --version
2.2. Docker 기본 명령어
Docker를 사용하기 위한 몇 가지 기본적인 명령어를 소개합니다.
docker pull [이미지 이름]
: Docker Hub에서 이미지를 다운로드합니다.docker run [이미지 이름]
: 이미지를 기반으로 컨테이너를 생성하고 실행합니다.docker ps
: 실행 중인 컨테이너 목록을 표시합니다.docker stop [컨테이너 ID]
: 실행 중인 컨테이너를 중지합니다.docker rm [컨테이너 ID]
: 컨테이너를 삭제합니다.docker images
: 로컬에 저장된 이미지 목록을 표시합니다.
이 명령어들을 익혀두면 Docker를 사용하는데 큰 도움이 됩니다. 실제로 사용해보면서 익숙해지는 것이 중요합니다.
3. Dockerfile 작성 및 이미지 빌드
Dockerfile은 Docker 이미지를 빌드하기 위한 명령어들을 담은 텍스트 파일입니다. Dockerfile을 사용하면 어플리케이션의 실행 환경을 코드로 정의하고, 재현 가능한 이미지를 쉽게 만들 수 있습니다.
3.1. Dockerfile 기본 문법
Dockerfile은 다음과 같은 기본 문법을 따릅니다.
FROM [이미지 이름]
: 빌드할 베이스 이미지를 지정합니다.RUN [명령어]
: 이미지를 빌드하는 동안 실행할 명령어를 지정합니다.COPY [소스 경로] [대상 경로]
: 로컬 파일을 이미지에 복사합니다.WORKDIR [경로]
: 컨테이너 내에서 명령어를 실행할 작업 디렉토리를 설정합니다.EXPOSE [포트 번호]
: 컨테이너가 외부로 노출할 포트 번호를 지정합니다.CMD [명령어]
: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
3.2. 간단한 Dockerfile 예시 (Python Flask 어플리케이션)
다음은 Python Flask 어플리케이션을 위한 간단한 Dockerfile 예시입니다.
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
이 Dockerfile은 Python 3.9 슬림 버전 이미지를 베이스 이미지로 사용하고, /app
디렉토리를 작업 디렉토리로 설정합니다. requirements.txt
파일을 복사하고, 필요한 Python 패키지를 설치한 후, 어플리케이션 코드를 복사합니다. 마지막으로 5000번 포트를 노출하고, app.py
파일을 실행합니다.
3.3. 이미지 빌드 및 실행
Dockerfile을 작성한 후에는 다음 명령어를 사용하여 이미지를 빌드할 수 있습니다.
docker build -t [이미지 이름] .
이미지 빌드가 완료되면 다음 명령어를 사용하여 컨테이너를 실행할 수 있습니다.
docker run -p 5000:5000 [이미지 이름]
-p 5000:5000
옵션은 호스트의 5000번 포트를 컨테이너의 5000번 포트에 연결합니다. 이제 브라우저에서 localhost:5000
으로 접속하면 어플리케이션을 확인할 수 있습니다.
4. Docker Compose를 활용한 다중 컨테이너 관리
Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 관리하기 위한 도구입니다. Docker Compose를 사용하면 복잡한 어플리케이션을 구성하는 여러 컨테이너를 하나의 파일로 정의하고, 쉽게 실행하고 관리할 수 있습니다.
4.1. Docker Compose 파일 작성 (docker-compose.yml)
Docker Compose는 YAML 형식의 docker-compose.yml
파일을 사용하여 서비스를 정의합니다. 다음은 간단한 Docker Compose 파일 예시입니다. 이 예시는 웹 어플리케이션과 데이터베이스를 함께 실행하는 서비스를 정의합니다.
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
이 파일은 web
서비스와 db
서비스를 정의합니다. web
서비스는 nginx 웹 서버를 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결합니다. db
서비스는 PostgreSQL 데이터베이스를 실행하고, 데이터베이스 사용자, 비밀번호, 데이터베이스 이름을 설정합니다. depends_on
옵션을 사용하여 web
서비스가 db
서비스에 의존한다는 것을 명시합니다.
4.2. Docker Compose 명령어
Docker Compose 파일을 작성한 후에는 다음 명령어를 사용하여 서비스를 실행할 수 있습니다.
docker-compose up -d
-d
옵션은 컨테이너를 백그라운드에서 실행합니다. 서비스를 중지하려면 다음 명령어를 사용합니다.
docker-compose down
Docker Compose를 사용하면 여러 개의 컨테이너를 쉽게 관리하고, 어플리케이션을 빠르게 배포할 수 있습니다.
5. 결론 및 다음 단계
이 글에서는 Docker의 기본 개념부터 설치, Dockerfile 작성, Docker Compose를 활용한 다중 컨테이너 관리까지, Docker 입문에 필요한 기본적인 내용을 다루었습니다. Docker는 개발 환경을 일관성 있게 유지하고, 어플리케이션을 쉽게 배포할 수 있도록 도와주는 강력한 도구입니다. 이제 Docker를 활용하여 개발 효율을 극대화하고, DevOps 환경을 구축해 보세요.
다음 단계로는 Docker Hub를 이용하여 이미지를 공유하고, Kubernetes와 같은 컨테이너 오케스트레이션 도구를 학습하는 것을 추천합니다. 실제로 다양한 프로젝트에 Docker를 적용해 보면서 경험을 쌓는 것이 중요합니다. 계속해서 Docker를 공부하고 활용하면서 더욱 능숙한 개발자가 되시기를 바랍니다!
“`