2017年7月12日 星期三

跟同學交換 ethercalc 容器, 馬上理解 docker 的 volume、 port、 link

Ethercalc 是一個類似 google sheet 的共筆試算表服務。 (作者是數位政委唐鳳!) 除了 公用版 之外, 你也可以自己架設在私有雲裡。 最簡單偷懶的架設方法就用 docker。 電腦教室裡坐在隔壁的兩位 docker 新手, 還可以透過 「把我所架設的服務拿出來跟同學交換」 來學習 docker 的 -v (指定 volume 對應關係, 也就是與 host 共用某個目錄)、 -p (指定 port, 也就是通訊埠轉發)、 --link (建立 docker 之間的連結), 動手實作馬上比爬文更有感!

redis-amy、 ecalc-amy 跟 host 之間, 如何用
--link、 -v、 -p 接起來 -- 就像拼積木一樣 以下假設下指令的同學的是 Amy。 Ethercalc 需要用到 redis 資料庫, 所以每位同學需要跑兩個 docker instances。 假設我們想叫 redis 資料庫把檔案放在 host 的 /var/lib/redis-amy 底下。 (不需要事先手動建立。) 安裝並啟用 ethercalc 只需要兩步:

docker run --name redis-amy -d -v /var/lib/redis-amy:/data redis redis-server --appendonly yes
docker run --name ecalc-amy -d -p 6500:8000 --link redis-amy:redis audreyt/ethercalc

然後就可以到瀏覽器查看 http://localhost:6500/home, 開始使用 ethercalc! 也邀請班上其他同學來你的 ethercalc 填寫。 (localhost 要改成你的電腦的 ip, 用 ifconfig 可以查得到。) 至少要有一格填上 "Amy" 或其他可識別的字串。 也請到別的同學的 ethercalc 服務去幫他塗鴉豐富內容。 註: home 這個頁面的名字可以自己任意取。 如果你不自選而是留空, 那麼會進入 ethercalc 首頁, 按下 「create spreadsheet」 之後, 它會幫你建一個很長的亂碼當作你的頁面名字, 等一下交換時會變得比較麻煩。

注意上面的指令: 冒號之前的, 都是在 host 上你自選的路徑/名字/埠號; 冒號之後的, 都是包裝 docker 的大大預先寫死在容器裡的路徑/名字/埠號。

再來要停用服務。 順序要反過來:

docker stop ecalc-amy
docker stop redis-amy

這時若用 docker ps 會看不到這兩個 docker instances; 但用 docker ps -a 則可看到它們的狀態是 exited。

把 /var/lib/redis-amy 壓縮打包、 傳給同學 brad。 同樣地, 從 brad 那邊接收到他的打包檔之後, 解壓縮到 /var/lib/redis-brad 去。

Amy 在她自己的電腦上啟用另一組 (隔壁同學 brad 的) ethercalc 服務:

docker run --name redis-brad -d -v /var/lib/redis-brad:/data redis redis-server --appendonly yes
docker run --name ecalc-brad -d -p 7500:8000 --link redis-brad:redis audreyt/ethercalc

現在用瀏覽器開啟 http://localhost:7500/home 看到的就是 brad 的 ethercalc 服務了! 到這裡, 你已大略理解 docker 如何透過 --link 來連結兩個 container instances。

如果還想鑽得更深一點, 可以這樣做: 先查看一下 redis-brad 的 IP: docker inspect redis-brad | grep IPAddress 然後在 ecalc-brad 上面開一個 shell 來用: docker exec -it ecalc-brad bash 在裡面查看一些環境變數: env | grep '^REDIS_' 是不是看到了 redis-brad 的名字跟 IP 呢? 也就是說, docker engine 根據你在命令列上指定的 --link 設定了對應的環境變數, 讓 ecalc-brad 知道要請哪個 docker instance 幫它提供資料庫服務。 實驗結束後, 按 ^d 離開 ecalc-brad。

如果一個 ethercalc 不夠用的話 (為賦新辭強說愁的概念) ... 其實 Amy 原先自己的服務還在, 只是沒在跑, 所以你用上述指令也查不到 redis-amy 的 IP、 無法進入 ecalc-amy 的 shell。 用 docker start redis-amydocker start ecalc-amy 重新啟用 Amy 自己的服務, 現在就有兩個 ethercalc 服務可用了!

根據 官網文件, 以後新版的 docker 可能不再支援 --link, 而是要改用 user-defined networks。 不過這個練習可以順便學到 docker inspect 跟 docker exec, 很適合當作 hellow-world 跟 bash 之後、 認識狀態轉換 之前的 docker 第 1.5 課教材, 所以我還是把它寫下來 :-)

1 則留言:

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。