인증 서버를 컨테이너로 돌리고 있었다. 이미지를 교체해야 하는데 데이터가 이미지 안에 쌓이는지 호스트 마운트에만 쌓이는지가 분명하지 않았다.
Table of contents
Open Table of contents
사전 준비 — 마운트를 봤다
먼저 호스트 마운트에 무엇이 있는지 봤다.
ls -la /etc/ipsec.d/
cert9.db 인증서 DB
key4.db 키 DB
pkcs11.txt
ikev2.conf 설정
passwd
<클라이언트 설정들>
인증 기관 개인키와 서버 인증서와 발급한 클라이언트 인증서가 전부 여기 있었다.
cert9.db 와 key4.db 가 이 서버의 영속 상태다. 이것이 /etc/ipsec.d 쪽에 있다는 것이 확인의 절반이었다.
검증 — 레이어 변경분
컨테이너 안에 무엇이 쌓이는지도 봤다.
docker diff infra-vpn
나온 것을 분류하니 재생성되는 설정이 한 무더기였다.
/etc/ipsec.conf
/etc/ipsec.secrets
/etc/ppp/*
/etc/xl2tpd.conf
ipsec.conf 와 ipsec.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 를 고쳐야 전체가 재생성 가능한 상태가 된다.
이 조사의 요지는 아마 마운트에만 쌓일 것이라고 넘기지 않은 데 있었다. ls 와 docker diff 둘이면 몇 초에 확인되고 그 답이 컨테이너를 지워도 되는지를 정한다.
정리
- 보존 대상은 변경분에서 마운트를 제외하고 남는 것이다
- 남는 것을 재생성과 휘발과 그 외로 분류한다
- 앞의 둘만 있으면 지우고 다시 띄워도 손실이 0이다
- 인증서
DB가 마운트에 있으면 기존 클라이언트가 그대로 유효하다 - 백업 대상이 디렉터리 하나로 좁혀진다
- 무엇을 백업할지 모르면 전부 백업하게 된다
- 로그가 호스트로 빠지고 회전하는지 따로 확인한다
- 이 판별법은 다른 컨테이너에도 그대로 쓴다
- 되돌릴 수 없는 조작 앞에 명령 둘로 확인한다