Skip to content
isdnetworks
Go back

컨테이너에서 뭘 백업하나

인증 서버를 컨테이너로 돌리고 있었다. 이미지를 교체해야 하는데 데이터가 이미지 안에 쌓이는지 호스트 마운트에만 쌓이는지가 분명하지 않았다.

Table of contents

Open Table of contents

사전 준비 — 마운트를 봤다

먼저 호스트 마운트에 무엇이 있는지 봤다.

ls -la /etc/ipsec.d/
cert9.db          인증서 DB
key4.db           키 DB
pkcs11.txt
ikev2.conf        설정
passwd
<클라이언트 설정들>

인증 기관 개인키와 서버 인증서와 발급한 클라이언트 인증서가 전부 여기 있었다.

cert9.dbkey4.db 가 이 서버의 영속 상태다. 이것이 /etc/ipsec.d 쪽에 있다는 것이 확인의 절반이었다.

검증 — 레이어 변경분

컨테이너 안에 무엇이 쌓이는지도 봤다.

docker diff infra-vpn

나온 것을 분류하니 재생성되는 설정이 한 무더기였다.

/etc/ipsec.conf
/etc/ipsec.secrets
/etc/ppp/*
/etc/xl2tpd.conf

ipsec.confipsec.secrets 는 매 기동 시 환경 변수와 인증서 DB 로 다시 만든다.

나머지는 휘발성 런타임 파일이었다.

/run/pluto
/run/xl2tpd
/run/lock

/run 아래의 프로세스 파일이라 재시작하면 사라져도 된다.

결과 — 보존할 게 없었다

두 목록을 맞춰 놓으니 답이 나왔다.

컨테이너 레이어  →  재생성되는 것 + 휘발되는 것
호스트 마운트    →  영속 상태 전부

docker diff 에 잡힌 것 중 보존해야 할 것이 하나도 없었다.

그러면 지웠을 때 무슨 일이 일어나는지도 따라 나온다.

컨테이너를 지운다
새 이미지로 다시 띄운다

호스트 마운트를 읽어 설정을 재생성

같은 인증 기관으로 올라온다

기존 클라이언트 인증서가 그대로 유효

데이터 손실이 0이고 클라이언트 재설정도 필요 없다.

백업 대상은 /etc/ipsec.d 디렉터리 하나로 좁혀졌다. 이미지는 언제든 다시 받으면 되고 설정은 기동할 때 다시 만들어진다.

주의 — 로그가 나가는 경로

로그가 레이어에 쌓이면 이미지가 비대해진다.

docker inspect infra-vpn --format '{{.HostConfig.LogConfig}}'
드라이버: json-file
크기 제한: 10m × 5 회전

json-file 로 호스트에 쌓이고 회전까지 걸려 있어 레이어가 커지지 않는다.

로그가 json-file 로 밖에 남는지는 백업 대상과는 별개 항목이다. 레이어에만 쌓이면 교체할 때 조사할 근거가 함께 사라진다.

판단 기준 — 세 갈래 분류

이 확인 방법을 일반화했다.

docker diff <컨테이>

변경분에서 마운트 경로를 제외하고 남는 것을 셋으로 가른다.

① 재생성되는 것    →  보존 불필요
② 휘발 런타임      →  보존 불필요
③ 그 외           →  보존 대상  ← 이게 있으면 문제

이 있으면 그 컨테이너는 지우면 안 되거나 그것도 마운트로 빼야 한다.

infra-vpn 만 나왔다. 그래서 지우고 다시 띄워도 잃는 것이 없다는 결론이 그 자리에서 나왔다.

재발 방지 — 다른 컨테이너에도 쓰기

같은 판별을 각 컨테이너에 한 번씩 돌리면 실제 보존 대상 목록이 나온다.

컨테이너 A   마운트 하나
컨테이너 B   마운트 둘
컨테이너 C   ③이 있음  ←  문제

C 를 고쳐야 전체가 재생성 가능한 상태가 된다.

이 조사의 요지는 아마 마운트에만 쌓일 것이라고 넘기지 않은 데 있었다. lsdocker diff 둘이면 몇 초에 확인되고 그 답이 컨테이너를 지워도 되는지를 정한다.

정리


Share this post on:

Previous Post
지우고 다시 만드는 중에 멈추면 더 나빠졌다
Next Post
뒤에서 도는 것이 한도를 다 써 버렸다