컨테이너 데이터 유지하기
컨테이너 데이터 유지하기
컨테이너는 기본적으로 일시적(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 이미지로 다음 명령을 사용해 컨테이너를 시작해요.
이 명령은 데이터베이스를 백그라운드에서 시작하고, 비밀번호로 구성하며, PostgreSQL이 데이터베이스 파일을 영구화할 디렉터리에 볼륨을 연결해요.$ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql postgres:18 - 다음 명령으로 데이터베이스에 연결해요.
$ 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:18POSTGRES_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_datadocker volume prune명령으로 사용하지 않는 모든 볼륨을 제거해요.$ docker volume prune
추가 자료
볼륨에 대해 더 알아보는 데 다음 자료가 도움이 될 거예요.
다음 단계
컨테이너 데이터 유지에 대해 배웠으니, 이제 컨테이너와 로컬 파일을 공유하는 방법을 배울 차례예요. 컨테이너와 로컬 파일 공유하기