2015-11-06 93 views
10

在Macbook Pro筆記本電腦上運行並運行docker-machine(0.5.0)docker-compose(1.5.0)讓我的容器運行。Mac上的Docker Machine:在Docker主機/ docker-machine上無法看到已安裝的卷?卷的物理存儲位置在哪裏?

這意味着我使用docker-machine來創建我的virtualbox boot2docker驅動的HOST機器,它將運行我的docker守護進程並託管所有容器。

我想我錯過了關於HOSTS和VOLUME的概念,因爲它們涉及到Docker和文檔。

這是我的搬運工,compose.yml文件(網頁簡單地構建PHP:5.6 - 阿帕奇圖像):

web: 
    restart: "always" 
    build: ./docker-containers/web 
    ports: 
    - "8080:80" 
    volumes: 
    - ./src:/var/www/html 
    links: 
    - mysql:mysql 

mysql: 
    restart: "always" 
    image: mysql:5.7 
    volumes_from: 
    - data 
    ports: 
    - "3306:3306" 
    environment: 
    - MYSQL_ROOT_PASSWORD=XXX 

data: 
    restart: "no" 
    image: mysql:5.7 
    volumes: 
    - /var/lib/mysql 
    command: "true" 
的卷

泊塢撰寫文件機制的文檔是在這裏:http://docs.docker.com/compose/compose-file/

它指出了卷 - 將路徑裝載爲卷,可選地指定主機上的路徑(HOST:CONTAINER)或訪問模式(HOST:CONTAINER:ro)。

在這種情況下的HOST是指我的VM由docker-machine創建,對嗎?或者我的本地macbook文件系統?將虛擬機上的路徑安裝到容器上?

網絡我宣佈:

volumes: 
    - ./src:/var/www/html 

,這是我的映射本地的MacBook文件系統./src文件夾,我的MacBook Pro到我的Web容器。如果我的理解是正確的,不應該映射我的VM/var/www/html內的web容器內的./src文件夾?!從理論上講,我認爲我應該首先將我的本地mac文件系統文件夾./src複製到我的虛擬機,然後執行此卷聲明。看起來碼頭撰寫者是神奇地一次完成這一切,但? 困惑

最後,我們可以看到,我正在創建一個數據專用容器來保存我的mysql數據。我已經聲明:

volumes: 
    - /var/lib/mysql 

不應該這樣對我的HOST boot2docker VM創建在/ var/lib中/ MySQL的文件夾,然後我可以導航到該文件夾​​的VM,是/否?當我使用docker-machine ssh進入我的機器,然後導航到/var/lib,有沒有 mysql文件夾?爲什麼它沒有被創建?我的配置有問題嗎? :/

在此先感謝!任何解釋我在這裏做錯了將不勝感激!

+0

是否http://stackoverflow.com/questions/23439126/how-to-mount-host-directory-in-docker-container/33404132#33404132回答你的問題? – Eli

回答

10

好吧有幾點需要在這裏解決。

讓我們從Docker卷的開始(嘗試在此時不考慮您的macbook或流浪機器。只是要銘記一個事實,即碼頭工人使用不同的文件系統,在以往任何時候,也可以駐留在這一點上): 也許想象這樣的,本身並在泊塢每個卷只是一個內部文件系統搬運工人使用的一部分。 容器可以用論文卷,像他們的「小磁碟機」可以通過它們在同一時間進行安裝和也分享他們之間(或安裝由他們兩個,像安裝一些FTP服務器的超快速的版本兩個客戶或任何:P)。

原則上可以聲明它們的體積(還沒有考慮你的電腦/遊民本身,僅僅是碼頭工人;))通過Dockerfile的VOLUME指令。 標準的例子,運行一個Web服務器容器,像這樣:

FROM: nginx 
VOLUME /www 

是進入/ WWW現在一切都在理論上可以安裝並從容器中卸載並安裝多個容器。 現在只有Nginx很無聊,所以我們希望讓php運行nginx存儲的文件來產生更多有趣的內容。 =>我們需要將該卷掛載到一些php-fpm容器中。 人機工程學在我們撰寫的文件,我們會做到這一點

web: 
    image: nginx 
php: 
    image: php-fpm 
    volumes_from: 
    - web 

=>瞧!每個由nginx/web容器中的VOLUME指令聲明的文件夾都將在php中可見。這裏要注意的重要一點是,無論是在nginx的/ www中,都將覆蓋php在/ www中的任何內容。 如果你把:RO,PHP甚至不能寫入該文件夾:)

現在接近你的問題,還有第二種方法來聲明卷,這不需要在Dockerfile中聲明它們。這可以通過安裝來自主機的捲來完成(在這種情況下,你的流浪者/ boo2docker thingy)。讓我們先討論一下,就好像我們先在本地Linux上運行一樣。

如果你把一樣的東西:

volumes: 
- /home/myuser/folder:/folder 
在泊塢窗,compose.yml

,那麼這將意味着/家/ myuser的/文件夾現在將安裝到泊塢窗。它將覆蓋docker在/文件夾中的任何內容,就像/ www也可以從聲明它的東西中訪問。現在Docker守護進程正在運行的Linux機器上。

這麼多的理論:),其實你可能只需要以下建議讓你的東西去:):

方式boot2docker /泊塢窗機/ kitematic,這些東西處理這個問題簡單地說,他們首先在流浪者機器上將容積安裝到碼頭集裝箱,並且他們也簡單地將這個東西安裝到您的Mac文件系統中,希望它能全部解決:P

現在爲了實際在Mac上,我們所有人都使用這種方式(或者僅僅試圖幫助他們的同事進入甜蜜的可愛Docker:P的世界)。我的意思是想它(root或其他一些用戶處理容器文件,用戶流浪漢在遊民主機和可能處理文件,那麼你的Mac用戶「skalfyfan」處理這些文件在Mac上都擁有不同的用戶ID和諸如此類的東西= >許多問題隨之而來了,並且一定程度上取決於你實際上在泊塢窗,MySQL和Apache上運行什麼是特別痛苦的,因爲他們不作爲根容器內運行。這意味着,兩人經常鬧寫入Mac文件系統。

嘗試第二種方法下面,簡單地嘗試把你的集裝箱量你的Mac主目錄下之前,這將在大多數情況下,解決問題與MySQL,因爲我發現隨着時間的推移。 Btw:無需聲明卷的完整路徑./folder很好,並且相對於docker-compose.yml所在的位置進行了讀取!

只需將compose-yml放入Mac用戶文件夾中,這就是最重要的。沒有chmod 777 -R:P會幫助你,只需要在你的home文件夾下:)

還有一些應用程序(例如Apache)仍然會給你一個難題。無論在容器中運行的用戶標識與Mac用戶標識的不同,都會使你的生活變得糟糕。爲了解決這個問題,您需要以不與您的Mac權限衝突的方式來調整用戶ID以及用戶組。該工程將是例如1000 你想在Mac上爲員工的集團,一個UID因此,你可以在你的Dockerfile年底把這個:

RUN usermod -u 1000 www-data 
RUN usermod -G staff www-data 

RUN usermod -u 1000 mysql 
RUN usermod -G staff mysql 

因此,作爲現在你已經學會:

從理論上講,我認爲我應該被要求先複製我的本地Mac文件 系統文件夾./src到我的虛擬機,然後我做這個量 宣言。看起來碼頭作曲家奇蹟般的做到了 ,但是呢?

對上,它確實是:)

最後,我們可以看到,我創建一個唯一的數據容器堅持 我的MySQL數據。我已經聲明: 卷: - 在/ var/lib中/ MySQL的

這一個你有錯了:)至於解釋的,如果你不給主機的文件夾,然後泊塢窗將持續這條道路。但只有這個容器和所有將保留在碼頭文件系統中。根本沒有東西寫入主機!如果您在容器文件夾之前放置一個主文件夾,這將只會發生!

希望這有助於:)

+0

感謝您的解釋!關於你最後的評論,如果我在撰寫文章時沒有給出一個主機文件夾,你說*,那麼Doc​​ker將堅持這條路徑。*你能否闡明* Docker *在容器中堅持路徑的含義?如果停止,重新啓動它將保留數據?數據只會在容器被刪除時丟失?這是什麼意思* Docker只在容器中保存路徑?* –

+0

是的:停止很好,你重新啓動,數據仍然存在。 刪除=>數據量也不見了。 這裏的重要提示: 音量仍然存在,但您無法訪問,並且會污染您的hd => 使用-v標誌刪除容器:) –

+0

最後一個問題!在我的「data」(data-only)容器中,我將它改爲:* volumes: -/var/test/mysql:/ var/lib/mysql *,然後運行* docker-compose build,docker-compose up -d *重建所有內容。我預計現在看到HOST虛擬機上的/ var/test/mysql,但仍然沒有? * head scratch *我現在注意到的一件事是,當我將SSH連接到我的虛擬機和* docker ps *以查看所有正在運行的容器時,即使正在創建,數據容器也無處可見。也許這是另一個教程壽:)謝謝! –