Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
Docker image 파일을 다양한 방법으로 백업해 보자.
1. Docker Hub에 public한 백업
2. VM의 저장소에 SCP로 백업(private)
3. Docker Registry container에 private한 백업
image들을 백업하는 방식도 있지만, -v 옵션으로 특정 경로의 데이터만 마운트 시켜서 저장하는 방식도 백업에 일종으로 볼 수 있다.
컨테이너는 외부에 데이터를 저장하고 컨테이너는 그 자체로 동작하는 stateless 설계가 매우 바람직하다. 따라서 전체 Image가 아닌 데이터만 따로 백업하는 방식이 효율적일 수 있다.
어떤 상황에서 어떤 전략이 최선일지 판단하기 위해 서로 간의 차이를 명확히 알아두는 것이 중요하다.
1. Docker Hub에 public한 백업
이전 게시글을 참조하자.
Docker Hub에 Docker Image 업로드하기
장점
- 별도의 저장소 관리 없이도 인터넷 연결만 있으면 Image를 관리 가능.
- 유료 사용 시 private Repository를 통해 외부에 Image를 노출하지 않을 수 있다.
- 오픈소스 이미지라면 편리하게 외부에 공개 업로드 가능.
단점
- 퍼블릭 인터넷과 연결이 되지 않는 환경에서는 사용할 수 없다.
- Private Repository는 유료 사용이 필수적
2. SCP로 파일 전송 백업
다른 PC의 VM에 새로 마운트 한 디스크 폴더에 SCP로 Image 파일 자체를 전송해서 백업하자.
Virtual Box에서 VM의 Image 저장용 하드 디스크 용량을 추가로 mount 시켜서 저장 용량을 늘려보자.
만들기를 누르자.
VDI를 선택
가상 하드 디스크
VDI, VHD, VMDK는 가상머신을 실행하기 위해 가상 하드 디스크를 만들 때 사용되는 서로 다른 형식이다.
1. VDI (VirtualBox Disk Image)
- Oracle VirtualBox에서 사용되는 기본 가상 하드 디스크 형식입니다.
- VDI 형식은 VirtualBox의 기본 디스크 형식으로 사용자가 가상 하드 디스크를 만들 때 기본적으로 선택됩니다.
- 다양한 압축 및 동적 할당 옵션을 제공하여 디스크 공간을 효율적으로 관리할 수 있습니다.
2. VHD (Virtual Hard Disk)
- Microsoft의 Hyper-V와 Virtual PC에서 사용되는 가상 하드 디스크 형식입니다.
- VHD는 다양한 운영 체제와 가상화 솔루션에서 지원되므로 여러 플랫폼 간에 호환성을 제공합니다.
- Hyper-V나 Virtual PC에서 생성된 VHD 파일은 VirtualBox에서도 사용할 수 있습니다.
3. VMDK (Virtual Machine Disk)
- VMware에서 사용되는 가상 하드 디스크 형식입니다.
- VMDK 형식은 VMware 가상화 솔루션 (예: VMware Workstation, VMware Fusion, VMware ESXi 등)에서 사용되는 표준 형식입니다.
- VMware의 가상화 솔루션에서 생성된 VMDK 파일은 VirtualBox에서도 사용할 수 있습니다.
우리는 Virtual Box를 사용하므로 VDI로 만든다.
미리 디스크 크기 세팅해 주자.
25GB에서 부족해지기 시작했으므로 50GB로 만들어 준다.
생성에 시간이 좀 걸린다.
생성이 되면 not Attached인 디스크로 확인이 된다.
이것을 추가시켜 준다.
가상 하드 디스크 마운트하기
sudo fdisk -l로 확인하면 새로운 disk인 /dev/sdb가 보인다.
df(disk free) 명령어
Df -h로 확인해 보면, /dev/sdb가 보이지 않는다.
즉, 아직 사용되지 않다는 것이다.
df(disk free) 명령어는 디스크 여유 공간을 확인하는 데 사용되는 유닉스 및 리눅스 명령이다. 'df'는 'disk free'의 약자이다. 이 명령어는 시스템의 마운트 된 파일 시스템에 대한 정보를 표시하여 각 파일 시스템의 사용 가능한 공간, 사용 중인 공간, 총 공간 등을 보여준다.
지금부터 해당 디스크를 포맷한다.
fdisk /dev/sdb #disk format 명령어
m으로 메뉴를 확인해 본다.
n (new partition을 추가)를 입력
아래와 같이 생성해 준다.
W (write table to disk)
fdisk -l로 확인하면, /dev/sdb1이 생성된 것이 확인된다.
mkfs.ext4 /dev/sdb1로 포맷 진행
Mkdir storage로 mount 할 폴더 생성
mount -t ext4 /dev/sdb1 /storage #/dev/sdb1를 ext4 포맷으로 /storgage 경로로 마운트
df -h로 확인해 보면 /dev/sdb1가 /storage로 마운트 됨.
즉, /storage의 폴더 내에서의 작업이 새로운 가상 하드 디스크에서의 작업이 된다.
외부에서도 접근 가능한 작업 폴더 생성
이제 누구나 사용할 수 있는 Image 저장 폴더를 만들어주자.
mkdir /storage/image
chmod 777 / storage/image
모두에게 rwx 권한
누구나 쓸 수 있는 폴더 생성
docker image를 하나의 파일로 만들어 전송
docker save 이미지명 > 파일명.tar #이미지 관련 파일들을 하나의 파일로 만든다.
docker save everenew/nginx > /storage/image/everenew.tar
새로 마운트한 폴더에 저장시켰다.
Scp로 상대 VM에 준비된 마운트 폴더에 전송하자.
scp <source_path> <username>@<ip>:<dest_path>
scp /storage/image/everenew.tar user@상대 pc ip:/Path/everenew.tar
상대에게 전송 완료
tar 파일을 이미지로 복구
가져온 후에는 아래의 load 명령어로 로드하면 된다.
docker load -i 파일명.tar
Image 전송 저장의 장단점
장점
- 인터넷과 연결되지 않는 내부망에서도 Image 관리용도로 사용가능
단점
- 변경된 Layer 단위가 아니라, 전체 Image로 저장하므로 저장 용량의 비효율성
- 각 Image를 저장할 폴더를 서로 약속해 두어야 하므로 관리에 제약 존재
3. Docker Private(local) Registry 로 백업
Image를 관리해 주는 Registry 이미지를 사용해서 백업해 보자.
명령어로 바로 다운로드 후 실행.
docker run --name private-repo -d -p 5000:5000 registry
5000번 포트 리스닝 확인
netstat -anp | grep 5000 | grep LIST
/etc/docker/daemon.json 파일을 없다면 생성하여 아래의 json 파일을 만든다.
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m" #로그파일의 최대 크기
},
"storage-driver": "overlay2",
"insecure-registries" :[
"localhost:5000" #자신의 ip의 5000번 port 접속허용
]
}
도커 tag를 통해 image의 이름이 localhost:5000를 포함하게 만든다.
docker tag everenew/nginx localhost:5000/myrepo/nginx_demo:1.0
nginx_demo:1.0가 image의 이름이 되고 그 앞에 붙은
localhost:5000/myrepo 가 image를 전송할 경로가 된다.
# 이미지를 push 하면 설정된 경로로 자동으로 전송된다.
#여기서는 localhost의 5000번 포트이므로 동작 중인 Registry 컨테이너에 전송된다.
docker push localhost:5000/myrepo/nginx_demo:1.0
이미지를 삭제하고 받아와 보자.
여기서는 localhost:5000/myrepo 가 image를 받아올 경로가 된다.
docker pull localhost:5000/myrepo/nginx_demo:1.0
lacal에서 받아와 진다.
참조: https://choco-life.tistory.com/53
저장 방식 확인
Registry 컨테이너가 마운트 된 경로를 확인해 보자.
docker inspect private-repo
도커의 볼륨 폴더로 접근해서,
데이터가 어떻게 저장되었는지 확인해 보자
_data/docker/registry/v2/repositories에 myrepo라는 폴더가 생겼고, 이 안에 nginx_demo 이미지가 업로드되어 있다.
레이어들의 정보가 _layer에 저장이 되어 있다.
따라서 필요한 layer만 뽑아서 쓸 수도 있다.
서버로 Image 업로드/다운도르
로컬에서만 사용하는 것은 백업 서버로의 의미가 없다.
따라서 상대의 VM에서, 현재 동작중인 Registry 컨테이너로 image를 전송하거나 다운로드하여 오자.
동작 중인 5000번 포트를 포트포워딩
/etc/docker/daemon.json 파일 세팅
"insecure-registries" :[
"<상대의 IP>:5000" #접속을 허용할 상대의 ip를 세팅
]
적용 후 재시작.
Systemctl restart docker
docker push <Registry server IP>:5000/<경로>/<이미지 이름>:<tag>
상대의 pc에서 업로드 성공
반대로 다운로드도 가능하다.
장단점
장점
- 인터넷과 연결되지 않는 내부망에서도 Image 관리용도로 사용가능
- 컨테이너가 Image 저장 방식을 관리해 줌으로써 관리에 편리
- Layer 단위의 저장으로 저장 용량의 효율성 증대
단점
- Volume 혹은 bind Mount 세팅으로 Host OS에서 데이터 저장하지 않을 시, Image 데이터들이 날아갈 수 있음.
'개발 > Docker' 카테고리의 다른 글
Docker로 구현하는 3-Tier 웹 서비스 (0) | 2024.03.01 |
---|---|
WordPress로 Docker 2tier 구현하기 (with DNS) (0) | 2024.03.01 |
Docker container storage (docker run -v), 볼륨과 마운트 차이 (0) | 2024.02.28 |
Docker Hub에 Docker Image 업로드하기 (0) | 2024.02.28 |
Ubuntu Docker DNS 컨테이너 올리기 (forwaders 사용) (3) | 2024.02.28 |