Docker & Kubenetes 系列一:快速上手docker

本篇文章將會講解:docker是什麼?docker的安裝,建立一個docker鏡像,運行咱們建立的docker鏡像,發佈本身的docker鏡像至中央倉庫。html

Docker是什麼

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的安裝

docker的安裝能夠參照相關文檔。以mac爲例,打開瀏覽器搜索docker for mac 下載安裝文件,而後安裝便可,十分簡單。若是安裝的home brew的話就更簡單了,直接運行以下命令便可:編程

brew cask install docker

windows電腦安裝docker可能稍微麻煩點,若是你在你的電腦上安裝完成以後,能夠輸入以下命令:windows

$ docker --version
Docker version 19.03.5, build 633a0ea

能夠看到安裝成功了。瀏覽器

Docker鏡像建立

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/2Step 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有以下三個步驟:

  1. 註冊dockerhub帳號。
  2. 在命令行執行docker login docker.io登陸你的帳號。
  3. 執行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 系列四:集羣,擴容,升級,回滾
alt 逃離沙漠公衆號

相關文章
相關標籤/搜索