經過 docker hub 能得到不少別人定製好的image, 可是若是本身想製做一個本身容器該怎麼弄呢?node
Dockerfile 就像一個腳本文件, 告訴 docker 如何建立一個新的 Image.
下面舉例來用 node.js 來製做一個 http 服務器的 image.docker
剛纔提到了社區已經有不少很好用的 docker images, 那咱們要構建本身的 iamge 的話就能夠在這些 image 的基礎上來作. 咱們要作一個基於 node.js 的 http 服務器, 那首先就是找一個已經安裝好 node.js 的 image, docker hub 已經有了 node.js 官方 images 了, 直接利用這些資源就能夠了. 利用的方式就是使用 FROM
指令.bash
// Dockerfile FROM node:8.5
經過 FROM 來指定 node.js 的版本和拉取 image 的格式同樣. 若是你須要依賴的 image 是社區版本的話,要寫上對應的 namespace 名字.服務器
有了 node.js 以後咱們要寫一個 http 服務器. 直接新建一個 index.js
文件, 使用 node.js 官方 hello world 的例子.ui
// index.js // ref https://nodejs.org/en/about/ const http = require('http'); const hostname = '127.0.0.1'; const port = 3000; const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World\n'); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
有了這個服務器代碼以後, 就要將這個 index.js 文件從咱們的主機上用 COPY
指令拷貝到容器中.這個語法和咱們平時使用cp
的格式很是相似,要注意的是容器中的地址採用絕對地址.spa
// Dockerfile FROM node:8.5 COPY index.js /root/index.js
爲了讓咱們的http 服務器啓動起來就用 CMD
在容器中執行的命令.3d
// Dockerfile FROM node:8.5 COPY index.js /root/index.js CMD node /root/index.js
在容易中執行 node /root/index.js
這樣咱們的 http 服務就在容器中啓動了code
雖然啓動了服務, 也只是在容器內部自 high; 爲了能讓服務能在容易意外被使用,就要將服務端口暴露出去.server
// Dockerfile FROM node:8.5 COPY index.js /root/index.js EXPOSE 3000 CMD node /root/index.js
這裏須要注意的是, 要把 EXPOSE
放在服務啓動以前. 否則端口的暴露就會有問題. 別問我爲何會知道,說多了都是淚.ip
到這裏咱們的 Dockefile 就完成了,可是咱們 image 文件在哪裏啊.當讓是要經過 docker 的 build 命令構建出來咯.這裏的-t
選項告訴 docker 這生成出來的 image 的 tag 是什麼. 咱們本身的作的 image 屬因而社區的 image 記得在 image 名字前面加上本身的 namespace.
docker build . -t pshu/helloWorld:1.0.0
docker 就會先去 docker hub 拉取 node.js 的鏡像, 而後按照 Dockerfile 中的
Step 1/4 : FROM node:8.5 8.5: Pulling from library/node aa18ad1a0d33: Pull complete 15a33158a136: Pull complete f67323742a64: Pull complete c4b45e832c38: Pull complete f83e14495c19: Pull complete 41fea39113bf: Pull complete f28b27a3711e: Pull complete 2079c2e3f89a: Pull complete Digest: sha256:27e459456c552642c520a36f934b0e1646043d43877a5e018e9bb3f251d2ef76 Status: Downloaded newer image for node:8.5 ---> de1099630c13 Step 2/4 : COPY index.js /root/index.js ---> 947429cca879 Removing intermediate container 1f813f1cbf71 Step 3/4 : CMD node index.js ---> Running in 17425d436856 ---> c720248bb068 Removing intermediate container 17425d436856 Step 4/4 : EXPOSE 3000 ---> Running in d1b924412684 ---> 969f16cac45d Removing intermediate container d1b924412684 Successfully built 969f16cac45d Successfully tagged pshu/helloworld:1.0.0
docker build 完成就能看見本身的 image 了.
$docker images REPOSITORY TAG IMAGE ID CREATED SIZE pshu/helloworld 1.0.0 969f16cac45d 31 seconds ago 673MB
接着咱們之只要用 docker run 命令就能把這個 image 跑起來了.
docker run --rm -i -p 3000:3000 pshu/helloworld:1.0.0
本地的3000端口就能訪問到這個 hello world 的 http 服務了.
但願你們喜歡.