docker volume

(last update:2021/11/12)

Docker volume

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

原理

  • 資料在容器中,當容器消失時,資料會不見,因此要讓資料永久保存下來
  • 資料永久保存在主機硬碟中,當容器在其它機器上部署時,資料無法轉移
  • 資料庫的資料在生產環境和開發環境不一樣,但又想要有共用位置

volume(資料卷)

  • 由docker本身控管,是一個獨立的資料存放處
  • 使用docker volume管理
  • 和容器無關,容器停止後仍然存在
  • 可讓多個容器都連上同一個資料卷

資料卷使用時機

  • 多容器共享
  • 當主機系統不保證有對應的檔案結構(如Linux換成Windows)
  • 方便備份
  • 可以把資料卷設定在雲端儲存上

bind mount

  • 將容器中的某一目錄或檔案對應到主機上的某一目錄或檔案
  • 如果檔案需要常常使用主機上的應用程式修改,則使用這個
  • 通常在容器中執行服務的常變動檔案會用這個方法寫出來
  • 移機較麻煩
  • 在佈署時,通常會將整個目錄複製到容器的映像檔中

bind mount使用時機

  • 分享設定檔
  • 分享主程式
  • 性能較好
  • 在確定不同主機之間的檔案結構一樣時,可以用這個

操作

建立資料卷

(joshhuAI)joshhu:~/ $ docker volume ls [1:21:32] DRIVER VOLUME NAME (joshhuAI)joshhu:~/ $ docker volume create test_volume [1:21:40] test_volume (joshhuAI)joshhu:~/ $ docker volume ls [1:21:49] DRIVER VOLUME NAME local test_volume (joshhuAI)joshhu:~/ $

啟動一個容並且對應到這個資料卷

docker run -d \ --name devtest \ --mount source=test_volume,target=/app \ nginx:latest
docker run -d \ --name devtest \ -v test_volume:/app \ nginx:latest

直接從容器建立一個資料卷

(joshhuAI)joshhu:~/ $ docker volume ls [1:16:45] DRIVER VOLUME NAME (joshhuAI)joshhu:~/ $ docker run -d \ [1:16:49] > --name=nginxtest \ > --mount source=nginx-vol,destination=/usr/share/nginx/html \ > nginx:latest d30f16f38dff55a56d724daa921d9c348f4229d219d81f863227e6677bdf1059 (joshhuAI)joshhu:~/ $ docker volume ls [1:17:05] DRIVER VOLUME NAME local nginx-vol (joshhuAI)joshhu:~/ $
(joshhuAI)joshhu:~/ $ docker run --rm -v volumetest:/app centos [1:19:24] (joshhuAI)joshhu:~/ $ docker volume ls [1:19:47] DRIVER VOLUME NAME local volumetest (joshhuAI)joshhu:~/ $
docker run -d \ --name=nginxtest \ -v nginx-vol:/usr/share/nginx/html \ nginx:latest

備份資料卷到主機

docker run --rm -v test_volume:/app -v $PWD:/backup ubuntu tar cvf /backup/backup.tar /app
tags: 容器, docker