Docker는 현대 애플리케이션 개발 및 배포 환경에서 핵심적인 역할을 하고 있는 도구입니다. 컨테이너라는 개념을 통해 애플리케이션을 가상 환경에서 실행할 수 있게 해주며, 이로 인해 개발 및 운영의 일관성을 보장하고, 배포를 간소화하는 데 큰 기여를 합니다. 이 글에서는 Docker가 어떤 원리로 동작하는지, 왜 유용한지, 그리고 기본 명령어들과 함께 실습을 통해 Docker의 핵심 개념을 다뤄보겠습니다.
Docker란 무엇인가?
Docker는 가상화 기술을 활용하여 애플리케이션을 컨테이너(Container)라는 가벼운 단위로 실행할 수 있게 해주는 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 라이브러리 및 종속성을 하나의 패키지로 묶어 어디서든 실행 가능한 형태로 만들어 줍니다.
컨테이너는 전통적인 가상머신(VM)과 유사한 목적을 갖고 있지만, 훨씬 더 가볍고 빠릅니다. VM은 전체 운영체제를 가상화하는 반면, Docker는 호스트 운영체제의 커널을 공유하는 방식으로 컨테이너를 구동하기 때문에 자원 소비가 훨씬 적습니다.
Docker의 동작 원리
Docker의 기본적인 동작 원리는 '이미지(Image)'와 '컨테이너(Container)'라는 두 가지 핵심 개념을 기반으로 합니다.
- 이미지 (Image) : Docker 이미지는 컨테이너의 실행 파일이라고 생각하면 됩니다. 애플리케이션, 라이브러리, 실행 파일, 환경 변수 등을 모두 포함하는 불변의 파일 시스템 스냅샷입니다. 이미지는 재사용 가능하며 여러 컨테이너가 동일한 이미지를 기반으로 생성될 수 있습니다.
- 컨테이너 (Container) : 컨테이너는 이미지에서 생성된 실행 가능한 인스턴스입니다. 컨테이너는 독립된 프로세스로 동작하며, 호스트 시스템의 커널을 공유하지만 자체 파일 시스템과 네트워크를 갖고 있기 때문에 격리된 환경에서 애플리케이션을 실행할 수 있습니다.
- Docker Daemon (도커 데몬) : Docker는 클라이언트-서버 아키텍처로 동작하며,
docker
명령어를 입력하면 Docker 클라이언트가 Docker 데몬과 통신합니다. Docker 데몬은 이미지 관리, 컨테이너 실행 등을 담당합니다. - Docker Registry : Docker 이미지를 저장하고 관리하는 저장소입니다. Docker Hub는 대표적인 공용 레지스트리로, 수많은 이미지를 무료로 다운로드할 수 있습니다.
컨테이너와 VM의 차이
컨테이너와 VM은 격리된 환경에서 애플리케이션을 실행한다는 점에서는 유사하지만, 그 구조적 차이점은 다음과 같습니다.
- 가상머신(VM)은 하이퍼바이저(Hypervisor)를 통해 각 애플리케이션이 자체 운영체제(OS)를 포함한 독립적인 환경에서 실행됩니다. 이로 인해 VM은 무겁고 부팅 시간이 오래 걸립니다.
- 컨테이너 는 호스트 운영체제의 커널을 공유하며, 애플리케이션과 필요한 라이브러리 및 종속성만을 포함하기 때문에 훨씬 가볍고 빠릅니다.
이러한 차이로 인해 Docker는 더 빠른 배포, 더 적은 자원 사용, 더 쉬운 확장이 가능합니다.
Docker 설치 및 설정
Docker는 여러 운영체제에서 설치할 수 있습니다. 여기서는 Ubuntu를 기준으로 Docker 설치 방법을 설명합니다.
# 1. 기존 패키지 업데이트
sudo apt update
# 2. Docker 패키지를 설치할 수 있도록 종속성을 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 3. Docker GPG 키를 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. Docker 저장소를 추가
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
# 5. 패키지 목록 업데이트 후 Docker 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# 6. Docker 서비스 시작
sudo systemctl start docker
sudo systemctl enable docker
# 7. Docker 설치 확인
docker --version
설치가 완료되면 Docker가 정상적으로 동작하는지 확인할 수 있습니다.
# Docker 확인
docker --version
기본 명령어 사용법
Docker를 사용하기 위한 기본 명령어들을 살펴보겠습니다.
docker run``docker run
명령어는 이미지를 기반으로 컨테이너를 생성하고 실행하는 명령입니다. 가장 간단한 사용법은 다음과 같습니다.
docker run hello-world
이 명령어는 hello-world
라는 이미지를 다운로드하고, 해당 이미지로부터 컨테이너를 생성하여 실행합니다. 처음 실행하면 Docker Hub에서 이미지를 다운로드하고, 이후로는 로컬에서 이미지를 사용합니다.2. docker ps``docker ps
명령어는 실행 중인 컨테이너 목록을 확인할 수 있게 해줍니다. 옵션을 통해 모든 컨테이너(실행 중이 아닌 것 포함)를 볼 수도 있습니다.
# 실행 중인 컨테이너 목록 확인
docker ps
# 중지된 컨테이너까지 모두 확인
docker ps -a
docker stop
및docker rm
컨테이너를 중지하고 삭제하는 명령어입니다.
# 특정 컨테이너 중지
docker stop [컨테이너 ID]
# 특정 컨테이너 삭제
docker rm [컨테이너 ID]
docker images
현재 로컬에 저장된 Docker 이미지 목록을 확인할 수 있습니다.
docker images
docker rmi
이미지를 삭제하는 명령어입니다.
docker rmi [이미지 ID]
Docker Compose
Docker는 단일 컨테이너뿐만 아니라, 여러 컨테이너로 구성된 애플리케이션을 쉽게 관리할 수 있는 Docker Compose
라는 도구를 제공합니다. docker-compose.yml
파일을 사용하여 여러 컨테이너의 설정을 정의하고, 이를 일괄적으로 관리할 수 있습니다.
간단한 예로, 웹 애플리케이션과 데이터베이스를 실행하는 설정 파일을 만들어 보겠습니다.
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example
이 설정 파일을 사용하면 nginx
웹 서버와 mysql
데이터베이스가 함께 실행됩니다.
# docker-compose.yml 파일을 기반으로 컨테이너 실행
docker-compose up
이 명령어 하나로 여러 컨테이너가 동시에 시작되며, 네트워킹 및 설정이 자동으로 이루어집니다.
Docker의 장점과 활용 사례
Docker는 많은 장점을 가지고 있으며, 다양한 분야에서 활용됩니다.
- 이식성
Docker 컨테이너는 동일한 환경에서 실행되므로, "내 컴퓨터에서는 잘 되는데, 서버에서는 안 돼요"라는 문제를 해결해 줍니다. 개발 환경과 운영 환경을 동일하게 유지할 수 있기 때문입니다. - 효율성
컨테이너는 경량화되어 있으며, 호스트 OS의 커널을 공유하기 때문에 자원을 적게 사용합니다. 이를 통해 하나의 서버에서 더 많은 애플리케이션을 실행할 수 있습니다. - 신속한 배포
Docker 이미지는 불변의 파일 시스템 스냅샷으로, 한 번 빌드된 이미지를 어디서든 빠르게 배포할 수 있습니다. 이를 통해 배포 시간을 단축할 수 있습니다. - 마이크로서비스 아키텍처
Docker는 마이크로서비스 아키텍처에서 매우 유용합니다. 각 서비스는 독립된 컨테이너로 실행되므로, 독립적인 배포 및 확장이 가능합니다. - CI/CD 파이프라인 통합
Docker는 CI/CD 파이프라인에 쉽게 통합될 수 있습니다. 애플리케이션을 컨테이너로 빌드하고, 이를 테스트 및 배포하는 과정이 자동화됩니다.
결론
Docker는 현대 애플리케이션 개발에서 필수적인 도구입니다. 컨테이너를 사용하여 환경을 격리하고, 애플리케이션을 일관성 있게 실행하며, 자원을 효율적으로 사용할 수 있게 해줍니다.
'Docker' 카테고리의 다른 글
Dockerfile 기본 명령어 정리 (1) | 2024.12.18 |
---|---|
Docker 데몬(Docker Daemon)에 대해 (0) | 2024.10.21 |
Docker 컨테이너 명령어 정리 (0) | 2024.10.07 |