[afterCode] docker 速成班 4: 自建 Image

經過 docker hub 能得到不少別人定製好的image, 可是若是本身想製做一個本身容器該怎麼弄呢?node

用 Dockerfile

Dockerfile 就像一個腳本文件, 告訴 docker 如何建立一個新的 Image.
下面舉例來用 node.js 來製做一個 http 服務器的 image.docker

FROM 指令

剛纔提到了社區已經有不少很好用的 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 名字.服務器

COPY 指令

有了 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

CMD 指令

爲了讓咱們的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

EXPOSE 指令

雖然啓動了服務, 也只是在容器內部自 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 服務了.

但願你們喜歡.

相關文章
相關標籤/搜索