請先安裝好 docker 環境,可以參考‣

1. 快速的執行一個 busybox 容器,並且在容器裡執行 echo 指令:

[root@cp200 ch2]# docker run busybox echo "hello world"
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
554879bb3004: Pull complete 
Digest: sha256:caa382c432891547782ce7140fb3b7304613d3b0438834dce1cad68896ab110a
Status: Downloaded newer image for busybox:latest
hello world

背後運作的原理:

首先,Docker 會先檢查 busybox:latest image是否已經存在本地機器。假如沒有,Docker預設會從Docker Hub registry(http://docker.io/)拉取image。 當image下載好之後,Docker就會基於這個image建立一個容器並且在容器中執行指令。echo指令會將文字標準輸出到畫面(STDOUT),然後程序終止,容器停止。

圖 2.1 docker運作原理

圖 2.1 docker運作原理

以下指令可以用別的image來執行容器:

docker run <image>

另外docker支援同一個image有多個版本,但每一個版本都必須要有唯一的tag名稱。使用image沒有指定tag的話,Docker會默認指定為 latest, 如果想執行不同版本的image,可以用以下方式指定tag,如下: docker run <image>:<tag>

2. 利用 dockerfile 建立docker image

先來建立一個簡單的 Node.js 應用 建立 資料夾 並且 切到資料夾裡面,然後建立 app.js 跟 Dockerfile

[root@cp200 ch2]# mkdir kubia
[root@cp200 ch2]# cd kubia
[root@cp200 kubia]# vi app.js
[root@cp200 kubia]# vi Dockerfile

這兩個檔案內容分別如下:

app.js

const http = require('http');
const os = require('os');

console.log("Kubia server starting...");

var handler = function(request, response) {
  console.log("Received request from " + request.connection.remoteAddress);
  response.writeHead(200);
  response.end("You've hit " + os.hostname() + "\\n");
};

var www = http.createServer(handler);
www.listen(8080);

這個程式會在8080 port開啟web服務,存取這個web服務,網頁會顯示web主機名稱,並且回應200網頁狀態 然後再把來源客戶端IP用標準輸出在容器裡,方便日後查看。

Dockerfile

FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]

FROM 定義使用的基底image,因為要運行 node.js程式,所以使用 node映像檔的tag 7版本,第二指令是把本地資料夾中的 app.js 加入到映像檔的根目錄,最後一行是映像檔被啟動時,要被執行的指令,在這個範例中,指令是 node app.js

3. 利用以下指令 搭配 dockerfile 檔案 建立一個 docker images

有了 app.js 跟 Dockerfile,這兩個檔案,就可以利用以下指令來建立 docker映像檔 (注意指令後面有一個點 . ,代表基於當前目錄)

[root@cp200 kubia]# docker build -t kubia .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM node:7
7: Pulling from library/node
ad74af05f5a2: Pull complete 
2b032b8bbe8b: Pull complete 
a9a5b35f6ead: Pull complete 
3245b5a1c52c: Pull complete 
afa075743392: Pull complete 
9fb9f21641cd: Pull complete 
3f40ad2666bc: Pull complete 
49c0ed396b49: Pull complete 
Digest: sha256:af5c2c6ac8bc3fa372ac031ef60c45a285eeba7bce9ee9ed66dad3a01e29ab8d
Status: Downloaded newer image for node:7
 ---> d9aed20b68a4
Step 2/3 : ADD app.js /app.js
 ---> be113885b436
Step 3/3 : ENTRYPOINT ["node", "app.js"]
 ---> Running in 4d08cb846ef1
Removing intermediate container 4d08cb846ef1
 ---> 60f90eb9bd89
Successfully built 60f90eb9bd89
Successfully tagged kubia:latest

上面指令就是告訴Docker基於當前目錄的檔案內容建立一個 kubia 的映像檔,Docker會在目錄中找 Dockerfile,然後根據檔案內容的指令來建立映像檔。

圖 2.2 Docker創建新映像檔

圖 2.2 Docker創建新映像檔

Docker客戶端 跟 Docker daemon程序 可以不用在同一台機器上。假設你使用windows作業系統,那有可能Docker客戶端在windows系統上,但是Docker daemon程序應該在一個VM裡。