docker volume === (last update:2021/11/12) ## Docker volume ![](https://docs.docker.com/storage/images/types-of-mounts.png) ### 原理 * 資料在容器中,當容器消失時,資料會不見,因此要讓資料永久保存下來 * 資料永久保存在主機硬碟中,當容器在其它機器上部署時,資料無法轉移 * 資料庫的資料在生產環境和開發環境不一樣,但又想要有共用位置 ### volume(資料卷) * 由docker本身控管,是一個獨立的資料存放處 * 使用`docker volume`管理 * 和容器無關,容器停止後仍然存在 * 可讓多個容器都連上同一個資料卷 ### 資料卷使用時機 * 多容器共享 * 當主機系統不保證有對應的檔案結構(如Linux換成Windows) * 方便備份 * 可以把資料卷設定在雲端儲存上 ### bind mount * 將容器中的某一目錄或檔案對應到主機上的某一目錄或檔案 * 如果檔案需要常常使用主機上的應用程式修改,則使用這個 * 通常在容器中執行服務的常變動檔案會用這個方法寫出來 * 移機較麻煩 * 在佈署時,通常會將整個目錄複製到容器的映像檔中 ### bind mount使用時機 * 分享設定檔 * 分享主程式 * 性能較好 * 在確定不同主機之間的檔案結構一樣時,可以用這個 ## 操作 **建立資料卷** ```shell= (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:~/ $ ``` **啟動一個容並且對應到這個資料卷** ```shell= docker run -d \ --name devtest \ --mount source=test_volume,target=/app \ nginx:latest ``` ```shell= docker run -d \ --name devtest \ -v test_volume:/app \ nginx:latest ``` 直接從容器建立一個資料卷 ```shell= (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:~/ $ ``` ```shell= (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:~/ $ ``` ```shell= docker run -d \ --name=nginxtest \ -v nginx-vol:/usr/share/nginx/html \ nginx:latest ``` **備份資料卷到主機** ```shell= docker run --rm -v test_volume:/app -v $PWD:/backup ubuntu tar cvf /backup/backup.tar /app ``` ###### tags: `容器`, `docker`