---
# System prepended metadata

title: The First Dockerfile by myself with simple java code
tags: [Docker]

---

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`