[Docker] Volume & Container Modification

배창민·2025년 11월 28일
post-thumbnail

Docker Volume & 컨테이너 개조 정리

도커로 서비스 운영하다 보면 데이터를 어떻게 보존할지, 그리고 컨테이너를 어떻게 커스텀 이미지로 남길지가 핵심 포인트가 된다.
여기서는 두 가지를 정리한다.

  • Docker Volume: 데이터 영속성, 공유
  • Container Modification(컨테이너 개조): 컨테이너 → 새 이미지로 만들기

1. Docker Volume

1-1. Docker Volume 개념

Docker Volume은 컨테이너와 호스트 머신 사이에서 데이터를 공유하기 위한 기능이다.
이를 통해:

  • 컨테이너가 삭제돼도 데이터는 호스트에 남아서 유지된다.
  • 여러 컨테이너가 같은 데이터를 볼륨을 통해 함께 사용할 수 있다.

즉, “컨테이너는 일회용, 데이터는 살아남게” 만들어 주는 도구가 Volume이다.


1-2. 장점 정리

  1. 데이터 영속성 유지

    • 컨테이너 파일 시스템만 쓰면 컨테이너 삭제 시 데이터도 같이 사라진다.
    • Volume을 사용하면 데이터는 호스트에 따로 저장되기 때문에 컨테이너를 지워도 데이터는 유지된다.
  2. 개발 환경 유연성

    • 호스트 파일을 컨테이너에 마운트해 두면, 호스트에서 코드/설정을 바꾸는 즉시 컨테이너에도 반영된다.
    • 이미지 재빌드, 컨테이너 재생성 없이 빠르게 개발할 수 있다.
  3. 여러 컨테이너 간 데이터 공유

    • 하나의 Volume을 여러 컨테이너에 마운트하면 같은 데이터에 동시에 접근할 수 있다.
    • 예: 여러 앱 컨테이너가 같은 로그 디렉터리를 공유.

1-3. Bind mount와 Volume 차이

  • Bind mount

    • 호스트의 특정 디렉터리를 그대로 컨테이너에 붙인다.
    • -v /host/path:/container/path 형식.
    • 호스트 경로에 강하게 의존.
  • Volume

    • Docker가 관리하는 별도 저장 영역.
    • 이름만 지정하면 되며, 실제 위치/경로는 Docker가 관리.
    • 백업, 이동, 권한 관리 측면에서 더 유연하고 안전하다.

1-4. MySQL 예제로 보는 Volume 활용

1) Volume 생성

docker volume create mysql_data

2) MySQL 컨테이너 실행 + Volume 마운트

docker run -d \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -v mysql_data:/var/lib/mysql \
  --name mysql-container \
  mysql:latest
  • -v mysql_data:/var/lib/mysql

    • mysql_data 볼륨을 MySQL 데이터 디렉터리에 연결
    • DB 데이터가 컨테이너가 아닌 Volume에 저장된다.

3) MySQL 접속 후 데이터 생성

docker exec -it mysql-container mysql -u root -p

MySQL 내부에서:

CREATE DATABASE testdb;
USE testdb;

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50)
);

INSERT INTO users (name) VALUES ('Alice'), ('Bob');
SELECT * FROM users;

4) 컨테이너 삭제 후 다시 실행해도 데이터 유지

컨테이너 삭제:

docker rm -f mysql-container

동일한 Volume을 다시 마운트해서 컨테이너 생성:

docker run -d \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -v mysql_data:/var/lib/mysql \
  --name mysql-container \
  mysql:latest

다시 접속해서 데이터 확인:

docker exec -it mysql-container mysql -u root -p
USE testdb;
SELECT * FROM users;

여기서 데이터가 그대로 남아 있으면, Volume이 데이터 영속성을 보장해 준 것.


1-5. Volume 관리 명령 요약

1) Volume 목록 조회

docker volume ls

2) Volume 상세 정보 확인

docker volume inspect mysql_data
  • 실제 물리 경로, 드라이버, 사용 중인 컨테이너 등 정보 확인 가능.

3) 특정 Volume 삭제

docker volume rm mysql_data

4) 사용하지 않는 Volume 일괄 삭제

docker volume prune
  • 어떤 컨테이너와도 연결되지 않은 볼륨을 모두 삭제.
  • 실행 시 한 번 더 확인을 요구한다.

2. Container Modification(컨테이너 개조)

2-1. 컨테이너 개조 개념

컨테이너를 띄운 뒤 추가로 세팅을 하고, 그 상태를 새로운 이미지로 저장하는 작업을 말한다.

예를 들면:

  • Ubuntu 컨테이너에 curl, git 등 필요한 패키지를 설치
  • 셸 환경 설정, 유틸 설치
  • 그 결과를 커스텀 베이스 이미지로 만들어 두고 반복 사용

이렇게 하면 팀/프로젝트에서 공통으로 사용할 “표준 베이스 이미지”를 쉽게 만들 수 있다.


2-2. 예제: Ubuntu 컨테이너에 curl 설치 후 이미지로 저장

1) Ubuntu 컨테이너 실행 및 접속

docker run -it --name myubuntu ubuntu bash
  • --name myubuntu : 컨테이너 이름을 myubuntu로 지정
  • -it : 인터랙티브 모드 + 터미널 연결

2) 컨테이너 내부에서 curl 설치

컨테이너 안에서:

apt update && apt install -y curl
  • apt update : 패키지 목록 갱신
  • apt install -y curl : curl 설치

3) 설치 확인

curl --version
  • 버전 정보가 출력되면 설치 완료.

4) 현재 컨테이너 상태를 새 이미지로 만들기

컨테이너 밖(호스트)에서:

docker commit myubuntu ubuntu-with-curl
  • myubuntu 컨테이너를 기반으로
  • ubuntu-with-curl 이라는 새 이미지를 생성

이제부터는 ubuntu-with-curl 이미지를 사용하면 매번 curl 설치 과정을 반복할 필요가 없다.


2-3. 커스텀 이미지로 컨테이너 실행 + curl 사용

docker run -it ubuntu-with-curl bash

새 컨테이너 안에서:

curl http://example.com
  • 서버 응답이 출력되면 curl이 정상적으로 동작하는 것.

마무리 정리

  • Docker Volume

    • 데이터 영속성, 복수 컨테이너 간 공유에 사용
    • docker volume create/ls/inspect/rm/prune 로 관리
    • DB, 로그, 업로드 파일 등 “컨테이너와 생명주기를 분리해야 하는 데이터”에 필수
  • 컨테이너 개조(Container Modification)

    • 컨테이너에서 필요한 패키지/설정을 추가한 후
    • docker commit 으로 새 이미지를 만들어 재사용
    • 자주 사용하는 개발/배포 환경을 “커스텀 베이스 이미지”로 만들어 둘 때 유용

이 두 가지를 익혀두면 데이터를 안전하게 관리하고, 반복 가능한 환경을 표준화하는데 유용하게 쓸 수 있다.

profile
개발자 희망자

0개의 댓글