1. 程式人生 > >Docker 入門,看這篇就夠了

Docker 入門,看這篇就夠了

Docker是怎麼出現的

關於Docker的發展史,本文就不做介紹,有興趣的小夥伴們可以檢視這篇文章,挺有意思的。http://www.oschina.net/news/57838/docker-dotcloud

什麼是Docker?

在Docker之前,我們肯定要先了解Docker是什麼。官網的介紹是“Docker is the world’s leading software container platform.”官方給Docker的定位是一個應用容器平臺。至於為什麼要做這個Docker,官網上還有這麼一句話"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很像。那麼它這樣做是要解決現實中什麼問題,我列舉幾個情況。

1.合作開發的時候,在本機可以跑,別人的電腦跑不起來。

這裡我們拿java Web應用程式舉例,我們一個java Web應用程式涉及很多東西,比如jdk、tomcat、spring等等。當這些其中某一項版本不一致的時候,可能就會導致應用程式跑不起來這種情況。Docker則將程式直接打包成映象,直接執行在容器中即可。

2.伺服器自己的程式掛了,結果發現是別人程式出了問題把記憶體吃完了,自己程式因為記憶體不夠就掛了。

這種也是一種比較常見的情況,如果你的程式重要性不是特別高的話,公司基本上不可能讓你的程式獨享一臺伺服器的,這時候你的伺服器就會跟公司其他人的程式共享一臺伺服器,所以不可避免地就會受到其他程式的干擾,導致自己的程式出現問題。Docker就很好解決了環境隔離的問題,別人程式不會影響到自己的程式。

3.公司要弄一個活動,可能會有大量的流量進來,公司需要再多部署幾十臺伺服器。

在沒有Docker的情況下,要在幾天內部署幾十臺伺服器,這對運維來說是一件非常折磨人的事,而且每臺伺服器的環境還不一定一樣,就會出現各種問題,最後部署地頭皮發麻。用Docker的話,我只需要將程式打包到映象,你要多少臺服務,我就給力跑多少容器,極大地提高了部署效率。

Docker與虛擬機器的區別

關於Docker與虛擬機器的區別,我在網上找到的一張圖,非常直觀形象地展示出來,話不多說,直接上圖。

比較上面兩張圖,我們發現虛擬機器是攜帶作業系統,本身很小的應用程式卻因為攜帶了作業系統而變得非常大,很笨重。Docker是不攜帶作業系統的,所以Docker的應用就非常的輕巧。另外在呼叫宿主機的CPU、磁碟等等這些資源的時候,拿記憶體舉例,虛擬機器是利用Hypervisor去虛擬化記憶體,整個呼叫過程是虛擬記憶體->虛擬實體記憶體->真正實體記憶體,但是Docker是利用Docker Engine去呼叫宿主的的資源,這時候過程是虛擬記憶體->真正實體記憶體。

Docker安裝

Docker的安裝非常簡單,官網上都給出了具體的安裝步驟,都是視覺化的安裝,三步就搞定了。這裡我就不細說了,附上Docker的官網安裝教程地址。

Mac:https://docs.docker.com/docker-for-mac/install/#install-and-run-docker-for-mac

Windows:https://docs.docker.com/docker-for-windows/install/#install-docker-for-windows

linux的話,官網有不同版本的安裝的教程,這裡放上ubuntu的安裝教程,其他小夥們自行檢視。

ubuntu:https://docs.docker.com/engine/installation/linux/ubuntu/#install-docker

Docker三個基本概念

下面這張圖非常的經典,很形象地展示了,什麼是容器,什麼是映象,什麼是倉庫,以及三者之間的聯絡。

接下來我們來解釋一下這張圖。現在我們要造一間廚房,在造之前我們首先要乾的一件事,就是先列舉出我們造廚房需要的東西。我們可能需要一個通了水電煤的房子以及一些必需的廚房用具諸如鍋碗瓢勺、煤氣灶、冰箱、水槽等等這些東西。現在我們知道需要了什麼東西之後,我們就去找這些東西。首先我們先去京東購買一些廚房用具,這些用具就好比我們的Docker映象,我們廚房的用具到了之後得找個地方把它們放在,不可能隨處丟吧,不然後面用的時候就找不到它了,那麼我們Docker映象也是這樣,需要一個Docker倉庫去儲存這些映象。現在我們有了這些廚房用具之後就可以做飯了嗎?答案當然是不能,沒水沒電沒火啊!這時候我們得把廚房用具給裝到一個通了水電煤的房子才行,那麼Docker映象也是這樣,單純的Docker映象是不能用的,它得裝到Docker容器中通了水電煤才能使用。等我們裝好了廚房用具之後我們就可以開始做飯,那麼我們的Docker映象裝到Docker容器之後,我們應用就可以跑起來了。

我的第一個Docker映象

上面的文章中,我們瞭解了一下Docker,接下來我們學著做一個屬於自己的Docker映象。

第一步:從映象中心下載一個Node映象

  1.    a).去http://hub.daocloud.io/上找到Node映象地址並執行如下命令

  2.      docker pull daocloud.io/library/node:標籤

  3.    b).檢視本地庫的Docker映象,是否下載完成

  4.      docker images

結果如下:

第二步:寫一個app.js

app.js的內容如下,內容很簡單,作用也很簡單,起一個80埠的服務,頁面顯示“Hello Docker”。

  1. var http =require('http');

  2. http.createServer(function(request, response){

  3. // 傳送 HTTP 頭部

  4. // HTTP 狀態值: 200 : OK

  5. // 內容型別: text/plain

  6.    response.writeHead(200,{'Content-Type':'text/plain'});

  7. // 傳送響應資料 "Hello World"

  8.    response.end('Hello Docker\n');

  9. }).listen(3000);

  10. // 終端列印如下資訊

  11. console.log('Server running at http://127.0.0.1:3000/');

第三步:寫一個Dockerfile,用於構建映象

  1. #依賴的映象

  2. FROM daocloud.io/library/node:latest

  3. #映象建立者的資訊

  4. MAINTAINER wuming "[email protected]"

  5. #執行mkdir helloDocker建立一個helloDocker資料夾

  6. RUN mkdir helloDocker

  7. #將app.js新增到helloDocker資料夾中

  8. ADD app.js  helloDocker

  9. #容器執行時啟動的命令,下面命令等價於 CMD node /helloDocker/app.js

  10. CMD ["node","/helloDocker/app.js"]

第四步:執行命令,構建物件

  1. docker build -t hello-docker .

  2. //-t 用於指定映象的name:tag,沒有指定tag則是latest。

  3. //. 代表Dockerfile 所在的路徑,這裡是當前目錄

結果如下:

如果映象倉庫或者標籤錯了的話,可以使用如下命令進行修改

  1. docker tag IMAGE ID name:tag

  2. //例: docker tag 1786dad83d25 hello-docker:1.0.0

結果如下:

這裡需要注意的是“docker tag”是新建一個標籤用於目標映象指向源映象,所以我們記得刪除原來的標籤

  1. docker rmi name:tag

  2. //例:docker rmi hello-docker:latest

溫馨提示:當前目錄應該有Dockerfile和app.js才可用上面命令構建成功

我的第一個Docker容器

  1. docker run  -d -p 8003:3000 IMAGE ID

注意事項:

  1. -p IP:hostport:containerport 或 -p IP::port 來指定允許訪問容器的主機上的 IP、介面等,我這裡只允許外部8080埠來訪問3000埠

  2. -d 就是在後臺執行容器,並返回容器ID。有興趣的小夥伴可以體驗一下有-d和沒-d的區別

這時我們輸入http://localhost:8003/就可以訪問了我們剛剛啟的服務了。

另外我們可以通過*docker ps *來檢視當前所有啟動的容器。

接下來我們進入容器中看看這個容器到底有什麼東西!

  1. docker exec-it <CONTAINER ID 或者 NAMES>/bin/bash

進入容器中我們就看到了剛剛我們之前在Dockerfile建的helloDocker資料夾,進去之後發現了我們的app.js.執行exit命令就可以退出容器。

Docker 資料卷的使用

到這裡我們已經掌握瞭如何去製作一個映象以及如何啟動一個映象了,接下來我們要說點難一點的東西Docker資料卷的使用。首先說一下什麼是卷,為什麼要引入卷這個東西。

這邊我們拿前端開發來說,我們在前端開發中,我們的js、css以及一些圖示等等這些靜態資源,這些檔案都是可以直接在url輸入地址直接訪問到的,本身這些東西不會影響專案的執行,說點通俗點就是我們的這些資源怎麼整不會讓伺服器報500錯誤.按照我們前面的方法去做的話,肯定之間把這些檔案全部打到映象裡面,但是這個方法有個很不好的地方的。就是我們每次修改他們都需要重新打一次映象,就感覺很繁瑣。於是我們就想,我們能不能把這次靜態資源從映象中抽離出來,我們讓容器指向這個目錄,然後我們的服務就可以訪問這些資源,每次改變完之後我們就不需要重新打映象了,這樣豈不是很好。正因為如此我們的資料卷就出來了,用來解決這個問題,那麼什麼是資料卷呢?我們用一句話來闡述就是“資料卷是一個可供一個或多個容器使用的特殊目錄。”接下來我們實際操作一把。

資料卷

第一步:我們建立一個myDocker檔案,裡面包含兩個檔案app.js和package.json

app.js的內容如下:

  1. var express =require('express');

  2. var app = express();

  3. //設定public目錄為靜態目錄

  4. app.use(express.static('public'));

  5. //監聽3000埠

  6. app.listen(3000);

package.json內容如下(主要目的是安裝express,自己可以npm init自己生成一下,不必抄我的):

  1. {

  2. "name":"docker",

  3. "version":"1.0.0",

  4. "description":"docker test",

  5. "main":"app.js",

  6. "scripts":{

  7. "test":"echo \"Error: no test specified\" && exit 1"

  8. 相關推薦

    no