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獨有的東西!