2018年10月8日星期一

Docker 基本名詞及概念 + 用 Eclipse 建立 Docker image

上一回【Docker 導覽及申請

學習 J2EE 技術,首先要有 Server……

Web Server ( eg.apache )、application server ( eg.TomEE plus )、database server ( eg.apache derby )、authorization server ( eg.OpenLDAP )、mail server ( eg.Postfix )

不要這樣好嗎?我只是個打字員,System administrate 不是我業務範圍,還沒開始打字,已在建立 Server 那步倒下,不是本末倒置嗎?

假如有個現成 Server,下載即用,世界是不是變得不一樣?

說起來很美好,實際上還是有限制,不能完全不懂各種 Service 怎運作,連基本設定都不會,就算給你下載回來也只是白忙一場。

舉例,建立某 Server 要十個步驟,有熱心人士給你做好前五步,餘下的五步怎樣?把 root 密碼改一改,把網址改成自己,很基本吧?好了,別人的設定不一定適合自己,要怎改?沒有基本知識,連上網 google 的關鍵字都不會,怎做下去?

調整心態,步驟及麻煩的確省了,但不是完全無痛建立 Server,了解 Docker 怎運作才知道怎建立 Docker image。

———————————速查列表 ( start ) ————————————




———————————速查列表 ( end ) ————————————

Docker 基本名詞及概念︰


Dockerbasic_1.png

看到不懂的名詞及指令,先去 google,出來的結果多數是 git 及 linux,docker 各種概念及指令跟以上兩者似曾相識……信我,學寫程式前該學 linux 及 git,不會吃虧。

另外,Docker 是 Container 技術,請 google【Containers vs Virtual Machines】了解兩者分別。

Host OS


Dockerbasic_2.png

參考上回教學,這裡 Host OS 是指 Windows ( ? ),為甚麼是疑問呢?因為只有 Docker for Windows 才有。Windows 上的 Docker,實情是 hyper-v 技術運行 MobyLinux VM,變成 Linux-based virtual machine。

Docker repository


存放 Image 的地方,那麼 Image 從那裡來?從 Docker Registry 來,可以是官方 Docker Registry ( Docker Hub ),也可以是私人 Docker Registry。

Docker Registry
https://docs.docker.com/registry/

Image


Dockerbasic_3.png

如何生成 Image?看 Dockerfile。Dockerfile 記錄如何生成 Image,最頂的一行【FROM】叫 Base image,如果在 local docker repository 沒有,自動會上 Docker Hub 下載回來,所以才需要登入。

執行每一個動作都會生成一個 layer,現在聽聽就好,實際做一次的時候就會知道。為甚麼是 layer?由 Base image 開始,記錄每層 layer 版本差異,層層疊加,不就是完整的 Image 嗎?如果懂 git diff 指令甚麼意思,一定明白我在說甚麼。

還有,每一層 layer 都是唯讀層,只有最後一層才是讀寫層。

OFFICIAL REPOSITORY tomee
https://hub.docker.com/_/tomee/

Images and layers
https://docs.docker.com/storage/storagedriver/#images-and-layers

Dockerfile reference
https://docs.docker.com/engine/reference/builder/#dockerignore-file

Container


Dockerbasic_4.png

用 container 運行 Image,以 java 角度想,簡單理解成 Image = Object,而 Container = Object instance。一個 image 可以生成多個 container,每個 container 獨立運作,不會影響到別人。用【docker ps】會看到運作中的 container ID,【docker ps -a】可看到已停止的 container ID。

container 有分 Windows-basedLinux-based。Windows-based 的 image 不能在 Linux-based container 運行,大部分 image 都是 Linux-based,三段論……所以你懂的……

還有 CPU 架構也要留意,現在有 ARMx86 及 RISC-V,因為 Container 技術還是依賴作業系統及硬件,所以選對 Windows-based 及 Linux-based 的 Image 使用外,還要看 CPU 架構,這樣才萬無一失。

x86 多數在個人電腦 ( 如桌上電腦及手提電腦 ),ARM 多數在 single board computer ( 如 Raspberry pi 及 NAS ),RISC-V 多數在 IoT 産品 ( 如智能家居設備 )。

Docker Buildx


這是一個解決 CPU 架構的方法,到 2020 年 9 月 16 日為止,還是一個實驗性功能,詳情請看官方文件 Docker Buildx

cheat sheet
https://docs.docker.com/get-started/part2/#recap-and-cheat-sheet-optional

Volumes


Dockerbasic_5.png

當刪除  container 或疊一層新 layer 時,會蓋過前一層,假如 container 是運行 database service 的話,會不會很不妙?所以設定 container 一些 folder 連結到 Host OS 的 File system 做永續儲存。

很抽象?做一次就懂,還是那句,懂 linux 的 mount 這個不難理解,我很鼓勵學 linux。

Manage data in Docker
https://docs.docker.com/storage/

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

在 Eclipse 使用 Docker︰


EclipseDocker_1.png

首先,去 Docker for Windows 的 Setting,開啟【Expose daemon on tcp://localhost:2375 without TLS】。

EclipseDocker_2.png

Eclipse_Yaml_editor.png

然後,在 Eclipse Marketplace 搜尋 Docker 及 yaml,安裝 Eclipse Docker Tooling 及 yaml editor。

EclipseDocker_3.png

到 Preference 設定 Docker。只需要改【Docker Compose】及【Docker Machine】兩個位置,【VM Driver】沿用預設。

How to configure Docker tooling on Eclipse?
https://devops.stackexchange.com/questions/1511/how-to-configure-docker-tooling-on-eclipse

EclipseDocker_4.png

開 Docker Tooling 的 Perspective。

EclipseDocker_5.png

如上圖示,連結 Docker。

EclipseDocker_6.png

成功建立連線!

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

建立 Dockerfile︰


計劃 Image 內容︰


這次示範 Apline 的 openjre 做 Base Image,疊一層 Derby,加入自制 Data 及開啟 Volume,方便測試,這並不是最佳寫法,但最起碼知道自制 Image 步驟。

現在複制一份 Dockerfile 學習。

Best practices for writing Dockerfiles
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

DockerFile_1.png

開一個新 Project 叫【Docker-Derby】,然後建立一個【Dockerfile】,改這個名字的話,會自動用 Dockerfile editor 開啟檔案。

DockerFile_2.png

將 Database 檔案抄進 Project 裡。包所有需要的,都包進一個 Project 裡,分別會 push 到 GitHub 及 Docker Hub。

編寫 Dockerfile︰


一個 dockerfile reference 全包,由頭學到尾就最好,這裡會抽重點介紹一些常用語法。
https://docs.docker.com/engine/reference/builder/

DockerFile_3.png

ARG 定義在 FROM 之前,多數用來指定 Base image 特定 Tag。
FROM 定義 Base image,【:】後面是指定 Tag 或叫做版本。
LABEL 以 key-value 格式出現,用來補充資訊。

understand-how-arg-and-from-interact
https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact

DockerFile_4.png

ENV 環境變數,方便之後設定。

environment-replacement
https://docs.docker.com/engine/reference/builder/#environment-replacement

DockerFile_5.png

RUN 執行 command,【\】將一句 command 換行。又是 linux……有機會還是學一下 linux,這裡就不每句 command 詳述,自己 google。

dockerfile reference
https://docs.docker.com/engine/reference/builder/#run

DockerFile_6.png

COPY 用法︰

  • COPY <host os> <docker image>

抄 Project 中 Database 資料夾到 docker image 中的 /Database/。
註︰要留意大小寫及有沒有【/】及斜錯邊,linux 有分大小寫,是檔案還是資料夾。

WORKDIR 是 working directory,指定在 /Database 執行 derby,log file 會在這層 folder 中産生。

Eclipse 上使用 Java DB ( Apache Derby ) (PART 1 / 3 )
https://javatoybox.blogspot.com/2018/05/eclipse-java-db-apache-derby-part-1-3.html#JDBC_Driver

VOLUME 開放 /Database 這個 folder,設定 host OS 某 folder 可 mount 到 container 中,方便開發及測試。

EXPOSE 開放 image 指定 port 位,設定 container port 位對應到 host OS 中。

dockerfile reference
https://docs.docker.com/engine/reference/builder/#volume
https://docs.docker.com/engine/reference/builder/#expose

DockerFile_7.png

最後 做 healthcheck 及執行 derby server 程式。

healthcheck
https://docs.docker.com/engine/reference/builder/#healthcheck

CMD
https://docs.docker.com/engine/reference/builder/#cmd

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

建立 Docker image︰


ImageBuild_1.png

在 Dockerfile 右鍵 --> 【Run As】 --> 【Run Configurations…】。

ImageBuild_2.png

一定要打 Dockerhub 帳號 + repo 名 + tag 名才可以 push 上 Docker Hub,之後 Apply 及 Run 。
( eg. integrityknight/derby:v10.14.2.0 )

ImageBuild_3.png

沒甚麼可做,等完成後,restart Docker。

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

測試 Docker Image︰


ImageTest_1.png

返回 Docker Tooling perspective,運行 Image,選 Container Port 才可接【Edit】,再按【Next】設定 Volume 位置。

ImageTest_2.png

設定這裡的話,會用 host OS 的 database,如不設定,會用 image 內置的 database 資料。牢記 container 消失,資料也會一起消失,所以要做 persistence 一定要設定好!之後按 Next。

ImageTest_3.png

用 Bridge,這是 Docker Network 的東西,之後再詳解。

ImageTest_4.png

成功用 Docker Image 運行 Container,可接受連線請求!

ImageTest_5.png

用 Eclipse 內建的 Data Source Explorer 測試是否設定正確 ( 此圖有設定 volume )。如果忘了怎建立連線,請參考之前 Derby 教學 。

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

進入 Container︰


docker_exec.png

因為用上 data volume,正確關閉 database 才不會留下 .lck 檔案,造成問題,不要用 stop 關閉 container。 ( 下一篇 Docker Compose 會提到發生甚麼問題 )

docker_exec_2.png

在 Terminal 輸入【java org.apache.derby.drda.NetworkServerControl  shutdown -h myhost】後,會自動關閉 container。

Shutting down the Network Server
https://db.apache.org/derby/docs/10.14/publishedapi/org/apache/derby/drda/NetworkServerControl.html

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

Image Push 上 Docker Hub︰



在 Docker Tooling perspective,按【Push】,填上 Server Address、Usehname 及 Password,即可上傳,官方的 Registry 是 https://registry.hub.docker.com。

Dockerfile Push 上 Github︰


PushToGitHub_1.png

既然 Dockerfile 有版本,做個版本控制也很正常吧?方法不詳述,看 教學 自己想辨法。
還有 Automated Build,參考官方教學動手試試看。

Creating an Automated Build
https://docs.docker.com/docker-hub/builds/

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

總結︰


現在可建立簡單 Docker image 供開發、測試及 Demo,但只有 Database docker image 不夠用,還有 TomEE docker image、LDAP docker image 等等,把用到的 container 串聯起來用才成為一個系統,下次會介紹 Docker Network 及 Docker compose。

下一回【Docker Network 及 Docker Compose 教學

沒有留言:

發佈留言

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