摘要:正因為如此我們的數(shù)據(jù)卷就出來了,用來解決這個問題,那么什么是數(shù)據(jù)卷呢我們用一句話來闡述就是數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄。
Docker是怎么出現(xiàn)的
關(guān)于Docker的發(fā)展史,本文就不做介紹,有興趣的小伙伴們可以查看這篇文章,挺有意思的。http://www.oschina.net/news/5...
什么是Docker???在Docker之前,我們肯定要先了解Docker是什么。官網(wǎng)的介紹是“Docker is the world’s leading software container platform.”官方給Docker的定位是一個應(yīng)用容器平臺。至于為什么要做這個Docker,官網(wǎng)上還有這么一句話"Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud."這句話用一句非常簡單的話去概括就是"Build once,Run anyWhere".這一點跟Java很像。那么它這樣做是要解決現(xiàn)實中什么問題,我列舉幾個情況。
?? 1.合作開發(fā)的時候,在本機可以跑,別人的電腦跑不起來
?? 這里我們拿java Web應(yīng)用程序舉例,我們一個java Web應(yīng)用程序涉及很多東西,比如jdk、tomcat、spring等等。當(dāng)這些其中某一項版本不一致的時候,可能就會導(dǎo)致應(yīng)用程序跑不起來這種情況。Docker則將程序直接打包成鏡像,直接運行在容器中即可。
?? 2.服務(wù)器自己的程序掛了,結(jié)果發(fā)現(xiàn)是別人程序出了問題把內(nèi)存吃完了,自己程序因為內(nèi)存不夠就掛了
??這種也是一種比較常見的情況,如果你的程序重要性不是特別高的話,公司基本上不可能讓你的程序獨享一臺服務(wù)器的,這時候你的服務(wù)器就會跟公司其他人的程序共享一臺服務(wù)器,所以不可避免地就會受到其他程序的干擾,導(dǎo)致自己的程序出現(xiàn)問題。Docker就很好解決了環(huán)境隔離的問題,別人程序不會影響到自己的程序。
??3.公司要弄一個活動,可能會有大量的流量進來,公司需要再多部署幾十臺服務(wù)器
??在沒有Docker的情況下,要在幾天內(nèi)部署幾十臺服務(wù)器,這對運維來說是一件非常折磨人的事,而且每臺服務(wù)器的環(huán)境還不一定一樣,就會出現(xiàn)各種問題,最后部署地頭皮發(fā)麻。用Docker的話,我只需要將程序打包到鏡像,你要多少臺服務(wù),我就給力跑多少容器,極大地提高了部署效率。
關(guān)于Docker與虛擬機的區(qū)別,我在網(wǎng)上找到的一張圖,非常直觀形象地展示出來,話不多說,直接上圖。
??比較上面兩張圖,我們發(fā)現(xiàn)虛擬機是攜帶操作系統(tǒng),本身很小的應(yīng)用程序卻因為攜帶了操作系統(tǒng)而變得非常大,很笨重。Docker是不攜帶操作系統(tǒng)的,所以Docker的應(yīng)用就非常的輕巧。另外在調(diào)用宿主機的CPU、磁盤等等這些資源的時候,拿內(nèi)存舉例,虛擬機是利用Hypervisor去虛擬化內(nèi)存,整個調(diào)用過程是虛擬內(nèi)存->虛擬物理內(nèi)存->真正物理內(nèi)存,但是Docker是利用Docker Engine去調(diào)用宿主的的資源,這時候過程是虛擬內(nèi)存->真正物理內(nèi)存。
Docker安裝??Docker的安裝非常簡單,官網(wǎng)上都給出了具體的安裝步驟,都是可視化的安裝,三步就搞定了。這里我就不細(xì)說了,附上Docker的官網(wǎng)安裝教程地址。
Mac:https://docs.docker.com/docke...
Windows:https://docs.docker.com/docke...
linux的話,官網(wǎng)有不同版本的安裝的教程,這里放上ubuntu的安裝教程,其他小伙們自行查看。
ubuntu:https://docs.docker.com/engin...
??下面這張圖非常的經(jīng)典,很形象地展示了,什么是容器,什么是鏡像,什么是倉庫,以及三者之間的聯(lián)系。
??接下來我們來解釋一下這張圖。現(xiàn)在我們要造一間廚房,在造之前我們首先要干的一件事,就是先列舉出我們造廚房需要的東西。我們可能需要一個通了水電煤的房子以及一些必需的廚房用具諸如鍋碗瓢勺、煤氣灶、冰箱、水槽等等這些東西?,F(xiàn)在我們知道需要了什么東西之后,我們就去找這些東西。首先我們先去京東購買一些廚房用具,這些用具就好比我們的Docker鏡像,我們廚房的用具到了之后得找個地方把它們放在,不可能隨處丟吧,不然后面用的時候就找不到它了,那么我們Docker鏡像也是這樣,需要一個Docker倉庫去存儲這些鏡像。現(xiàn)在我們有了這些廚房用具之后就可以做飯了嗎?答案當(dāng)然是不能,沒水沒電沒火?。∵@時候我們得把廚房用具給裝到一個通了水電煤的房子才行,那么Docker鏡像也是這樣,單純的Docker鏡像是不能用的,它得裝到Docker容器中通了水電煤才能使用。等我們裝好了廚房用具之后我們就可以開始做飯,那么我們的Docker鏡像裝到Docker容器之后,我們應(yīng)用就可以跑起來了。
我的第一個Docker鏡像上面的文章中,我們了解了一下Docker,接下來我們學(xué)著做一個屬于自己的Docker鏡像。
第一步:從鏡像中心下載一個Node鏡像a).去http://hub.daocloud.io/上找到Node鏡像地址并執(zhí)行如下命令 docker pull daocloud.io/library/node:標(biāo)簽 b).查看本地庫的Docker鏡像,是否下載完成 docker images
結(jié)果如下:
app.js的內(nèi)容如下,內(nèi)容很簡單,作用也很簡單,起一個80端口的服務(wù),頁面顯示“Hello Docker”。
var http = require("http"); http.createServer(function (request, response) { // 發(fā)送 HTTP 頭部 // HTTP 狀態(tài)值: 200 : OK // 內(nèi)容類型: text/plain response.writeHead(200, {"Content-Type": "text/plain"}); // 發(fā)送響應(yīng)數(shù)據(jù) "Hello World" response.end("Hello Docker "); }).listen(3000); // 終端打印如下信息 console.log("Server running at http://127.0.0.1:3000/");第三步:寫一個Dockerfile,用于構(gòu)建鏡像
#依賴的鏡像 FROM daocloud.io/library/node:latest #鏡像創(chuàng)建者的信息 MAINTAINER wuming "[email protected]" #執(zhí)行mkdir helloDocker創(chuàng)建一個helloDocker文件夾 RUN mkdir helloDocker #將app.js添加到helloDocker文件夾中 ADD app.js helloDocker #容器運行時啟動的命令,下面命令等價于 CMD node /helloDocker/app.js CMD ["node","/helloDocker/app.js"]第四步:執(zhí)行命令,構(gòu)建對象
docker build -t hello-docker . //-t 用于指定鏡像的name:tag,沒有指定tag則是latest。 //. 代表Dockerfile 所在的路徑,這里是當(dāng)前目錄
結(jié)果如下:
如果鏡像倉庫或者標(biāo)簽錯了的話,可以使用如下命令進行修改 docker tag IMAGE ID name:tag 例: docker tag 1786dad83d25 hello-docker:1.0.0
結(jié)果如下:
這里需要注意的是“docker tag”是新建一個標(biāo)簽用于目標(biāo)鏡像指向源鏡像,所以我們記得刪除原來的標(biāo)簽
docker rmi name:tag 例:docker rmi hello-docker:latest
溫馨提示:當(dāng)前目錄應(yīng)該有Dockerfile和app.js才可用上面命令構(gòu)建成功
docker run -d -p 8003:3000 IMAGE ID
注意事項:
-p IP:host_port:container_port 或 -p IP::port 來指定允許訪問容器的主機上的 IP、接口等,我這里只允許外部8080端口來訪問3000端口
-d 就是在后臺運行容器,并返回容器ID。有興趣的小伙伴可以體驗一下有-d和沒-d的區(qū)別
這時我們輸入http://localhost:8003/就可以訪問了我們剛剛啟的服務(wù)了。
另外我們可以通過docker ps 來查看當(dāng)前所有啟動的容器。
接下來我們進入容器中看看這個容器到底有什么東西!
docker exec -it/bin/bash
進入容器中我們就看到了剛剛我們之前在Dockerfile建的helloDocker文件夾,進去之后發(fā)現(xiàn)了我們的app.js.執(zhí)行exit命令就可以退出容器。
Docker 數(shù)據(jù)卷的使用??到這里我們已經(jīng)掌握了如何去制作一個鏡像以及如何啟動一個鏡像了,接下來我們要說點難一點的東西Docker數(shù)據(jù)卷的使用。首先說一下什么是卷,為什么要引入卷這個東西。
??這邊我們拿前端開發(fā)來說,我們在前端開發(fā)中,我們的js、css以及一些圖標(biāo)等等這些靜態(tài)資源,這些文件都是可以直接在url輸入地址直接訪問到的,本身這些東西不會影響項目的運行,說點通俗點就是我們的這些資源怎么整不會讓服務(wù)器報500錯誤.按照我們前面的方法去做的話,肯定之間把這些文件全部打到鏡像里面,但是這個方法有個很不好的地方的。就是我們每次修改他們都需要重新打一次鏡像,就感覺很繁瑣。于是我們就想,我們能不能把這次靜態(tài)資源從鏡像中抽離出來,我們讓容器指向這個目錄,然后我們的服務(wù)就可以訪問這些資源,每次改變完之后我們就不需要重新打鏡像了,這樣豈不是很好。正因為如此我們的數(shù)據(jù)卷就出來了,用來解決這個問題,那么什么是數(shù)據(jù)卷呢?我們用一句話來闡述就是“數(shù)據(jù)卷是一個可供一個或多個容器使用的特殊目錄?!苯酉聛砦覀儗嶋H操作一把。
app.js的內(nèi)容如下:
var express = require("express"); var app = express(); //設(shè)置public目錄為靜態(tài)目錄 app.use(express.static("public")); //監(jiān)聽3000端口 app.listen(3000);
package.json內(nèi)容如下(主要目的是安裝express,自己可以npm init自己生成一下,不必抄我的):
{ "name": "docker", "version": "1.0.0", "description": "docker test", "main": "app.js", "scripts": { "test": "echo "Error: no test specified" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "express": "^4.15.3" } }第二步:在myDocker同級目錄下,新建一個public目錄,放張圖片進去,這里我放了一張美女圖片(hhh)。 第三步:在myDocker同級目錄下新建一個Dockerfile,內(nèi)容如下:
#設(shè)置基礎(chǔ)鏡像 FROM daocloud.io/library/node:latest #維護者信息 MAINTAINER wuming [email protected] #在容器中新建一個myDocker文件中 RUN mkdir myDocker #將Dockerfile所在目錄中myDocker文件夾的內(nèi)容加到目標(biāo)容器中的myDocker文件夾中 ADD myDocker /myDocker #設(shè)置工作目錄 WORKDIR /myDocker #執(zhí)行安裝項目依賴包的命令 RUN npm install #容器啟動時,執(zhí)行node app.js CMD node app.js第四步:構(gòu)建一個名為my-docker的鏡像
當(dāng)前目錄結(jié)構(gòu)為:
myDocker
??----Dockerfile
??----myDocker
????----app.js
????----package.json
??----public
構(gòu)建命令
docker build -t my-docker:latest .第五步:以掛載方式啟動容器
docker run -d -p 8003:3000 -v /Users/wuming/dockerWorkpace/myDocker/public:/myDocker/public my-docker:latest
這里我將本機的myDocker下的public掛載到容器中的/myDocker/public下,這里我們可以登入容器中看一下,會發(fā)現(xiàn)我們鏡像并沒有將我們的public目錄打包進去,但是我們的容器中卻有這個public目錄。
在游覽器地址欄中輸入http://localhost:8003/test.jpg便可看見,如下效果:
大家可以往自己的本機的public丟圖片進去,再去訪問它試試看,以及看看容器中的public沒有動態(tài)改變,答案是可以的。
上面我們已經(jīng)實現(xiàn)了數(shù)據(jù)卷,但是我們發(fā)現(xiàn)加入如果我要起多個容器服務(wù),時間短還能記得這個容器掛載目錄,要是時間多了豈不是都忘了,而且每次這樣去掛載也挺麻煩的,我們能不能把我們已經(jīng)配好數(shù)據(jù)卷的容器作為一個數(shù)據(jù)卷的提供者呢?答案是可以的,這就是我們要說的數(shù)據(jù)卷容器,接下來我們操作一下。
docker run -d -p 8005:3000 --volumes-from NAMES或者CONTAINER ID my-docker:latest
上面的NAMES或者CONTAINER ID為我們配好的數(shù)據(jù)卷的容器。啟動完容器之后,我們可以訪問試一下,并且往掛載目錄丟點其他圖片進去,看看兩個容器服務(wù)是不是都可以訪問到。答案是可以的。使用網(wǎng)絡(luò) 外部訪問容器
-p <端口號(8003)>:<端口號(3000)>
任何ip地址的指定<端口號(8003)>都可以訪問到服務(wù)(前提是那ip地址對應(yīng)的主機要起了這個服務(wù))
-p<端口號(8003)>:<端口號(3000)>
指定ip地址的<端口號(8003)>都可以訪問到服務(wù)(前提是那ip地址對應(yīng)的主機要起了這個服務(wù)),比如指定127.0.0.1,只有本機輸入127.0.0.1:8003或者localhost:8003可以訪問自己的服務(wù),但是其他同一個局域網(wǎng)的手機輸入本機的對應(yīng)局域網(wǎng)的ip地址:8003是訪問不到的,小伙們可以拿自己的手機試試。
Docker常用命令 1.殺死所有正在運行的容器docker kill $(docker ps -a -q)2.刪除所有已經(jīng)停止的容器
docker rm $(docker ps -a -q)3.刪除所有鏡像
docker rmi $(docker images -q)4.關(guān)閉容器
docker stop CONTAINER ID或者NAMES5.重新啟動關(guān)閉的容器
docker start CONTAINER ID或者NAMES6.移除本地容器
docker rm CONTAINER ID或者NAMES7.查看本地容器
docker ps //查看正在運行的容器 docker ps -a //查看所有容器8.查看本地鏡像
docker images9.創(chuàng)建鏡像
docker build -t name:tag Dockerfile路徑10.修改本地鏡像標(biāo)記
docker tag IMAGE ID name:tag docker rmi name:tag11.刪除本地鏡像
docker rmi name:tag或者IMAGE ID12.進入容器
docker exec -it IMAGE ID或者NAMES /bin/bash13.獲取鏡像中心的鏡像
docker pull name:tag14.獲取容器的端口映射配置
docker port CONTAINER ID或者NAMES
持續(xù)更新更新....
Dockerfile命令速查表 FROM 命令FROM:
用于設(shè)置基礎(chǔ)鏡像,一般是Dockerfile的第一句。
如果沒有指定 tag ,則默認(rèn)tag是latest。
MAINTAINER
用來指定維護者的姓名和聯(lián)系方式。
RUNRUN或 RUN ["executable", "param1", "param2"]
每條 RUN 指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像。
ADDADD
將
COPY
復(fù)制本地主機的
ENTRYPOINT ["executable", "param1", "param2"] :推薦使用的 exec 形式 ENTRYPOINT command param1 param2 :shell 形式
配置容器啟動后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋。
一個 Dockerfile 中只能有一個 ENTRYPOINT,如果有多個,則最后一個生效。
CMD ["executable","param1","param2"] 使用 exec 執(zhí)行,推薦方式; CMD command param1 param2 在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用; CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認(rèn)參數(shù);
指定啟動容器時執(zhí)行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會被執(zhí)行。
如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。
WORKDIRWORKDIR /path/to/workdir
為后續(xù)的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,后續(xù)命令如果參數(shù)是相對路徑,則會基于之前命令指定的路徑。例如
WORKDIR /a WORKDIR b WORKDIR c RUN pwd
則最終路徑為 /a/b/c 。
EXPOSEEXPOSE[ ...]
告訴 Docker 服務(wù)端容器暴露的端口號,供互聯(lián)系統(tǒng)使用。
例如 EXPOSE 8080 3000,開放 8080 和 3000 端口。
ENV
指定一個環(huán)境變量,會被后續(xù) RUN 指令使用,并在容器運行時保持。
VOLUMEVOLUME ["/data"]
創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等。
USERUSER
為容器內(nèi)指定 CMD RUN ENTRYPOINT 命令運行時的用戶名或UID。
ONBUILDONBUILD [INSTRUCTION]
配置當(dāng)所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時,所執(zhí)行的操作指令。
例如,利用Dockerfile創(chuàng)建了一個鏡像A,其中Dockerfile中有這么幾個命令
ONBUILD RUN mkdir test ONBUILD ADD app.js /test/app.js
那么鏡像B基于鏡像A去構(gòu)建的時候,默認(rèn)會在最后加上這兩行命令
FROM 鏡像A RUN mkdir test ADD app.js /test/app.js
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26929.html
摘要:如果遇到非常的復(fù)雜的匹配,正則表達式的優(yōu)勢就更加明顯了。關(guān)于正則表達式書寫規(guī)則,可查看,上面說的很清楚了,我就不貼出來了。替換與正則表達式匹配的子串,并返回替換后的字符串。結(jié)語正則表達式并不難,懂了其中的套路之后,一切都變得簡單了。 前言 在正文開始前,先說說正則表達式是什么,為什么要用正則表達式?正則表達式在我個人看來就是一個瀏覽器可以識別的規(guī)則,有了這個規(guī)則,瀏覽器就可以幫我們判斷...
摘要:從入門到放棄是什么,黑歷史,不講,自己百度去。類你沒有看錯,這里面的就沒有問題的。之前我們用過,和有了,再也不用這兩個貨了。一個函數(shù),可以遍歷狀態(tài)感覺就是狀態(tài)機,好吧不說了再說就懵逼了。 ES6從入門到放棄 1.ES6是什么,黑歷史,不講,自己百度去。 2.在瀏覽器中如何使用? 1.babel babeljs.io在線編譯 2.traceur-----Google出的編譯器,把E...
摘要:但監(jiān)聽器要在事件源上實現(xiàn)接口也就是說,直接用一個類實現(xiàn)和接口是監(jiān)聽不到內(nèi)對象的變化的。 什么是監(jiān)聽器 監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖?,?dāng)被監(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個方法將立即被執(zhí)行。。 為什么我們要使用監(jiān)聽器? 監(jiān)聽器可以用來檢測網(wǎng)站的在線人數(shù),統(tǒng)計網(wǎng)站的訪問量等等! 監(jiān)聽器組件 監(jiān)聽器涉及三個組件:事件...
摘要:注解在類上為類提供一個全參的構(gòu)造方法,加了這個注解后,類中不提供默認(rèn)構(gòu)造方法了。這個注解用在類上,使用類中所有帶有注解的或者帶有修飾的成員變量生成對應(yīng)的構(gòu)造方法。 轉(zhuǎn)載請注明原創(chuàng)地址:http://www.54tianzhisheng.cn/2018/01/07/lombok/ showImg(http://ohfk1r827.bkt.clouddn.com/blog/180107/7...
摘要:縮進不一致,會導(dǎo)致運行錯誤。變量變量在使用前必須先定義即賦予變量一個值,否則會報錯數(shù)據(jù)類型布爾只有和兩個值,表示真或假。 簡介 Python 是一種高層次的結(jié)合了解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言。Python 由 Guido van Rossum 于 1989 年底在荷蘭國家數(shù)學(xué)和計算機科學(xué)研究所發(fā)明,第一個公開發(fā)行版發(fā)行于 1991 年。 特點 易于學(xué)習(xí):Python ...
閱讀 2805·2021-11-17 09:33
閱讀 4483·2021-09-22 15:57
閱讀 2879·2019-08-30 14:16
閱讀 3142·2019-08-29 14:07
閱讀 2421·2019-08-26 11:55
閱讀 3435·2019-08-23 17:07
閱讀 1733·2019-08-23 16:50
閱讀 2545·2019-08-23 16:08