本篇文章將會講解:docker是什么?docker的安裝,創建一個docker鏡像,運行我們創建的docker鏡像,發布自己的docker鏡像至中央倉庫。
Docker是什么
docker是什么?我們在谷歌翻譯中輸入單詞docker得到的解釋是:碼頭工人,搬運工人。碼頭是什么樣?我們沒去過,但也在電視上見過,那里有一個個藍色的、形狀大小都相同的集裝箱。它們從輪船卸載到碼頭,也從碼頭裝載到巨輪上然后運往遠方。每一艘輪船不需要關系集裝箱里邊是什么,你只需要把東西放進集裝箱。每個集裝箱里邊的東西是不一樣的,擺放也是不一樣的,溫度濕度可能都不一樣,但是在外面看起來他們是一樣的標准。由於集裝箱都是一樣的標准,后面的運輸、卸載、管理等等環節都是標准化的。所以集裝箱發揮了巨大的力量,改變了整個運輸產業,也改變了人們的生活。想象一下如果沒有集裝箱,那些貨物都隨意堆放,怎么裝載?怎么運輸?就好比我們家里的東西很多,你找起來搬起來都不容易,如果整一個個小盒子裝起來就整齊多了。
而我們軟件的部署運維正需要這樣的“集裝箱模式”,在沒有docker之前為了部署一個Java程序,我們需要准備一個Linux服務器,然后在里邊安裝JDK配置環境變量,根據應用的需要可能還需要安裝Tomcat,安裝MySQL等。如果需要繼續擴容,加3台服務器,你得重復這個步驟。何其繁瑣,多么麻煩啊?然后,因為環境不統一的問題,配置的問題導致“這個代碼在我電腦上運行是好的啊?怎么不是到那個服務器上就出問題了”……因此,docker來了,她是軟件行業的集裝箱,里邊裝載的是我們的軟件,我們只需要將應用定義為一個Dockerfile創建成docker鏡像,然后這個docker鏡像就可以想Java中的jar包一樣下載使用,這一切只需要運行幾個簡單的命令即可。
docker的入門,我們需要熟悉三個概念:Dockerfile , docker鏡像,鏡像倉庫。這一點Java程序員可以類比為pom文件,jar包,maven倉庫。
如今docker已經得到了非常廣泛的使用,各種基礎鏡像都十分穩定可以直接使用,就像是各個編程語言的基礎類庫一樣拿來即用。主流應用落地方案都有成熟的docker容器化方案參考,不用再猶豫和懷疑了,是時候把我們的應用都弄到集裝箱吧!我們可以在腦海中想想一下Docker那個Logo,一條藍色的鯨魚,馱着一個個規格一樣的小箱子,整齊有序,乘風破浪。
Docker的安裝
docker的安裝可以參照相關文檔。以mac為例,打開瀏覽器搜索docker for mac
下載安裝文件,然后安裝即可,十分簡單。如果安裝的home brew的話就更簡單了,直接運行如下命令即可:
brew cask install docker
windows電腦安裝docker可能稍微麻煩點,如果你在你的電腦上安裝完成之后,可以輸入如下命令:
$ docker --version
Docker version 19.03.5, build 633a0ea
可以看到安裝成功了。
Docker鏡像創建
docker環境安裝好之后,我們可以來創建一個鏡像。鏡像的創建是由一個Dockerfile開始的,根據dockerfile文件可以打包出一個鏡像。就類似於你根據Java項目的pom文件的定義可以打包出一個jar文件或者war文件。
我們來創建一個簡單的鏡像:里邊運行一個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鏡像,假設你也在自己電腦上創建成功了。下面我們來啟動看看效果。執行如下命令:
$ 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
的結果中可以看到。
當然,如果你絕對創建鏡像麻煩,或者你創建鏡像失敗了,可以直接拉去一個鏡像來運行看效果,下面會說到。
Docker鏡像發布
當你創建一個鏡像之后,可以給上傳到中央倉庫dockerhub,方便別人使用,就是類似於你開發了一個軟件,可以將軟件的exe
包或者dmg
包上傳到應用市場給別人使用。做Java的同學可以類比為你執行了maven deploy
將項目發布到maven倉庫給別人使用。
發布鏡像到dockerhub有如下三個步驟:
- 注冊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 系列四:集群,擴容,升級,回滾