【Docker】备份Docker镜像image、容器container、数据volume
文章目錄
- 鏡像image備份
- 容器container備份
- 數據卷volume
- 基本操作
- 數據卷備份
- reference
本意上想要了解一下 Docker 容器中 Volume 的備份,畢竟重要的數據都在 Volume 中。然后順帶看了一下 Docker 鏡像,容器的備份,不過鏡像和容器托管到 Docker Hub 上也算是備份了。
Volume 可以叫做 數據卷,可供一個或者多個容器使用:
- 數據卷 可以在容器之間共享和重用
- 對 數據卷 的修改會立馬生效
- 對 數據卷 的更新,不會影響鏡像
- 數據卷 默認會一直存在,即使容器被刪除
鏡像image備份
這里說的備份指的是
- 直接從本地備份鏡像文件,可以使用 docker save 命令將鏡像打包成 tar 文件,
- 之后可以使用 docker load 命令來恢復。
容器container備份
備份容器有不同的方法:
- 通過 [docker commit] 命令來提交一個基于當前容器狀態的新鏡像
- 使用 [docker export] 命令來將容器導出到系統文件并壓縮成 tar,之后可以根據該 tar 文件使用 docker import 來創建新的鏡像
需要注意的是所有的命令都只會備份容器 layered file system ,不包括 掛載的數據卷 Volumes
數據卷volume
基本操作
Docker user guide 中有非常詳細的知道,如何備份數據卷,這樣就可以在新容器啟動時使用備份好的數據。當備份 data volume 時,需要先關閉容器。
docker volume create my-vol # 創建數據卷docker volume ls # 查看所有數據卷docker volume inspect my-vol # 查看指定數據卷內容docker run -d -P \--name web \# -v my-vol:/wepapp \--mount source=my-vol,target=/webapp \training/webapp \python app.py # 啟動并掛載一個數據卷 使用 `--mount`docker inspect web # 查看容器中 mount 信息docker volume rm my-vol # 移除數據卷數據卷 是
- 被設計用來持久化數據的,
- 它的生命周期獨立于容器,Docker 不會在容器被刪除后自動刪除 數據卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷。
- 如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 docker rm -v這個命令。
- 無主(dangling)的數據卷可能會占據很多空間,要清理請使用以下命令docker volume prune
數據卷備份
比如在 docker compose 中定義了 volumes
volumes:db_data:那么在啟動 docker compose 之后會生成一個 DOCKER_COMPOSE_NAME 加上 VOLUME_NAME 的容器卷
[DOCKER_COMPOSE_NAME]_[VOLUME_NAME]那么可以使用下面的命令來備份數據卷:
docker run --rm \ --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \alpine \tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA]看清楚其中的臨時 DATA 目錄和 臨時備份目錄,執行該命令之后,在當前文件夾下就會產生 BACKUP_FILENAME.tar 這樣的文件,里面包含數據卷中的內容。
那么就能夠使用該命令來恢復數據卷數據
docker run --rm \ --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \--volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \alpine \tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1如果是數據庫容器,比如 mysql 容器,備份數據可以使用如下方式
docker exec [CONTAINER_NAME] /usr/bin/mysqldump -u root --password=root [DATABASE] > backup.sql然后使用下面的命令來恢復
cat backup.sql | docker exec -i [CONTAINER_NAME] /usr/bin/mysql -u root --password=root [DATABASE]對于 docker compose 啟動的多個容器,可能因為宿主機器變化而導致 docker 容器的id有變化,可能在回復數據之后,還需要對數據庫連接的地址進行修改才能完整的恢復。
reference
- https://stackoverflow.com/a/26339848/1820217
- https://stackoverflow.com/a/39125414/1820217
- https://gist.github.com/spalladino/6d981f7b33f6e0afe6bb
總結
以上是生活随笔為你收集整理的【Docker】备份Docker镜像image、容器container、数据volume的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Web】让你的web页面滚动更有趣
- 下一篇: 【Laravel】增加日志记录