先學 Docker Network 及 Docker compose 沒壞處,K8s ( Kubernetes 簡稱 ) 設定可以由 compose 轉換過去,學習寫 yaml 是必經過程,而寫 Docker 的 yaml 需要 Network 知識,就算是 K8s 也避不了 Network 問題,懂 Network 是必要條件。
———————————簡易的分隔線————————————
流程︰
———————————簡易的分隔線————————————
設定 Linux︰
不必用 linux,用 Windows 可直接跳去看 使用 docker-compose。
安裝 Docker 及 docker-compose︰
我用 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︰
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︰
不像 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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Please check "https://javatoybox.blogspot.com/2018/11/docker-kubernetes.html" | |
DERBY_IMAGE_TAG=v10.14.2.0 | |
TOMEE_IMAGE_TAG=v8-jre-7.1.0-plus | |
# for Windows "A:\\javatoybox\\Database\\" | |
# for Linux "~/Database" | |
# for k8s ( Windows 10 ) "//a/javatoybox/Database" | |
DERBY_MOUNT_MAPPING=//a/javatoybox/Database | |
# for windows "A:\javatoybox\GitHub_Local_Repo\docker-compose" | |
# for k8s ( Windows 10 ) "//a/javatoybox/GitHub_Local_Repo/docker-compose/" | |
TOMEE_MOUNT_MAPPING=//a/javatoybox/GitHub_Local_Repo/docker-compose/ | |
# test website "http://localhost:8080/TomEE-JNDI-Derby-Example/datasource.jsp" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
version: "3.7" | |
services: | |
db: | |
hostname: db | |
image: integrityknight/derby:${DERBY_IMAGE_TAG} | |
container_name: derby_db | |
ports: | |
- 1527:1527 | |
healthcheck: | |
disable: true | |
volumes: | |
- ${DERBY_MOUNT_MAPPING}:/Database | |
command: java -Dderby.stream.error.field=java.lang.System.out org.apache.derby.drda.NetworkServerControl start -h db | |
tomee: | |
hostname: tomee | |
depends_on: | |
- db | |
image: integrityknight/tomee:${TOMEE_IMAGE_TAG} | |
container_name: tomee_plus | |
ports: | |
- 8080:8080 | |
volumes: | |
- ${TOMEE_MOUNT_MAPPING}/webapps/:/usr/local/tomee/webapps | |
- ${TOMEE_MOUNT_MAPPING}/lib/:/usr/local/tomee/lib | |
- ${TOMEE_MOUNT_MAPPING}/conf/:/usr/local/tomee/conf |
( Linux ) tomee.xml
( Windows 10 ) tomee.xml
Database 位置跟前幾次教學一樣,自己回顧一下吧。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<tomee> | |
<!-- see http://tomee.apache.org/containers-and-resources.html --> | |
<!-- activate next line to be able to deploy applications in apps --> | |
<!-- <Deployments dir="apps" /> --> | |
<Resource id="FirstDB_datasource" type="DataSource">JdbcDriver org.apache.derby.jdbc.ClientDriver | |
JdbcUrl jdbc:derby://db:1527/FirstDB | |
UserName Stanley | |
Password javatoybox</Resource> | |
</tomee> |
最終 Project 結構是這樣。
運行 Example︰
在 docker-compose.yml 右鍵,按【Run As】,選【Docker Compose】運行 Example。
測試 Example︰
在【.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︰
這個步驟只是示範開發模式,在 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︰
先按 project folder 開啟 Terminal,輸入 docker-compose down,可停止及刪除 container 和 network。
———————————簡易的分隔線————————————
認識 Docker Network︰
看不懂這圖,解釋甚麼都沒用,沒有網路基礎,快去學習一下。
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 時去修改 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 時,刪除 .lck 的 file 可以解鎖。
———————————簡易的分隔線————————————
總結︰
作為一個孤獨的開發者,在同一台電腦,用 docker-compose 起動預制好的 image 做開發及 demo,已經很好用。 不過在 Opensource 世界,不必孤軍作戰,還有一堆自願者協助開發,single host 開發環境已經不適用,會想起 CI / CD 模式,建立 Server 給眾人開發及測試,這個時候需考慮使用 docker-machine 及 K8s,日後有機會再說。
下一回【 Docker 上的 Kubernetes 】