The First Dockerfile by myself with simple java code === ## Java part 首先有java code,必須完成編譯,**有.class檔案** * hello.java ```java= public class hello { public static void main(String[] arg) { System.out.println("Hello World!"); } } ``` 目前檔案管理: * ~/dockerfile_example/java_codes/ * hello.java * hello.class ## Dockerfile 建立一個image所需的file,其中有很多可以加的指令,先舉一個間單的例子, *note:Dockerfile為一個不具副檔名的檔案* * Dockerfile ```dockerfile= FROM openjdk:latest RUN mkdir /app COPY codes/ /app/ WORKDIR /app CMD java hello ``` * FROM 引入其他base image作為我們要創建image的底,可以引入很多image,Docker的 image是一層一層疊加上去的,如下圖 ![docekr images](https://imgur.com/LKECX4Z.png "docekr images" ) 這邊引入java JDK,讓別的機器在docker層之上有JDK層。 * COPY 有了java環境之後要把code也包進去,這邊使用 COPY 指令,把hello.java與hello.class 複製到 /app 資料夾裡面 * WORKDIR Set the dictionary for executing futher commands. 讓使用這個image的使用者知道從哪裡執行指令 * CMD 與另一語法**ENTRYPOINT**功能類似,是當container被架起來之後的預設指令 * RUN 在使用image的那端執行指令。 檔案管理: * ~/dockerfile_example/ * Dockerfile 有了以上三個檔案之後就可以執行docker指令來建立image了 ## Docker image 切到有docker file的目錄下 ``` # cd ~/dockerfile_example ``` 建立image ``` # docker bulid -t myfirstimage . ``` -t :給image一個名字 後面一點表示在當前目錄下建立image 執行container ``` # docker run myfirstimage ``` 執行完run之後就會輸出Hello World!,之後,我的container就會停止,因為他做完他的事情了。 如果要讓他卡在執行階段就要讓他一直有事做,如無窮迴圈,參考以下code ```java= public class hello { public static void main(String[] arg) { while(true) { for(int i = 0 ; i< 65535 ;i++); System.out.println("Hello World!"); } } } ``` 可以讓她在背景執行,需要時再呼叫他看他做了什麼事,指令如下 ``` # docker run --name mybaby -d myfirstimage ``` ``` # docker logs mybaby ``` ###### tags: `Docker`