請先安裝好 docker 環境,可以參考‣
[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),然後程序終止,容器停止。
以下指令可以用別的image來執行容器:
docker run <image>
另外docker支援同一個image有多個版本,但每一個版本都必須要有唯一的tag名稱。使用image沒有指定tag的話,Docker會默認指定為 latest,
如果想執行不同版本的image,可以用以下方式指定tag,如下:
docker run <image>:<tag>
先來建立一個簡單的 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
有了 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,然後根據檔案內容的指令來建立映像檔。
Docker客戶端 跟 Docker daemon程序 可以不用在同一台機器上。假設你使用windows作業系統,那有可能Docker客戶端在windows系統上,但是Docker daemon程序應該在一個VM裡。