하나의 인스턴스가 다운되어 이를 다른 인스턴스에서 옮기는 과정에서, docker관련된 모든 것들도 옮기고자 하였다.
1. docker 생성하기
맨 처음 docker 관련된 데이터를 복구할려면 docker가 있어야 하므로, docker를 설치하고자 하였다.
1) 시스템 업데이트
최신 버전을 사용하려면 시스템 패키지를 업데이트를 해야 한다.
sudo apt-get update
sudo apt-get upgrade -y
2) 필요한 종속성 설치
Docker에 필요한 패키지를 설치한다.
sudo apt-get install -y ca-certificates curl gnupg lsb-release
3) Docker의 공식 GPG 키 추가
Docker에 대한 GPG 키를 추가한다.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
4) Docker 저장소 설정
APT 소스에 Docker 저장소를 추가한다.
echo \\
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/ubuntu> \\
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5) 패키지 목록 업데이트
Docker 저장소를 포함하도록 패키지 목록을 업데이트한다.
sudo apt-get update
6) Docker Engine 설치
이제 Docker Engine, Docker CLI, containerd를 설치한다.
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7) Docker 설치 확인
다음을 실행하여 Docker가 올바르게 설치되었는지 확인한다.
sudo docker --version
8) Docker 활성화 및 시작
부팅 시 Docker를 시작하고 서비스를 즉시 시작하도록 설정한다.
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker
9) 루트가 아닌 사용자로 Docker 실행
이 변경 사항이 적용되도록 로그아웃했다가 다시 로그인한다.
sudo usermod -aG docker $USER
오류 해결하기
E: Write error - write (28: No space left on device)
E: IO Error saving source cache
E: The package lists or status file could not be parsed or opened.
내 경우에 docker를 설치하다가 오류가 났다. tar file을 미리 옮겼는데, 해당 파일이 용량이 높아 docker를 깔기에 용량이 부족해서 오류가 났다.
df -h
해당 명령어를 쳐서 용량이 어느 정도되는지 확인해주었다. 그래서 루트 볼륨을 높여주고 다시 실행하니 해결되었다.
2. docker 볼륨 백업하기
1) docker run 사용하기
docker run --rm \\
-v my_volume:/volume \\
-v $(pwd):/backup \\
ubuntu tar cvf /backup/backup.tar /volume
- --rm: 컨테이너 종료 시 컨테이너를 삭제하는 옵션이다.
- - v my_volume:/volume: 백업하고자 하는 my_volume을 컨테이너와 마운트하는 옵션이다.
- - v $(pwd):/backup: $(pwd)는 bash에서 현재 디렉토리를 가져오는 명령어이다. 즉, 현재 디렉토리/backup와 컨테이너에서 백업할 디렉토리를 마운트하는 옵션이다.
- ubuntu: Docker 컨테이너 생성 시 ubuntu라는 이미지를 가지고 컨테이너를 생성한다.
- tar cvf /backup/backup.tar /volume: 실제 컨테이너 내부에서 실행시킬 명령어이다. tar 명령어는 파일 압축을 위한 명령어이다.
2) tar 명령어를 이용한 백업
# 데이터 저장 경로 확인
docker volume inspect my_volume
# 경로 확인 후 백업
tar cvf backup.tar -C /var/lib/docker/volumes/my_volume/_data .
3. docker 볼륨 복구하기
1) docker run로 복구하기
docker run --rm \\
-v my_volume:/volume \\
-v $(pwd):/backup \\
ubuntu tar xvf /backup/backup.tar -C /volume
2) tar 명령어로 복구하기
tar xvf backup.tar -C /var/lib/docker/volumes/my_volume/_data
4. tar 파일로 docker image 생성하기
나는 두 개의 tar 파일 존재한다. 하나는 docker container, 하나는 데이터관련된 파일이다.
1) tar 파일 load하기
docker load -i <tar 파일 이름>.tar
docker images
tar파일로 docker image를 묶어줬으니, 이를 풀면 docker images가 로드되는 것을 확인할 수 있다. docker images쳐서 확인하면 위와 같은 image를 확인할 수 있다. 여기서 로드되는 것은 docker container관련된 파일을 load해준 것이다.
2) tar 파일로 데이터 복구하기
docker volume create mariadb-volume
도커 볼륨을 생성해준다.
tar xvf ./backup_useTar.tar -C /var/lib/docker/volumes/mariadb-volume/_data
그리고 생성된 도커 볼륨에 다른 하나의 tar파일을 써서 데이터를 복구해준다.
3) docker container 생성하기
docker run -p 3306:3306 --name <도커 컨테이너이름> -e MARIADB_ROOT_PASSWORD=<db패스워드> -v <docker볼륨이름>:/var/lib/mysql -d <이미지이름>
위와 같이 command를 쳐서 3306으로 돌아가는 mariadb의 docker container를 생성해준다.
4) docker volume이 제대로 docker container에 붙었는지 확인하기
docker exec -it mariadb-con mariadb -u root -p
위와 같이 내가 쓰던 테이블이 있으면 제대로 붙은 것을 확인할 수 있다.
오류관련)
처음에 안 붙은지 알고 헤맸던게 내가 mariadb를 사용해서
docker run -p 3306:3306 --name mariadb-con -e MARIADB_ROOT_PASSWORD=my-secret-pw -v mariadb-volume:/var/lib/maria -d mariadb
이렇게 써줬는데 제대로 안 붙었다.
체크사항
1) 추출된 데이터 확인하기
ls -l /var/lib/docker/volumes/mariadb-volume/_data
내가 tar파일을 복구할 때 지정했던 path에 데이터가 있는지 확인한다.
권한이 올바르지 않으면 db에서 데이터를 못 읽을 수 있다. 제대로 된 권한이 있는지 확인해준다.
sudo chmod -R 755 /var/lib/docker/volumes/mariadb-volume/_data
그래서 tar파일에 데이터가 제대로 안 넣어졌나 했는데, 명령어를 사용해서 데이터를 복구할 때 데이터베이스의 테이블이름이 나오면서 해당 파일 ibd파일이 보였다. 그러면 제대로 데이터가 복구된게 맞았다.
2) 데이터 위치 확인하기
내 경우 /var/lib/maria로 지정해서 마운트하고 있다. 그런데 일반적으로 mariadb는 /var/lib/mysql 지정되어 마운트되기를 바란다. 그래서 이로 path를 수정해준다.
docker run -p 3306:3306 --name mariadb-con -e MARIADB_ROOT_PASSWORD=my-secret-pw -v mariadb-volume:/var/lib/mysql -d mariadb
그래서 기존에 있던 docker를 삭제하고 다시 위와 같이 작성하여 마운트해줬다. 그랬더니 데이터를 제대로 읽는 것을 확인할 수 있었다.