본문 바로가기

CICD

도커 개념 정리: 이미지, 컨테이너, 볼륨, 컴포즈

도커(Docker)는 왜 써야 할까?

내 컴퓨터에서는 잘 되던 프로그램이 다른 컴퓨터에선 에러가 나는 경우가 있습니다. 운영체제, 라이브러리 버전, 설치 순서 등 환경 차이 때문입니다. 이 문제를 해결해주는 도구가 바로 Docker(도커)입니다.

 

도커의 가장 큰 장점은 이식성입니다. 한 번 도커로 패키징한 프로그램은 어떤 컴퓨터에서든 동일하게 실행할 수 있습니다. 설치 에러, 환경 충돌을 더 이상 신경 쓸 필요가 없습니다.


도커(Docker)

Docker는 프로그램을 격리된 환경에서 실행할 수 있도록 도와주는 플랫폼입니다.
이 격리된 환경을 우리는 컨테이너(Container)라고 부릅니다. 마치 한 컴퓨터 안에 여러 개의 작은 컴퓨터(미니 운영체제)를 띄워서 그 안에서 각각 독립적으로 프로그램을 실행시키는 개념입니다. 도커를 사용하면 프로그램 하나를 설치하려고 이것저것 설정할 필요 없이 명령어 한 줄로 바로 실행할 수 있게 됩니다.


도커 이미지(Docker Image)

도커 이미지(Image)는 프로그램을 실행하는 데 필요한 모든 정보(설치파일, 설정값, 실행환경 등)를 담고 있는 설치 패키지입니다. 이미지는 읽기 전용이며, 이 이미지를 바탕으로 실제 실행 환경인 컨테이너를 생성합니다. 

 

도커 이미지 다운로드는 Docker Hub라는 곳에서 이미지를 다운 받을 수 있습니다. 여기서 Docker Hub는 도커 이미지를 저장 및 다운받을 수 있는 저장소 역할을 합니다.

 

예를 들어 redis라는 이름의 이미지는 Redis라는 데이터베이스 서버를 실행하기 위한 모든 준비물이 담긴 상자라고 생각하면 됩니다. 아래와 같은 명령어로 다운로드 받을 수 있습니다.

# redis 이미지 다운로드
docker pull redis

 

아래 명령어를 사용하면 다운 받은 도커 이미지를 확인할 수 있습니다.

# 다운 받은 도커 이미지 확인
docker images


도커 컨테이너(Docker Container)

컨테이너(Container)는 이미지를 실제로 실행시킨 상태입니다. 이미지가 설계도라면 컨테이너는 그 설계도로 만든 실제 제품이라고 볼 수 있습니다. 

 

도커 컨테이너는 각각 독립된 파일 시스템, 네트워크, 저장 공간을 가지고 있어서 서로 간섭하지 않습니다. 그 덕분에 동일한 환경에서 안정적으로 실행할 수 있습니다.

 

이전에 다운로드 받은 Redis 이미지를 아래와 같은 명령어로 실행할 수 있습니다.

# Redis 컨테이너 실행
docker run -d -p 6379:6379 redis
  • -d: 백그라운드 실행
  • -p: 포트 연결 (호스트:컨테이너)

실행 후 아래 명령어로 정상 실행 여부를 확인할 수 있습니다.

# 컨테이너 상태 확인
docker ps


호스트(Host)란?

도커에서 말하는 호스트(Host)는 도커가 설치된 실제 컴퓨터를 뜻합니다. 내가 쓰는 노트북이든 데스크탑이든 도커를 실행하는 그 기계가 바로 호스트입니다.

반면에 컨테이너는 그 호스트 안에서 실행되는 가상의 작은 컴퓨터(환경)입니다. 호스트와 컨테이너는 격리되어 있지만 파일을 공유하거나 포트를 연결할 수 있습니다.


도커 볼륨(Docker Volume)

컨테이너는 삭제하면 그 안의 데이터도 같이 사라집니다. 예를 들어 MySQL 컨테이너를 지우면 데이터베이스 안의 데이터도 날아가게 됩니다.

 

이런 문제를 해결하기 위해 도커 볼륨(Volume)을 사용합니다. 볼륨은 호스트의 디스크 공간을 컨테이너에 연결해주는 기능입니다.

 

즉, 컨테이너 안에서 만든 데이터라도 호스트 컴퓨터에 저장되므로 컨테이너를 지워도 데이터는 남게 됩니다.

# 볼륨을 연결해서 MySQL 실행
docker run -e MYSQL_ROOT_PASSWORD=pwd1234 -v /home/user/mysql_data:/var/lib/mysql -p 3306:3306 -d mysql
  • -e MYSQL_ROOT_PASSWORD=...: MySQL의 루트 비밀번호 설정
  • -v /home/user/mysql_data:/var/lib/mysql
    • 왼쪽이 호스트 경로, 오른쪽이 컨테이너 경로
    • 즉, MySQL 데이터베이스 파일이 저장되는 /var/lib/mysql 폴더를 호스트의 /home/user/mysql_data와 연결
    • 이렇게 하면 컨테이너를 삭제해도 /home/user/mysql_data 안에 데이터가 그대로 남습니다.
  • -p: 포트 매핑
    • 도커 컨테이너는 기본적으로 외부에서 접근할 수 없는 격리된 환경입니다. 그래서 컨테이너 내부에서 실행 중인 서비스(Redis, MySQL 등)에 호스트 컴퓨터에서 접근하려면 포트를 연결해주는 작업이 필요합니다.
    • 왼쪽(호스트 포트): 실제 내 컴퓨터(호스트)에서 열어줄 포트 번호
    • 오른쪽(컨테이너 포트): 컨테이너 내부에서 실행 중인 서비스가 사용하는 포트 번호
  • -d: 백그라운드 실행

이렇게 하면 데이터 손실 없이 컨테이너를 재실행하거나 교체할 수 있습니다.


도커 컴포즈(Docker Compose)

도커를 실제로 활용하다 보면 하나의 컨테이너만 사용하는 경우보다 여러 개의 컨테이너를 동시에 실행해야 하는 경우가 많습니다. 예를 들어 백엔드 서버(Spring Boot)와 Redis를 함께 실행하는 경우가 그렇습니다.

 

이럴 때 사용하는 것이 도커 컴포즈 입니다. 도커 컴포즈는 여러 개의 Docker 컨테이너를 하나의 서비스로 정의하고 구성해서 하나의 묶음으로 실행하고 관리할 수 있게 해주는 도구입니다.

 

아래는 간단하게 연습을 하기 위해 Redis와 MySQL을 도커 컴포즈로 동시에 실행하는 과정입니다.

 

1. Docker compose 파일 작성

  • my-db: MySQL 컨테이너 정의
    • environment: MySQL 비밀번호 설정
    • volumes: 데이터 영속성을 위한 볼륨 연결
    • ports: 호스트 ↔ 컨테이너 포트 매핑
  • my-cache-server: Redis 컨테이너 정의

2. Docker compose 파일 실행시키기

 

3. 도커 컨테이너 확인

 

4. Docker Compose로 실행된 컨테이너 삭제

 

이렇게 Docker Compose를 사용하면 여러 개의 컨테이너를 한 번에 실행하고 관리할 수 있습니다. 그리고 복잡한 명령어를 기억하지 않아도 되고, 팀 프로젝트에서 환경을 코드로 공유할 수 있습니다. 즉, 같은 compose.yml 만 있으면 누구나 동일한 환경을 구성할 수 있습니다.


 

다음 글에서는 이 개념을 활용하여 Spring Boot 프로젝트와 Redis를 도커 컴포즈로 실행하고, 이를 바탕으로 CI/CD를 구축하는 과정을 작성할 예정입니다.