目錄
- 案例compose
- 前言
- 結果
- 概念理解
- tips
- 總結
案例compose
# add this file # default MySQL root password is 123456 version: '3.1' services: mysql: image: mysql:5.7 container_name: mysql_5.7 restart: always ports: - 3305:3306 volumes: - ./mysql_config/conf.d:/etc/mysql/conf.d - ./mysql_data:/var/lib/mysql - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: 123456
前言
數據卷的掛載,是從host到container的,相當于linux系統中將host文件夾掛載在container的指定目錄下,若掛載位置有文件/文件夾,則原文件夾隱藏,unmount后原文件夾恢復。
結果
概念理解
- 宿主機目錄對應的物理儲存地址被容器和宿主機操作系統同時管理。
- 宿主機目錄可以看成一個硬盤被掛載在容器目錄下
- 宿主機的目錄和容器的目錄可以看成兩個指針指向同一個物理地址
- 非空容器目錄為什么不行?數據卷的意義在于數據持久化,將應用數據分離,因此數據在宿主機,若容器目錄非空,會造成邏輯沖突,也就是怎樣去同步宿主機目錄和容器目錄,解決兩邊文件的差異。因此只能掛載在容器中的空目錄下。
tips
- 若掛載的是目錄,容器目錄要為空目錄
- 若容器目錄不存在,也可以掛載會自動創建
- volumes基本規則->*文件夾:文件夾;文件:文件
只要指定目錄掛載就會刪除容器內的同名文件夾,例如:將mysql的配置目錄映射出容器,就會被代替為宿主機的對應文件夾內容,無法在compose層面將原本的配置文件copy到宿主機。但是目前,docker-
compose不支持類似docker cp的功能將容器內的文件復制到宿主機。
可以參考github上官方的提問:https://github.com/docker/compose/issues/5523
以及Stack Overflow上的提問:https://stackoverflow.com/questions/39176561/copying-files-to-a-container-with-docker-compose
想要將容器內文件復制出容器的解決的方法只有通過手動或腳本執行docker cp。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持。