컨테이너 데이터 유지하기

컨테이너 데이터 유지하기

컨테이너는 기본적으로 일시적(ephemeral)이라 지워지면 그 안의 파일 변경도 함께 사라져요. 데이터를 컨테이너 수명 주기 밖에서 유지하려면 볼륨(volume)을 사용해야 해요. 이 가이드에서 볼륨을 만들고, 연결하고, 관리하고, 제거하는 방법을 배워요.

출처: 문서

본문

설명

컨테이너가 시작되면 이미지가 제공하는 파일과 구성을 사용해요. 각 컨테이너는 파일을 만들고, 수정하고, 삭제할 수 있으며, 그 과정에서 다른 컨테이너에는 영향을 주지 않아요. 컨테이너가 삭제되면 이런 파일 변경도 함께 삭제돼요.

컨테이너의 이런 일시적인 특성은 훌륭하지만, 데이터를 유지하고 싶을 때는 문제가 돼요. 예를 들어 데이터베이스 컨테이너를 재시작할 때 빈 데이터베이스로 시작하고 싶지 않을 거예요. 그럼 파일을 어떻게 유지할까요?

컨테이너 볼륨

볼륨은 개별 컨테이너의 수명 주기를 넘어 데이터를 유지할 수 있는 저장 메커니즘이에요. 컨테이너 안에서 컨테이너 밖으로 향하는 바로가기나 심볼릭 링크를 제공하는 것처럼 생각하면 돼요.

예를 들어 log-data라는 이름의 볼륨을 만든다고 상상해 봐요.

$ docker volume create log-data

다음 명령으로 컨테이너를 시작하면 볼륨이 컨테이너 안의 /logs에 마운트(또는 연결)돼요.

$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker

log-data 볼륨이 존재하지 않으면 Docker가 자동으로 만들어 줘요.

컨테이너가 실행되는 동안 /logs 폴더에 쓰는 모든 파일은 컨테이너 밖인 이 볼륨에 저장돼요. 컨테이너를 삭제하고 같은 볼륨을 사용하는 새 컨테이너를 시작해도 파일은 그대로 있어요.

볼륨으로 파일 공유하기

같은 볼륨을 여러 컨테이너에 연결해 컨테이너 간에 파일을 공유할 수 있어요. 로그 집계, 데이터 파이프라인, 또는 기타 이벤트 기반 애플리케이션 같은 시나리오에서 유용할 수 있어요.

볼륨 관리

볼륨은 컨테이너와는 별개의 자체 수명 주기를 가지며, 사용하는 데이터와 애플리케이션의 종류에 따라 꽤 커질 수 있어요. 볼륨을 관리하는 데 유용한 명령들은 다음과 같아요.

  • docker volume ls — 모든 볼륨을 나열해요.
  • docker volume rm — 볼륨을 제거해요. (볼륨이 어떤 컨테이너에도 연결되어 있지 않을 때만 동작해요)
  • docker volume prune — 사용하지 않는(연결되지 않은) 모든 볼륨을 제거해요.

직접 해보기

이 가이드에서는 볼륨을 만들고 사용해 Postgres 컨테이너가 만든 데이터를 유지하는 연습을 해요. 데이터베이스가 실행되면 /var/lib/postgresql 디렉터리에 파일을 저장해요. 여기에 볼륨을 연결하면 컨테이너를 여러 번 재시작해도 데이터를 유지할 수 있어요.

볼륨 사용하기

  • Docker Desktop을 다운로드하고 설치해요.
  • Postgres 이미지로 다음 명령을 사용해 컨테이너를 시작해요.
    $ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql postgres:18
    
    이 명령은 데이터베이스를 백그라운드에서 시작하고, 비밀번호로 구성하며, PostgreSQL이 데이터베이스 파일을 영구화할 디렉터리에 볼륨을 연결해요.
  • 다음 명령으로 데이터베이스에 연결해요.
    $ docker exec -ti db psql -U postgres
    
  • PostgreSQL 명령줄에서 다음을 실행해 데이터베이스 테이블을 만들고 레코드 두 개를 삽입해요.
    CREATE TABLE tasks (
        id SERIAL PRIMARY KEY,
        description VARCHAR(100)
    );
    INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun');
    
  • PostgreSQL 명령줄에서 다음을 실행해 데이터가 데이터베이스에 있는지 확인해요.
    SELECT * FROM tasks;
    
    다음과 같은 출력이 나와야 해요.
    id | description
    ----+-------------
      1 | Finish work
      2 | Have fun
    (2 rows)
    
  • 다음 명령을 실행해 PostgreSQL 셸에서 나가요.
    \q
    
  • 데이터베이스 컨테이너를 중지하고 제거해요. 컨테이너가 삭제됐어도 데이터는 postgres_data 볼륨에 유지된다는 점을 기억하세요.
    $ docker stop db
    $ docker rm db
    
  • 다음 명령으로 새 컨테이너를 시작하고, 유지된 데이터가 있는 같은 볼륨을 연결해요.
    $ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql postgres:18
    
    POSTGRES_PASSWORD 환경 변수가 생략된 걸 눈치챘을 거예요. 그 변수는 새 데이터베이스를 초기화(bootstrap)할 때만 사용되기 때문이에요.
  • 다음 명령을 실행해 데이터베이스에 레코드가 여전히 있는지 확인해요.
    $ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
    

볼륨 내용 보기

Docker Desktop 대시보드는 어떤 볼륨의 내용도 볼 수 있고, 볼륨을 내보내기, 가져오기, 비우기, 삭제, 복제할 수도 있어요.

  • Docker Desktop 대시보드를 열고 Volumes 뷰로 이동해요. 이 뷰에서 postgres_data 볼륨이 보여야 해요.
  • postgres_data 볼륨의 이름을 선택해요.
  • Stored Data 탭은 볼륨의 내용을 보여주고 파일을 탐색할 수 있게 해 줘요. Container in-use 탭은 볼륨을 사용하는 컨테이너의 이름, 이미지 이름, 컨테이너가 사용하는 포트 번호, 그리고 대상을 표시해요. 대상(target)은 볼륨의 파일에 접근할 수 있게 해 주는 컨테이너 내부의 경로예요. Exports 탭에서는 볼륨을 내보낼 수 있어요. 파일을 더블클릭하면 내용을 보고 변경할 수 있어요.
  • 파일을 마우스 오른쪽 버튼으로 클릭해 저장하거나 삭제할 수 있어요.

볼륨 제거

볼륨을 제거하기 전에 어떤 컨테이너에도 연결되어 있지 않아야 해요. 이전 컨테이너를 아직 제거하지 않았다면 다음 명령으로 제거해요. (-f는 컨테이너를 먼저 중지한 다음 제거해요)

$ docker rm -f new-db

볼륨을 제거하는 방법은 여러 가지가 있어요.

  • Docker Desktop 대시보드에서 볼륨의 Delete Volume 옵션을 선택해요.
  • docker volume rm 명령을 사용해요.
    $ docker volume rm postgres_data
    
  • docker volume prune 명령으로 사용하지 않는 모든 볼륨을 제거해요.
    $ docker volume prune
    

추가 자료

볼륨에 대해 더 알아보는 데 다음 자료가 도움이 될 거예요.

다음 단계

컨테이너 데이터 유지에 대해 배웠으니, 이제 컨테이너와 로컬 파일을 공유하는 방법을 배울 차례예요. 컨테이너와 로컬 파일 공유하기

더 알아보기 (Learn more)