目錄
- 案例compose
- 前言
- 結(jié)果
- 概念理解
- tips
- 總結(jié)
案例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
前言
數(shù)據(jù)卷的掛載,是從host到container的,相當(dāng)于linux系統(tǒng)中將host文件夾掛載在container的指定目錄下,若掛載位置有文件/文件夾,則原文件夾隱藏,unmount后原文件夾恢復(fù)。
結(jié)果
概念理解
- 宿主機(jī)目錄對(duì)應(yīng)的物理儲(chǔ)存地址被容器和宿主機(jī)操作系統(tǒng)同時(shí)管理。
- 宿主機(jī)目錄可以看成一個(gè)硬盤被掛載在容器目錄下
- 宿主機(jī)的目錄和容器的目錄可以看成兩個(gè)指針指向同一個(gè)物理地址
- 非空容器目錄為什么不行?數(shù)據(jù)卷的意義在于數(shù)據(jù)持久化,將應(yīng)用數(shù)據(jù)分離,因此數(shù)據(jù)在宿主機(jī),若容器目錄非空,會(huì)造成邏輯沖突,也就是怎樣去同步宿主機(jī)目錄和容器目錄,解決兩邊文件的差異。因此只能掛載在容器中的空目錄下。
tips
- 若掛載的是目錄,容器目錄要為空目錄
- 若容器目錄不存在,也可以掛載會(huì)自動(dòng)創(chuàng)建
- volumes基本規(guī)則->*文件夾:文件夾;文件:文件
只要指定目錄掛載就會(huì)刪除容器內(nèi)的同名文件夾,例如:將mysql的配置目錄映射出容器,就會(huì)被代替為宿主機(jī)的對(duì)應(yīng)文件夾內(nèi)容,無法在compose層面將原本的配置文件copy到宿主機(jī)。但是目前,docker-
compose不支持類似docker cp的功能將容器內(nèi)的文件復(fù)制到宿主機(jī)。
可以參考github上官方的提問:https://github.com/docker/compose/issues/5523
以及Stack Overflow上的提問:https://stackoverflow.com/questions/39176561/copying-files-to-a-container-with-docker-compose
想要將容器內(nèi)文件復(fù)制出容器的解決的方法只有通過手動(dòng)或腳本執(zhí)行docker cp。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持。