回覆列表
  • 1 # 騰訊技術工程

    1、docker是什麼

    Docker使用go基於linux lxc(linux containers)技術實現的開源容器,誕生於2013年年初,最開始叫dotcloud公司,13年年底改名為docker inc。

    2017年下載次數達到了百億次,估值達13億美元,透過對應用封裝(Packaging)、分發(Distribution)、部署(Deployment)、執行(Runtime)全生命週期管理,達到“一次封裝,到處執行”

    為何使用docker?

    Docker直譯碼頭工人,將各種大小和形狀的物品裝進船裡。這對從事軟體行業的人來說,聽起來很熟悉,花了大量時間和精力把一個應用放在另一個應用裡。

    docker出現之前,對不同環境的安裝、配置、維護工作量很多,如部署,配置檔案,crontab,依賴等等。使用docker,無需關心環境,只需要一些配置就能構建映象,而部署則用一條run命令。

    虛擬機器VS容器

    虛擬機器需要有額外的虛擬機器管理應用和虛擬機器作業系統層,作業系統層不僅佔用空間而且執行速度也相對慢。docker容器是在本機作業系統層面上實現虛擬化,因此很輕量,速度接近原生系統速度。

    虛擬機器啟動速度是分鐘級別,效能較弱、記憶體和硬碟佔用大,一個物理機最多跑幾十個虛擬機器,但它的隔離性比較好。docker啟停都是秒級實現,記憶體和硬碟佔用非常小,單機支援上千個容器,在ibm伺服器上可執行上萬個容器。容器跟虛機相比,有著巨大的優勢。

    docker優點

    只關心應用:以往我們需要關心作業系統、軟體、專案,有了docker我們可以只關心應用而不是作業系統,docker發展迅速,基於docker的paas平臺也層出不窮,使得我們能更方便的使用docker;

    快速交付:docker可在秒級提供沙箱環境,開發,測試,運維使用完全相同的環境來部署程式碼

    微服務:docker有助於將一個複雜系統分解,讓使用者用更離散的方式思考服務

    離線開發:將服務編排在筆記本中移動辦公,使用docker可在本機秒級別啟動一個本地開發環境;

    降低除錯成本:在測試和上線時產生無效的類、有問題的依賴、缺少的配置等問題,docker可讓一個問題除錯和環境重現變得更簡單;

    CD:docker讓持續交付實現變得更容易,特別是對於藍綠部署就更簡單。

    第一版上線時,需要上第二版新功能,兩個版本功能會有衝突,這時用docker實現藍綠部署就非常方便了;

    如:可以部署兩個版本同時線上,新版本測試沒問題了把老版本流量切到新版本就可以了

    遷移:可以很快的遷移到其他雲或伺服器

    與傳統虛擬機器方式相比,容器化方式在很多場景下都是存在極為明顯的優勢。無論是開發、測試、運維都應該儘快掌握docker,儘早享受其帶來的巨大便利;

    容器化方式在很多場景下都有極大的優勢。無論是開發、測試、運維都應該儘快掌握docker,儘早享受其帶來的巨大便利。

    概念

    再來了解docker非常關鍵的概念,這樣才能理解docker容器整個生命週期。

    概念-映象

    映象(類)=檔案系統+資料,我常常用開發語言中的類比作映象,物件比作容器映象由多個層加上一些docker元資料組成,容器執行著由映象定義的系統。

    概念-容器

    容器(物件)=映象執行例項

    容器是映象的執行例項,可以使用同一個映象執行多個例項。如圖所示,一個ubuntu docker映象產生了三個ubuntu容器,docker利用容器執行和隔離應用。

    從讀寫角度來說,映象是隻讀的,容器是在映象上添加了一層可讀寫的檔案系統。

    概念-層

    層=檔案變更集合

    像傳統虛機應用,每個應用都需要複製一份檔案副本,執行成百上千上磁碟空間會迅速耗光,而docker採用寫時複製來減少磁碟空間,當一個執行中的容器要寫入一個檔案時,它會把該檔案複製到新區域來記錄這次的修改,在執行docker提交時將這次修改記錄下併產生一個新的層。docker分層解決大規模使用容器時碰到的磁碟和效率問題。

    概念-倉庫

    docker借鑑了大量git優秀的經驗。docker倉庫分公有庫和私有庫,最大的公開倉庫是docker hub,國內也有很多倉庫源。

    2、建立第一個docker應用

    透過建立一個docker應用來看看docker是怎麼方便使用的。

    建立docker映象方式

    建立docker有四種方式

    但最常用的docker命令+手工提交和Dockerfile的方式

    對於我們來說Dockerfile是最常用也是最有用的。

    那建立一個docker應用只需要三步:編寫dockerfile、構建映象、執行容器

    編寫dockerfile

    那我們就開始用dockerfile來建立一個應用

    Dockerfile是包含一系列命令的文字檔案,這個檔案包含6條命令

    1、FROM是使用php官方映象,左邊是映象名字,右邊是標籤名字,標籤名字不寫預設是latest

    2、宣告維護人員

    3、RUN執行一條linux命令,我們把php程式碼重定向到/tmp/index.php

    4、EXPOSE宣告要開放的埠

    5、WORKDIR啟動容器後預設目錄

    6、CMD容器啟動後,預設執行的命令,相當於應用的入口,用php自帶的webserver監聽8000

    構建映象

    使用docker build命令生成映象,—tag指定映象的名字,左邊是名字,右邊是標籤,最後有個.表示在當前目錄查詢Dockerfile。可以看到,每個命令都會有個輸入輸出,輸入是命令,輸出是給到層的id,所以,基本上每個命令都會產生一個層。最後提示映象構建成功,並打上映象標籤。

    執行容器

    第三,使用docker run命令執行映象,-p將容器的8000埠對映到本機8000埠,—name給容器起個名字。用curl對本機8000埠請求,伺服器返回當前時間,說明我們構建的容器執行成功了。

    請求本地8000埠,伺服器返回當前時間

    dockerfile常用命令

    其實Dockerfile常用命令就5個:from、add、run、workdir、cmd

    建立docker應用步驟

    •編寫dockerfile

    •構建映象

    •執行容器

    使用docker應用步驟

    •拉取映象

    •執行容器

    dockerfile最佳實踐

    •精簡映象用途

    儘量讓每個映象的用途單一

    •選擇合適基礎映象

    選擇以alpine、busybox等基礎的映象

    busybox:號稱作業系統裡的瑞士軍刀,只有……這麼大,但卻有一百多常用命令

    如果你的目標是小而精,busybox是首選,因為它已經精簡到沒有bash,使用的是ash,一個相容posix的shell

    Alpine:你的目標是小但是又有一些工具的話,可以選擇alpine,它是一個面向安全的輕量linux發行版,它關注安全、效能和資源效能,比busybox功能更完善,還提供apk查詢和安裝軟體包,大小隻有2-3兆。

    很多官方的映象都有alpine的映象,像剛剛使用的php映象。

    •提供維護者資訊

    •正確使用版本

    使用明確的版本號,而非依賴於預設的latest,避免環境不一致導致的問題

    如安裝軟體後的安裝包,如上圖2、3步驟

    •提高生成速度

    如內容不變的指令儘量放在前面,這樣可以複用

    •減少映象層數

    多條命令寫在一起,使生成的映象層數少,如上圖2、3步驟

    •恰當使用multi-stage

    保證最終生成映象最小化

    3、常用命令

    想使用一個映象,用這個命令就可以了,預設按評分排序。official如果是ok表示是官方鏡,Auto標示它是否用dickerfile進行自動化映象構建。

    pull

    一旦確定一個映象,透過對其名稱執行docker pull來下載。標籤預設是latest,嚴格來講,映象的倉庫名還應該新增倉庫地址的,預設是registry.hub.docker.com Docker images命令查詢下載的映象。

    run

    使用docker run執行一個容器,it表示用互動式方式執行,最後表示要執行的命令。

    其實更常用的方式是以後臺方式來執行,這時用d引數在後臺執行,執行後用exec命令進去到容器。

    tag

    Docker tag給映象一個新tag名字。

    Docker images檢視centos映象,把centos:latest打上centos:yeedomliu,這時再看會有3個centos,latest和yeedomliu的映象id是相同的。把centos:yeedomliu刪除,再檢視latest還會存在,最後用rmi命令刪除latest就會真正把latest映象刪除掉。如果相同映象存在多個標籤,只有最後一次的rmi命令會真正刪除映象。

    ps

    Ps可以檢視執行中的容器

    rmi

    rm

    diff

    容器啟動後文件變化情況

    logs

    檢視容器執行後的日誌

    cp

    我們想從容器裡面複製檔案到宿主機,或相反的過程就可以用到cp命令

    container prune

    隨著使用docker時間越長,停止狀態下的容器會越來越多,這些都會佔據磁碟空間

    image prune

    未被打標籤的映象可以用image prune命令清理

    system prune/df

    如果你覺得剛剛兩條命令執行起來麻煩,可以用docker system prune一條命令搞定

    另外用system df檢視docker磁碟空間

    實戰

    瞭解了docker基礎知識後,可進入相對實戰的環節

    •本地開發

    我們的專案使用了很多服務,如redis/mysql/mongodb等等,如果一個個執行起來,還加上配置,容易出手,也比較麻煩

    kitematic:與使用命令列管理本地容器相比,你更想使用圖形工具對容器管理,官方推出的容器管理工具,透過它可以查詢映象、建立容器、配置、啟停容器等管理。

    這是配置容器埠和宿主機埠,目錄,網路等對映介面

    docker-compose

    compose定位是“定義和執行多個docker容器的應用”,前身fig,目前仍然相容fig格式的模板檔案。

    一條命令可以把一個複雜的應用啟動起來

    日常工作中,經常碰到多個容器相互完成某項任務

    docker-compose示例1

    預設模板檔名叫docker-

    compose.yml

    ,結構很簡單,每個頂級元素為服務名稱,次級資訊為配置資訊。這裡使用了redis/mongodb/mysql/nginx映象,分別給它們映射了本地目錄、埠、密碼等資訊,nginx映象需要使用redis/mysql等服務,用links命令連線進來。

    docker-compose示例2

    如果在本地開發,每個專案都可以像之前說的那樣配置,這裡提供了另外一種做法。我把公共的資源在一開始就啟動,每個專案裡只啟動nginx映象並關聯其它的服務即可。

    公共服務compose

    專案compose

    •常見問題

    主程序:docker啟動第一個程序稱主程序,就是id為1的程序,這個程序退出就意味著容器退出,所以想要使docker作為服務使用,這個程序是不能退出的。expose命令是宣告暴露的埠,執行時用-P才會生效。一般ports命令是做真正的埠對映,比較常用。

    •架構

    安裝了docker的主機,一般在一個私有網路上

    1、呼叫docker客戶端可以從守護程序獲取資訊或傳送指令

    2、docker守護程序使用http協議接收來自docker客戶端的請求

    3、私有docker註冊中心儲存docker映象

    4、docker hub是由docker公司運營的最大的公共註冊中心

    網際網路上也存在其他公共的註冊中心

    呼叫 Docker客戶端可以從守護程序獲取資訊或給它傳送指令。守護程序是一個伺服器,它使用 HTTP協議接收來自客戶端的請求並返回響應。相應地,它會向其他服務發起請求來發送和接收映象,使用的同樣是 HTTP協議。該伺服器將接收來自命令列客戶端或被授權連線的任何人的請求。守護程序還負責在幕後處理使用者的映象和容器,而客戶端充當的是使用者與 REST風格 API之間的媒介。

    理解這張圖的關鍵在於,當用戶在自己的機器上執行 Docker時,與其進行互動的可能是自己機器上的另一個程序,或者甚至是執行在內部網路或網際網路上的服務。

    •最佳化

    使用小映象:一般來說,使用小的映象都相對比較優秀,如官方的映象基本上都有基於alpine的映象

    命令寫一行:多個命令儘量寫在一起有助於減少層數,也會減少映象的大小

    指令碼安裝:使用指令碼進行初始化時,可以有效減少dockerfile的命令,同時帶來另外的問題,可讀性不好並且構建映象時快取不了

    扁平化映象:構建映象過程中,可能會涉及到一些敏感資訊,或者用了上面的辦法映象依然很大,可以試試這個辦法

    docker export 容器名或容器id | docker import - 映象標籤

    multi-stage:從docker 17.05版本開始,docker支援multi-stage(多階段構建),特別適合編譯型語言,如我在一個映象下編譯,在另外一個很小的系統執行,如下圖,go專案在golang環境下編譯,在alpine環境下執行。

  • 中秋節和大豐收的關聯?
  • 增廣賢文全文及解釋?