2018年10月31日星期三

Docker Network 及 Docker Compose 教學

上一回【Docker 基本名詞及概念 +  用 Eclipse 建立 Docker image

docker_network_1.png

先學 Docker Network 及 Docker compose 沒壞處,K8s ( Kubernetes 簡稱 ) 設定可以由 compose 轉換過去,學習寫 yaml 是必經過程,而寫 Docker 的 yaml 需要 Network 知識,就算是 K8s 也避不了 Network 問題,懂 Network 是必要條件。


———————————簡易的分隔線————————————

流程︰

  1. 設定 Linux
  2. 使用 docker-compose
  3. 認識 Docker network
  4. 認識 Docker compose
  5. 總結
———————————簡易的分隔線————————————

設定 Linux︰


不必用 linux,用 Windows 可直接跳去看 使用 docker-compose

安裝 Docker 及 docker-compose︰


linux-version.png

我用 ubuntu 18.04.1 LTS,Docker 官網安裝非常詳細,自己看教程裝。
https://docs.docker.com/install/linux/docker-ce/ubuntu/

Docker-compose install
https://docs.docker.com/compose/install/

安裝 Eclipse︰


Eclipse-installer.png

Ubuntu 18.04.1 LTS 自帶 OpenJDK 10︰
https://linuxize.com/post/install-java-on-ubuntu-18-04/

跟 Windows 安裝大同小異,個人建議用 installer 裝 Java EE Developer 版本。
http://www.eclipse.org/downloads/packages/installer

Eclipse 插件裝 Eclipse Docker Tooling 及 YEdit。

修改 .profile︰


user-profile.png

不像 Windows 自定 environment variables,Linux 要寫進 profile 才不會消失!
http://linux.vbird.org/linux_basic/0320bash.php#settings_bashrc_bash_profile

———————————簡易的分隔線————————————

使用 docker-compose︰


編寫 yaml 設定檔,在一台電腦以一個 command 自動開啟、設定及關閉用多個 Container,需要甚麼 Container 再加,如 proxy service、LDAP service 等等。

如何寫 yaml?這裡沒教學,基本的東西,參考一下 example,然後自己研究官方文件,最後會有重點提示,指明需要注意及需要知識。

Overview of Docker Compose

事前準備︰


Example 要有點準備,跟指示做。首先運行一次 TomEE 把 【lib】、【conf】及【webapps】 folder 從 image 抄出來。

如有需要,亦都可以在 Derby image 裡抽取 Database,資料夾在 \Database。
https://hub.docker.com/r/integrityknight/derby/

Docker image : integrityknight/tomee:v8-jre-7.1.0-plus
https://hub.docker.com/r/integrityknight/tomee/

然後下載以下檔案,準備建立新 Project。

( Linux ) .env 及 docker-compose.yml
( Windows 10 ) .env 及 docker-compose.yml

在 Eclipse 建立新 Project ( 名稱 docker-compose 好了 ),將下載回來的檔案放進去。另外把以下的檔案覆蓋 conf 下 tomee.xml。

( Linux ) tomee.xml
( Windows 10 ) tomee.xml

Database 位置跟前幾次教學一樣,自己回顧一下吧。



最終 Project 結構是這樣。

運行 Example︰


run-docker-compose.png

在 docker-compose.yml 右鍵,按【Run As】,選【Docker Compose】運行 Example。

測試 Example︰


docker-compose-test.png

在【.env】裡,能複製貼上測試用網址。這個 docker-compose 例子,是以前教學包裝成 docker image,還改裝成開發模式。
( Linux ) http://172.20.0.3:8080/TomEE-JNDI-Derby-Example/datasource.jsp
( Windows 10 ) http://localhost:8080/TomEE-JNDI-Derby-Example/datasource.jsp

JNDI + Derby + TomEE Plus 教學
https://javatoybox.blogspot.com/2018/09/jndi-derby-tomee-plus.html

設定 Data Source︰


derby-setting.png

這個步驟只是示範開發模式,在 Eclipse 可以連接去 container。詳細設定,可參考以下網址及以前教學。 ( 用 Windows 10 的 .env、tomee.xml 及 docker-compose.yml 設定,把 Host 設定成 localhost 即可 )

註︰如果在 browser 測試時出 500 error code,請 restart tomee container。

設定 JDBC
https://javatoybox.blogspot.com/2018/05/eclipse-java-db-apache-derby-part-1-3.html#JDBC_Driver

開發用,一站式 IDE︰


Derby,用 eclipse 內建的 editor 做 CRUD。

TomEE,直接改 Project 內 conf 設定檔,要甚麼 library 直接丟進 lib,寫好的程式碼,打包成 war 丟進 webapps。

想玩最新最潮 TomEE 及 Derby ,可修改 .env 檔案中 IMAGE_TAG 設定,及從 image 抄出最新 lib 出來。

做開發,所有事情能在一個 IDE 內做好。

停止 Example︰


compose-down.png

先按 project folder 開啟 Terminal,輸入 docker-compose down,可停止及刪除 container 和 network。


———————————簡易的分隔線————————————

認識 Docker Network︰

 

Docker-Linux-Windows.png

看不懂這圖,解釋甚麼都沒用,沒有網路基礎,快去學習一下。
http://linux.vbird.org/linux_server/0110network_basic.php

上圖是 Linux 及 windows 版本的 Docker CE 分別,可看到 Windows 需要隔一重 Linux 才能連接 Container。這是 Windows 最蛋痛的地方,Windows 與 Container 不能互通,而且不能進入 Moby Linux VM 修改 iptables!

以下是 Microsoft 提供解決方法,反正我沒試過,有勇者要研究的話,請隨便。

Moby Linux VMs use DockerNAT switch with Docker for Windows
https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/advanced#moby-linux-vms-use-dockernat-switch-with-docker-for-windows-a-product-of-docker-cehttpswwwdockercomcommunity-edition

Docker network mode︰


Google 吧,網上很多教學,不過用了 docker-compose 後,甚麼 bridge、host、container 之類都不重要,重點放在 overlay 就好,注意 multiple Docker daemons 及單一 Docker 能用甚麼 mode。

Networking

———————————簡易的分隔線————————————

認識 Docker compose︰


yaml 重點︰

  • case-sensitive
  • 只能用 space,不能用 Tab
  • 多少個 space 並不是重點,但屬於同層,縮排要一樣
  • 用【 , 】之後,要加一個 space

Compose 重點︰

  • version - 這個決定設定檔能支援甚麼功能,請參考官方文件
  • service - 單一服務 (service ),單一容器 ( container ),以例子的 yml 來說,就是 Tomee 及 db
  • hostname - 加這個,在 container 的 /etc/hosts 才有正確 mapping,這樣就不需要做 network 設定 ( 詳細請比較 v1 與 v2 的 yml 分別 )。
  • network - 網路通不通,能連線 host 與否,都是看這個
  • volume - Container 消失,資料也會一起消失,所以要 mount 去 Host OS 做續存
當 compose up 的時候,會先建立 network,再建立 container,所以 network 有問題就不會再繼續下去,而 compose down 的時候,次序反轉。

註︰別在 compose up 時去修改 yml 檔,執行 compose down 會失敗,關不了,要手動清理 network 及關閉 container。

Service configuration reference
https://docs.docker.com/compose/compose-file/#service-configuration-reference

手動清理 network 指令︰


參考官方文件,多數手殘的時候,不正確關閉 compose,最常用到 command 就是 prune。

docker network prune
https://docs.docker.com/engine/reference/commandline/network_prune/#related-commands

手動移除 container︰


手殘系列第二彈……

docker rm
https://docs.docker.com/engine/reference/commandline/rm/

不正確關閉 Database︰


database lock

無法連線 database 時,刪除 .lck 的 file 可以解鎖。

———————————簡易的分隔線————————————

總結︰


作為一個孤獨的開發者,在同一台電腦,用 docker-compose 起動預制好的 image 做開發及 demo,已經很好用。 不過在 Opensource 世界,不必孤軍作戰,還有一堆自願者協助開發,single host 開發環境已經不適用,會想起 CI / CD 模式,建立 Server 給眾人開發及測試,這個時候需考慮使用 docker-machine 及 K8s,日後有機會再說。

下一回【 Docker 上的 Kubernetes 】

沒有留言:

發佈留言

設有留言驗證及審查,檢閱後,才會顯示留言。
本人惰性很高,留言或許會石沉大海。