摘要:通過(guò)能獲得很多別人定制好的但是如果自己想制作一個(gè)自己容器該怎么弄呢用就像一個(gè)腳本文件告訴如何創(chuàng)建一個(gè)新的下面舉例來(lái)用來(lái)制作一個(gè)服務(wù)器的指令剛才提到了社區(qū)已經(jīng)有很多很好用的那我們要構(gòu)建自己的的話就可以在這些的基礎(chǔ)上來(lái)做我們要做一個(gè)基于的服務(wù)器
通過(guò) docker hub 能獲得很多別人定制好的image, 但是如果自己想制作一個(gè)自己容器該怎么弄呢?
用 DockerfileDockerfile 就像一個(gè)腳本文件, 告訴 docker 如何創(chuàng)建一個(gè)新的 Image.
下面舉例來(lái)用 node.js 來(lái)制作一個(gè) http 服務(wù)器的 image.
剛才提到了社區(qū)已經(jīng)有很多很好用的 docker images, 那我們要構(gòu)建自己的 iamge 的話就可以在這些 image 的基礎(chǔ)上來(lái)做. 我們要做一個(gè)基于 node.js 的 http 服務(wù)器, 那首先就是找一個(gè)已經(jīng)安裝好 node.js 的 image, docker hub 已經(jīng)有了 node.js 官方 images 了, 直接利用這些資源就可以了. 利用的方式就是使用 FROM 指令.
// Dockerfile FROM node:8.5
通過(guò) FROM 來(lái)指定 node.js 的版本和拉取 image 的格式一樣. 如果你需要依賴的 image 是社區(qū)版本的話,要寫(xiě)上對(duì)應(yīng)的 namespace 名字.
COPY 指令有了 node.js 之后我們要寫(xiě)一個(gè) http 服務(wù)器. 直接新建一個(gè) index.js 文件, 使用 node.js 官方 hello world 的例子.
// 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 "); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
有了這個(gè)服務(wù)器代碼之后, 就要將這個(gè) index.js 文件從我們的主機(jī)上用 COPY 指令拷貝到容器中.這個(gè)語(yǔ)法和我們平時(shí)使用cp的格式非常類似,要注意的是容器中的地址采用絕對(duì)地址.
// Dockerfile FROM node:8.5 COPY index.js /root/index.jsCMD 指令
為了讓我們的http 服務(wù)器啟動(dòng)起來(lái)就用 CMD 在容器中執(zhí)行的命令.
// Dockerfile FROM node:8.5 COPY index.js /root/index.js CMD node /root/index.js
在容易中執(zhí)行 node /root/index.js 這樣我們的 http 服務(wù)就在容器中啟動(dòng)了
EXPOSE 指令雖然啟動(dòng)了服務(wù), 也只是在容器內(nèi)部自 high; 為了能讓服務(wù)能在容易意外被使用,就要將服務(wù)端口暴露出去.
// Dockerfile FROM node:8.5 COPY index.js /root/index.js EXPOSE 3000 CMD node /root/index.js
這里需要注意的是, 要把 EXPOSE 放在服務(wù)啟動(dòng)之前. 不然端口的暴露就會(huì)有問(wèn)題. 別問(wèn)我為什么會(huì)知道,說(shuō)多了都是淚.
最后一步構(gòu)建到這里我們的 Dockefile 就完成了,但是我們 image 文件在哪里啊.當(dāng)讓是要通過(guò) docker 的 build 命令構(gòu)建出來(lái)咯.這里的-t 選項(xiàng)告訴 docker 這生成出來(lái)的 image 的 tag 是什么. 我們自己的做的 image 屬于是社區(qū)的 image 記得在 image 名字前面加上自己的 namespace.
docker build . -t pshu/helloWorld:1.0.0
docker 就會(huì)先去 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 完成就能看見(jiàn)自己的 image 了.
$docker images REPOSITORY TAG IMAGE ID CREATED SIZE pshu/helloworld 1.0.0 969f16cac45d 31 seconds ago 673MB
接著我們之只要用 docker run 命令就能把這個(gè) image 跑起來(lái)了.
docker run --rm -i -p 3000:3000 pshu/helloworld:1.0.0
本地的3000端口就能訪問(wèn)到這個(gè) hello world 的 http 服務(wù)了.
完希望大家喜歡.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27081.html
摘要:在程序員英語(yǔ)娛樂(lè)主題節(jié)目的直播中介紹了下在網(wǎng)站學(xué)習(xí)的視頻由于時(shí)間倉(cāng)促只學(xué)習(xí)了一部分最近因?yàn)榈墓镜脑蛞矝](méi)有時(shí)間繼續(xù)搞直播所以想寫(xiě)一篇分享下自己的的學(xué)習(xí)經(jīng)驗(yàn)想學(xué)習(xí)簡(jiǎn)短有效的風(fēng)格所以就將文章題目定為速成班準(zhǔn)備本地已經(jīng)安裝好了現(xiàn)在各個(gè)操作系統(tǒng)上 在程序員英語(yǔ)娛樂(lè)主題節(jié)目http://www.douyu.com/aftercode的直播中介紹了下在 egghead 網(wǎng)站學(xué)習(xí) docker 的...
摘要:本來(lái)想在一篇里面就寫(xiě)完所有的內(nèi)容的但是考慮考慮到文章太長(zhǎng)會(huì)和風(fēng)格相背離所以就按連載的形式來(lái)容器是物質(zhì)基礎(chǔ)有了這個(gè)才能讓能運(yùn)行起來(lái)運(yùn)行起來(lái)的稱之為容器它使用中的一等公民直接啟動(dòng)使用啟動(dòng)一個(gè)容器如果你沒(méi)有下載過(guò)的話會(huì)自動(dòng)下載一個(gè)的指定方法和刪除 本來(lái)想在一篇 blog 里面就寫(xiě)完所有的內(nèi)容的,但是考慮考慮到文章太長(zhǎng)會(huì)和 egghead 風(fēng)格相背離,所以就按連載的形式來(lái). 容器 contai...
摘要:通過(guò)的我們可以將多個(gè)有機(jī)的組合起來(lái)構(gòu)建出自己需要的服務(wù)但是這里有幾個(gè)小問(wèn)題就是不利于分享步驟麻煩需要自己創(chuàng)建指定使用那如何解決上面的兩個(gè)問(wèn)題呢第節(jié)例子中的服務(wù)可以通過(guò)創(chuàng)建一個(gè)這樣的文件來(lái)解決通過(guò)下面的命令就能將所有需要的啟動(dòng)起來(lái) 通過(guò)docker 的 network我們可以將多個(gè) container 有機(jī)的組合起來(lái)構(gòu)建出自己需要的服務(wù). 但是這里有幾個(gè)小問(wèn)題就是 不利于分享. 步驟麻...
摘要:到現(xiàn)在為止我們會(huì)從拉取自己需要的文件并執(zhí)行起來(lái)還會(huì)基于已有的來(lái)制作自己特殊需要的但是如果我們完成一個(gè)功能需要多個(gè)組合起來(lái)使用該怎么辦呢雖然可以通過(guò)來(lái)制作一個(gè)這樣的但是如果所有的功能都做在一個(gè)中如果有一個(gè)模塊需呀改變的話就需要重新構(gòu)建整個(gè)作為 到現(xiàn)在為止,我們會(huì)從 docker hub 拉取自己需要的 image 文件并執(zhí)行起來(lái). 還會(huì)基于已有的 image 來(lái)制作自己特殊需要的 ima...
摘要:由于公司沒(méi)有運(yùn)維又需要監(jiān)控服務(wù)器的一些數(shù)據(jù)信息想盡快的啟動(dòng)一個(gè)數(shù)值監(jiān)控系統(tǒng)技術(shù)評(píng)估了下打算的方式來(lái)建設(shè)是一個(gè)時(shí)間數(shù)列數(shù)據(jù)庫(kù)并且自帶一些簡(jiǎn)單圖形展示功能雖然展示方面不是很完美但是在收集時(shí)間數(shù)據(jù)上非常的方便和簡(jiǎn)單根據(jù)官網(wǎng)的例子只需要一個(gè)連接就能 由于公司沒(méi)有運(yùn)維, 又需要監(jiān)控服務(wù)器的一些數(shù)據(jù)信息, 想盡快的啟動(dòng)一個(gè)數(shù)值監(jiān)控系統(tǒng). 技術(shù)評(píng)估了下打算 graphite + grafana 的...
閱讀 2797·2023-04-25 23:08
閱讀 1583·2021-11-23 09:51
閱讀 1564·2021-10-27 14:18
閱讀 3115·2019-08-29 13:25
閱讀 2831·2019-08-29 13:14
閱讀 2895·2019-08-26 18:36
閱讀 2193·2019-08-26 12:11
閱讀 811·2019-08-26 11:29