動手玩Windows 10 Docker(4) - 有關Docker的儲存空間和檔案系統

Windows 10 Docker 是2016年度更新後很大的一個進步但(好像)被很多人忽略沒有話題性

這個系列是我的學習筆記也順便推廣這好用的東西

大家好, 上一篇我們看過基本的Docker網絡是怎樣的

這一篇我們來研究另一個基本元素就是儲存部份, 

Docker在變成一個container的時候就像一個迷你的虛擬機器

它有自己的檔案系統, 通常是Linux的樣子, 例如看看我們的mysql800

他也有bin, etc, home這些典型的Linux系資料夾...也帶有如ping, pwd這些指令檔案

知道這些基本資料, 我來做做練習, 看看我們怎樣把檔案概念放到container裡面運用

要想到運用檔案, 不如就弄個網站看看, 所以需要找一個能架設網站的docker...

我比較熟悉apache這個網頁服務, 還有另一個在Linux比較常用的叫Nginx

在docker hub搜尋了一下..發現第一筆回應eboraas/apache-php還附有php5, 那正好, 就它吧

用來運行一個叫web1的container發佈到host的8001埠上看看

簡單到不行...那不是重點, 我們看到Apache的預設頁面了

它也有說明這個預設頁就放在/var/www/html 裡面, 我們試試看看這個位置

很好啊就如它所說的一樣我們找到了index.html

很多docker裡都做了最小精簡化的動作, 所以很多常用指令都沒有

例如用來編輯檔案的vim工具通常都欠奉, 我們可以自己拿回來

apt-get update

apt-get install vim

得到vim後我想建立一個查看php資訊的phpinfo.php文件, 內容就以下短短幾行

vim phpinfo.php

打完後按Escape離開編輯模式, 鍵入 :wq! 儲存文件離開vim

我們看到phpinfo.php已經建立好了, 再到瀏覽器看看這個檔案

可以看到一些基本資料...例如這是php 5.6版本..php.ini可以到/etc/php5/apache裡更改等等.

OK, 所以第一個建立檔案的方式就是以Linux原生的方式打文字

這在簡單的修改上可以勝任有餘, 但如果我們已經有個網站專案要發佈了

怎樣可以放到這個container裡面呢? Docker for Windows提供了很容易的方法

記得工作列上的小鯨魚嗎? 它的Setting裡有一個地方叫Shared Drives,

可以容許把Host上的某個磁碟機分享給Container使用, 

我把我的C: 磁碟機分享給Container, 容許它們存取資料

​我先在我的C:\DockerApache裡造一個測試用的html文件如下

我們怎樣可以把這個文件放到container裡呢?

第一個方式是複製進去container裡面, 我們可以使用docker cp指令來COPY

docker cp Source_Path Container_Name:Destination_Path

例如要把C:\DockerApache\testing.html放到web1這個container的/var/www/html裡

docker cp C:\DockerApache\testing.html web1:/var/www/html/testing.html

用瀏覽器看看結果, OK沒問題

Docker cp指令也可以從container裡把檔案複製到host上

另一個方式是以docker -v 參數把host上的某個東西直接與container的目的地連結起來

例如我可以告訴docker, /var/www/html 就等於是host上的C:\Dockerapache

這種方式有個好處是你可以在host上有一個源專案, 只要在建立container時設定這個連繫

就能夠讓不同的container存取同一組檔案, 使用案例如我們要在php4,5,6,7,8上測試

我們可以拿不同的php docker版本回來, 瞬間就能做到版本兼容性同步測試,

要用到這個 -v 參數, 例如在docker run階段我們可以這樣建立container

在-v 參數後以冒號":" 把來源和目的地分隔填入, 運行web2這個在host的8002埠發報的Container

docker run --name web2 -p 8002:80 -v C:\DockerApache:/var/www/html/ -d eboraas/apache-php

如我改變C:\DockerApache\testing.html的內容, 這個網站也跟隨轉變

用這種方式把host和container的資料掛載的設定

我們可以用docker inspect來查找出來, 例如docker inspect web2我們可以看到

可以見到來源和目的地的相關設定, 還有一個是RW, 意思是Read Write的意思

如果我們不想一個container可以改變來源的資料, 我們可以在-v 參數的最後加上 :ro (Read Only)

例如建立web3時加上:ro的方式和結果是這樣的

docker run --name web3 -p 8003:80 -v C:\DockerApache:/var/www/html/:ro -d eboraas/apache-php

如果我想用vim去改變testing.html, vim會告訴我這個檔案是Read Only的

強行要寫入也只會得到錯誤訊息

不只是資料夾之間的Binding可以做到, -v這個參數還可以把container裡的某個檔案和host上作聯繫

例如如果container裡有某個log file,你可以選擇以-v方式把他寫入到host的某個檔案上

這樣設定你可以集中處理所有container的Log檔案作資料分析

介紹了Docker的基本檔案儲存方式, 下一篇介紹Docker For Windows獨有的東西!