本篇文章將會講解:docker是什麼?docker的安裝,建立一個docker鏡像,運行咱們建立的docker鏡像,發佈本身的docker鏡像至中央倉庫。html
docker是什麼?咱們在谷歌翻譯中輸入單詞docker獲得的解釋是:碼頭工人,搬運工人。碼頭是什麼樣?咱們沒去過,但也在電視上見過,那裏有一個個藍色的、形狀大小都相同的集裝箱。它們從輪船卸載到碼頭,也從碼頭裝載到巨輪上而後運往遠方。每一艘輪船不須要關係集裝箱裏邊是什麼,你只須要把東西放進集裝箱。每一個集裝箱裏邊的東西是不同的,擺放也是不同的,溫度溼度可能都不同,可是在外面看起來他們是同樣的標準。因爲集裝箱都是同樣的標準,後面的運輸、卸載、管理等等環節都是標準化的。因此集裝箱發揮了巨大的力量,改變了整個運輸產業,也改變了人們的生活。想象一下若是沒有集裝箱,那些貨物都隨意堆放,怎麼裝載?怎麼運輸?就比如咱們家裏的東西不少,你找起來搬起來都不容易,若是整一個個小盒子裝起來就整齊多了。nginx
而咱們軟件的部署運維正須要這樣的「集裝箱模式」,在沒有docker以前爲了部署一個Java程序,咱們須要準備一個Linux服務器,而後在裏邊安裝JDK配置環境變量,根據應用的須要可能還須要安裝Tomcat,安裝MySQL等。若是須要繼續擴容,加3臺服務器,你得重複這個步驟。何其繁瑣,多麼麻煩啊?而後,由於環境不統一的問題,配置的問題致使「這個代碼在我電腦上運行是好的啊?怎麼不是到那個服務器上就出問題了」……所以,docker來了,她是軟件行業的集裝箱,裏邊裝載的是咱們的軟件,咱們只須要將應用定義爲一個Dockerfile建立成docker鏡像,而後這個docker鏡像就能夠想Java中的jar包同樣下載使用,這一切只須要運行幾個簡單的命令便可。程序員
docker的入門,咱們須要熟悉三個概念:Dockerfile , docker鏡像,鏡像倉庫。這一點Java程序員能夠類比爲pom文件,jar包,maven倉庫。spring
現在docker已經獲得了很是普遍的使用,各類基礎鏡像都十分穩定能夠直接使用,就像是各個編程語言的基礎類庫同樣拿來即用。主流應用落地方案都有成熟的docker容器化方案參考,不用再猶豫和懷疑了,是時候把咱們的應用都弄到集裝箱吧!咱們能夠在腦海中想一想一下Docker那個Logo,一條藍色的鯨魚,馱着一個個規格同樣的小箱子,整齊有序,乘風破浪。docker
docker的安裝能夠參照相關文檔。以mac爲例,打開瀏覽器搜索docker for mac
下載安裝文件,而後安裝便可,十分簡單。若是安裝的home brew的話就更簡單了,直接運行以下命令便可:編程
brew cask install docker
windows電腦安裝docker可能稍微麻煩點,若是你在你的電腦上安裝完成以後,能夠輸入以下命令:windows
$ docker --version Docker version 19.03.5, build 633a0ea
能夠看到安裝成功了。瀏覽器
docker環境安裝好以後,咱們能夠來建立一個鏡像。鏡像的建立是由一個Dockerfile開始的,根據dockerfile文件能夠打包出一個鏡像。就相似於你根據Java項目的pom文件的定義能夠打包出一個jar文件或者war文件。springboot
咱們來建立一個簡單的鏡像:裏邊運行一個ningx服務器,啓動以後能夠展現咱們定義的html內容。咱們來進行以下操做:服務器
$ mkdir docker-demo $ cd docker-demo $ echo '<h1>Hello world!!</h1>' > index.html $ touch Dockerfile
上面的幾行命令咱們建立了一個目錄,在目錄中建立了一個簡單的index.html,並建立了一個空的Dockerfile,咱們給Dockerfile中加入以下內容:
FROM nginx COPY index.html /usr/share/nginx/html
這是一個很是簡單的dockerfile了,dockerfile都長這樣,FROM
命令表示鏡像來自於哪一個基礎鏡像。就比如Java 項目pom文件中寫的spring-boot-stater的parent配置表示這個Java項目是基於springboot的那個版本。而第二行的COPY 命令則是將當前目錄的index.html文件拷貝到鏡像中/usr/share/nginx/html
目錄,這樣啓動鏡像以後就能夠看到這個頁面了。
下面咱們來建立這個鏡像,執行以下命令:
$ docker build . -t my-frist-demo:v1.0 Sending build context to Docker daemon 5.12kB Step 1/2 : FROM nginx latest: Pulling from library/nginx 54fec2fa59d0: Already exists 4ede6f09aefe: Already exists f9dc69acb465: Already exists Digest: sha256:86ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12 Status: Downloaded newer image for nginx:latest ---> 602e111c06b6 Step 2/2 : COPY index.html /usr/share/nginx/html ---> 823957e13591 Successfully built 823957e13591 Successfully tagged my-frist-demo:v1.0
運行這個命令可能須要等待幾秒鐘,從結果中能夠看出執行了兩步,Step 1/2
和Step 2/2
。命令也很簡單,docker build
表示要建立鏡像,後面的.
指定了構建「上下文」的文件的位置。-t
指定了鏡像的名字及標籤,對應本例中名字就是my-frist-demo
標籤是v1.0
。(若是你建立鏡像失敗了不要緊,繼續往下看)
上面咱們建立了docker鏡像,假設你也在本身電腦上建立成功了。下面咱們來啓動看看效果。執行以下命令:
$ docker run -d -p 8080:80 hellodm/my-first-demo:v1.0 705a41b2ced173d8e06100274f36ccfb7b504a5a615dfd8c9214e951c198f922
參數中-d
表示後臺運行,-p
指定了端口,這裏的8080:80表示將鏡像內部的nginx在80端口啓動,本機可以使用8080端口訪問。咱們能夠在瀏覽器中輸入http://localhost:8080/
,你能夠看到久違的「Hello world!!」。或者你可直接在命令行驗證:
$ curl 'http://localhost:8080/' <h1>Hello world! <h1>
如此,咱們的鏡像便運行成功了。這個時候我看能夠執行docker ps
命令查看鏡像運行狀態。若是想中止,執行docker stop 鏡像ID
便可,這裏的鏡像ID,在執行docker ps
的結果中能夠看到。
固然,若是你絕對建立鏡像麻煩,或者你建立鏡像失敗了,能夠直接拉去一個鏡像來運行看效果,下面會說到。
當你建立一個鏡像以後,能夠給上傳到中央倉庫dockerhub,方便別人使用,就是相似於你開發了一個軟件,能夠將軟件的exe
包或者dmg
包上傳到應用市場給別人使用。作Java的同窗能夠類比爲你執行了maven deploy
將項目發佈到maven倉庫給別人使用。
發佈鏡像到dockerhub有以下三個步驟:
docker login docker.io
登陸你的帳號。docker push
上傳你的鏡像。以筆者上面說的爲例,咱們本地打包的鏡像爲my-first-demo:v1.0,我註冊的dockerhub的ID爲hellodm
,這個hellodm
會成爲我發佈鏡像的一個「前綴」。我在上傳鏡像的時候執行了以下操做:
$ docker tag my-first-demo:1.0 hellodm/my-first-demo:v1.0 $ docker login docker.io $ docker push hellodm/my-first-demo:v1.0
如今,我這個hellodm/my-first-demo:v1.0
鏡像已經在dockerhub中了,你能夠去搜索hellodm/my-first-demo
。加入根據上面的步驟你沒能建立鏡像並運行,如今你能夠直接拉取個人鏡像運行了,這個鏡像就是上文建立的鏡像。執行以下命令:
$ docker pull hellodm/my-first-demo:v1.0 v1.0: Pulling from hellodm/my-first-demo 54fec2fa59d0: Pull complete 4ede6f09aefe: Pull complete f9dc69acb465: Pull complete cef8b33bc718: Pull complete Digest: sha256:a175b7f9f74265e538015ba0eb6987dffcfc529426ce148667537960aa0fbdb8 Status: Downloaded newer image for hellodm/my-first-demo:v1.0 docker.io/hellodm/my-first-demo:v1.0
如此,能夠看到拉取成功了,運行:
$ docker run -d -p 8080:80 hellodm/my-first-demo:v1.0 705a41b2ced173d8e06100274f36ccfb7b504a5a615dfd8c9214e951c198f922
跟以前同樣,下面的一行字符串是docker鏡像的ID,咱們能夠這樣看下效果:
$ curl 'http://localhost:8080/' <h1>Hello world! <h1>
也能夠執行docker ps
查看運行狀況,也能夠執行docker stop 705a41b2ced173
中止鏡像。
本文介紹了一下docker的概念,建立了一個docker鏡像,並啓動鏡像看了看效果,而後發佈鏡像到dockerhub,又從dockerhub拉取鏡像並運行。同時也瞭解了docker的幾個經常使用命令。
因爲本文標題是「Docker & k8s 系列」,所以後面會繼續講k8s的入門,應用部署到k8s,應用集羣,藍綠部署等。
Docker & k8s 系列二:本機k8s環境搭建
Docker & k8s 系列三:在k8s中部署單個服務實例
Docker & Kubenetes 系列四:集羣,擴容,升級,回滾