Docker總結

Docker總結

一.Docker簡介

1.問題:爲何會有docker出現

一款產品從開發到上線,從操做系統,到運行環境,再到應用配置。做爲開發+運維之間的協做咱們須要關心不少東西,這也是不少互聯網公司都不得不面對的問題,特別是各類版本的迭代以後,不一樣版本環境的兼容,對運維人員都是考驗 Docker之因此發展如此迅速,也是由於它對此給出了一個標準化的解決方案。 環境配置如此麻煩,換一臺機器,就要重來一次,費力費時。不少人想到,能不能從根本上解決問題,軟件能夠帶環境安裝?也就是說,安裝的時候,把原始環境如出一轍地複製過來。開發人員利用 Docker 能夠消除協做編碼時「在個人機器上可正常工做」的問題。java

以前在服務器配置一個應用的運行環境,要安裝各類軟件,就拿尚硅谷電商項目的環境來講吧,Java/Tomcat/MySQL/JDBC驅動包等。安裝和配置這些東西有多麻煩就不說了,它還不能跨平臺。假如咱們是在 Windows 上安裝的這些環境,到了 Linux 又得從新裝。何況就算不跨操做系統,換另外一臺一樣操做系統的服務器,要移植應用也是很是麻煩的。linux

傳統上認爲,軟件編碼開發/測試結束後,所產出的成果便是程序或是可以編譯執行的二進制字節碼等(java爲例)。而爲了讓這些程序能夠順利執行,開發團隊也得準備完整的部署文件,讓維運團隊得以部署應用程式,開發須要清楚的告訴運維部署團隊,用的所有配置文件+全部軟件環境。不過,即使如此,仍然經常發生部署失敗的情況。Docker鏡像的設計,使得Docker得以打破過去「程序即應用」的觀念。透過鏡像(images)將做業系統核心除外,運做應用程式所須要的系統環境,由下而上打包,達到應用程式跨平臺間的無縫接軌運做。nginx

2.docker理念

Docker是基於Go語言實現的雲開源項目。 Docker的主要目標是「Build,Ship and Run Any App,Anywhere」,也就是經過對應用組件的封裝、分發、部署、運行等生命週期的管理,使用戶的APP(能夠是一個WEB應用或數據庫應用等等)及其運行環境可以作到「一次封裝,處處運行」。web

Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用運行在 Docker 容器上面,而 Docker 容器在任何操做系統上都是一致的,這就實現了跨平臺、跨服務器。只須要一次配置好環境,換到別的機子上就能夠一鍵部署好,大大簡化了操做docker

解決了運行環境和配置問題的軟件容器,方便作持續集成並有助於總體發佈的容器虛擬化技術數據庫

3.以前的虛擬機技術

虛擬機(virtual machine)就是帶環境安裝的一種解決方案。 它能夠在一種操做系統裏面運行另外一種操做系統,好比在Windows 系統裏面運行Linux 系統。應用程序對此毫無感知,由於虛擬機看上去跟真實系統如出一轍,而對於底層系統來講,虛擬機就是一個普通文件,不須要了就刪掉,對其餘部分毫無影響。這類虛擬機完美的運行了另外一套系統,可以使應用程序,操做系統和硬件三者之間的邏輯不變。 centos

虛擬機的缺點: 1 資源佔用多 2 冗餘步驟多 3 啓動慢安全

 

4.容器虛擬化技術

因爲前面虛擬機存在這些缺點,Linux 發展出了另外一種虛擬化技術:Linux 容器(Linux Containers,縮寫爲 LXC)。 Linux 容器不是模擬一個完整的操做系統,而是對進程進行隔離。有了容器,就能夠將軟件運行所需的全部資源打包到一個隔離的容器中。容器與虛擬機不一樣,不須要捆綁一整套操做系統,只須要軟件工做所需的庫資源和設置。系統所以而變得高效輕量並保證部署在任何環境中的軟件都能始終如一地運行。bash

比較了 Docker 和傳統虛擬化方式的不一樣之處: 1.傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;服務器

2.而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便

3.每一個容器之間互相隔離,每一個容器有本身的文件系統 ,容器之間進程不會相互影響,能區分計算資源。

5.Docker的優勢?

1.更快速的應用交付和部署

傳統的應用開發完成後,須要提供一堆安裝程序和配置說明文檔,安裝部署後需根據配置文檔進行繁雜的配置才能正常運行。Docker化以後只須要交付少許容器鏡像文件,在正式生產環境加載鏡像並運行便可,應用安裝配置在鏡像裏已經內置好,大大節省部署配置和測試驗證時間。

2.更便捷的升級和擴縮容器

隨着微服務架構和Docker的發展,大量的應用會經過微服務方式架構,應用的開發構建將變成搭樂高積木同樣,每一個Docker容器將變成一塊「積木」,應用的升級將變得很是容易。當現有的容器不足以支撐業務處理時,可經過鏡像運行新的容器進行快速擴容,使應用系統的擴容從原先的天級變成分鐘級甚至秒級。

3.更簡單的系統運維

應用容器化運行後,生產環境運行的應用可與開發、測試環境的應用高度一致,容器會將應用程序相關的環境和狀態徹底封裝起來,不會由於底層基礎架構和操做系統的不一致性給應用帶來影響,產生新的BUG。當出現程序異常時,也能夠經過測試環境的相同容器進行快速定位和修復。

4.更高效的計算資源利用

 Docker是內核級虛擬化,其不像傳統的虛擬化技術同樣須要額外的Hypervisor支持,因此在一臺物理機上能夠運行不少個容器實例,可大大提高物理服務器的CPU和內存的利用率。

二.CentOS Docker 安裝

1.前提說明

Docker支持如下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本

前提條件 目前,CentOS 僅發行版本中的內核支持 Docker。 Docker 運行在 CentOS 7 上,要求系統爲64位、系統內核版本爲 3.10 以上。 Docker 運行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統爲64位、系統內核版本爲 2.6.32-431 或者更高版本。

查看本身的內核 uname命令用於打印當前系統相關信息(內核版本號、硬件架構、主機名稱和操做系統類型等)。

查看已安裝的CentOS版本信息(CentOS6.8有,CentOS7無該命令)

2.Docker的基本組成

1.鏡像(image

Docker 鏡像(Image)就是一個只讀的模板。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。

2.容器(container)

Docker 利用容器(Container)獨立運行的一個或一組應用。容器是用鏡像建立的運行實例

它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。

能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

容器的定義和鏡像幾乎如出一轍,也是一堆層的統一視角,惟一區別在於容器的最上面那一層是可讀可寫的。

3.倉庫(repository)

倉庫(Repository)是集中存放鏡像文件的場所。 倉庫(Repository)和倉庫註冊服務器(Registry)是有區別的。倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。

倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。 最大的公開倉庫是 Docker Hub(https://hub.docker.com/), 存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里雲 、網易雲 等

須要正確的理解倉儲/鏡像/容器這幾個概念:

Docker 自己是一個容器運行載體或稱之爲管理引擎。咱們把應用程序和配置依賴打包好造成一個可交付的運行環境,這個打包好的運行環境就彷佛 image鏡像文件。只有經過這個鏡像文件才能生成 Docker 容器。image 文件能夠看做是容器的模板。Docker 根據 image 文件生成容器的實例。同一個 image 文件,能夠生成多個同時運行的容器實例。

總結:

  • image 文件生成的容器實例,自己也是一個文件,稱爲鏡像文件。

  • 一個容器運行一種服務,當咱們須要的時候,就能夠經過docker客戶端建立一個對應的運行實例,也就是咱們的容器

  • 至於倉庫,就是放了一堆鏡像的地方,咱們能夠把鏡像發佈到倉庫中,須要的時候從倉庫中拉下來就能夠了。3.

3.Docker的安裝

三.Docker 鏡像

1.UnionFS(聯合文件系統)

UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級而且高性能的文件系統,它支持對文件系統的修改做爲一次提交來一層層的疊加,同時能夠將不一樣目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是 Docker 鏡像的基礎。鏡像能夠經過分層來進行繼承,基於基礎鏡像(沒有父鏡像),能夠製做各類具體的應用鏡像。

特性:一次同時加載多個文件系統,但從外面看起來,只能看到一個文件系統,聯合加載會把各層文件系統疊加起來,這樣最終的文件系統會包含全部底層的文件和目錄

 

2.Docker鏡像加載原理

docker的鏡像實際上由一層一層的文件系統組成,這種層級的文件系統UnionFS。 bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導加載kernel, Linux剛啓動時會加載bootfs文件系統,在Docker鏡像的最底層是bootfs。這一層與咱們典型的Linux/Unix系統是同樣的,包含boot加載器和內核。當boot加載完成以後整個內核就都在內存中了,此時內存的使用權已由bootfs轉交給內核,此時系統也會卸載bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統中的 /dev, /proc, /bin, /etc 等標準目錄和文件。rootfs就是各類不一樣的操做系統發行版,好比Ubuntu,Centos等等。 平時咱們安裝進虛擬機的CentOS都是好幾個G,爲何docker這裏才200M??

對於一個精簡的OS,rootfs能夠很小,只須要包括最基本的命令、工具和程序庫就能夠了,由於底層直接用Host的kernel,本身只須要提供 rootfs 就好了。因而可知對於不一樣的linux發行版, bootfs基本是一致的, rootfs會有差異, 所以不一樣的發行版能夠公用bootfs。

3.爲何 Docker 鏡像要採用這種分層結構呢?

最大的一個好處就是 - 共享資源

好比:有多個鏡像都從相同的 base 鏡像構建而來,那麼宿主機只需在磁盤上保存一份base鏡像 同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享

4.Docker 鏡像特色?

Docker鏡像都是只讀 當容器啓動時,一個新的可寫層被加載到鏡像的頂部 這一層一般被稱做「容器層」,「容器層」之下的都叫「鏡像層」。

5.Docker的經常使用命令?

 
// 1.幫助命令
docker version
docker info
docker --help

鏡像命令

//2. 列出本地主機上的鏡像

  docker images

  OPTIONS說明:
  -a :列出本地全部的鏡像(含中間映像層)
  -q :只顯示鏡像ID。
  --digests :顯示鏡像的摘要信息
  --no-trunc :顯示完整的鏡像信息

 // 3.docker search 某個XXX鏡像名字
  網站
  https://hub.docker.com
  命令
  docker search [OPTIONS] 鏡像名字
  OPTIONS說明:
  --no-trunc : 顯示完整的鏡像描述
  -s : 列出收藏數不小於指定值的鏡像。
  --automated : 只列出 automated build類型的鏡像;

 // 4.docker pull 某個XXX鏡像名字   下載鏡像
 
  docker pull 鏡像名字[:TAG]
 
  //5.docker rmi 某個XXX鏡像名字ID 刪除鏡像
 
  刪除單個
  docker rmi  -f 鏡像ID
  刪除多個
  docker rmi -f 鏡像名1:TAG 鏡像名2:TAG
  刪除所有
  docker rmi -f $(docker images -qa)
 

  容器命令
  有鏡像才能建立容器,這是根本前提(下載一個CentOS鏡像演示)
  docker pull centos
  //6.新建並啓動容器
  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
 
   OPTIONS說明(經常使用):有些是一個減號,有些是兩個減號
               --name="容器新名字": 爲容器指定一個名稱;
               -d: 後臺運行容器,並返回容器ID,也即啓動守護式容器;
               -i:以交互模式運行容器,一般與 -t 同時使用;
               -t:爲容器從新分配一個僞輸入終端,一般與 -i 同時使用;
               -P: 隨機端口映射;
               -p: 指定端口映射,有如下四種格式
                 ip:hostPort:containerPort //經常使用
                 ip::containerPort
                 hostPort:containerPort
                 containerPort
  //7.啓動交互式容器
  #使用鏡像centos:latest以交互模式啓動一個容器,在容器內執行/bin/bash命令。
docker run -it centos /bin/bash 
  //8.列出當前全部正在運行的容器
  docker ps [OPTIONS]
  OPTIONS說明(經常使用):
               -a :列出當前全部正在運行的容器+歷史上運行過的
               -l :顯示最近建立的容器。
               -n:顯示最近n個建立的容器。
               -q :靜默模式,只顯示容器編號。
               --no-trunc :不截斷輸出。
  //9.退出容器
  兩種退出方式
  exit
  容器中止退出
  ctrl+P+Q
  容器不中止退出
  //10.啓動容器
  docker start 容器ID或者容器名
  //11.重啓容器
  docker restart 容器ID或者容器名
  //12.中止容器
  docker stop 容器ID或者容器名
  //13.強制中止容器
  docker kill 容器ID或者容器名
  //14.刪除已中止的容器
  docker rm 容器ID
  一次性刪除多個容器
  docker rm -f $(docker ps -a -q)
  docker ps -a -q | xargs docker rm
  重要
  //啓動守護式容器
  docker run -d 容器名
   
   #使用鏡像centos:latest之後臺模式啓動一個容器
   docker run -d centos

   問題:而後docker ps -a 進行查看, 會發現容器已經退出
   很重要的要說明的一點: Docker容器後臺運行,就必須有一個前臺進程.
   容器運行的命令若是不是那些一直掛起的命令(好比運行top,tail),就是會自動退出的。

   這個是docker的機制問題,好比你的web容器,咱們以nginx爲例,正常狀況下,咱們配置啓動服務只須要啓動響應的service便可。例如
   service nginx start
   可是,這樣作,nginx爲後臺進程模式運行,就致使docker前臺沒有運行的應用,
   這樣的容器後臺啓動後,會當即自殺由於他以爲他沒事可作了.
   因此,最佳的解決方案是,將你要運行的程序之前臺進程的形式運行
  //15.查看容器日誌
  docker logs -f -t --tail 容器ID

  - -t 是加入時間戳
    - -f 跟隨最新的日誌打印
      - --tail 數字 顯示最後多少條
   //16.查看容器內運行的進程
        docker top 容器ID
   //17.查看容器內部細節
        docker inspect 容器ID
   //18.進入正在運行的容器並以命令行交互
        docker exec -it 容器ID bashShell
    //19.從新進入docker attach 容器ID
        上述兩個區別
        attach 直接進入容器啓動命令的終端,不會啓動新的進程
        exec 是在容器中打開新的終端,而且能夠啓動新的進程
    //20.從容器內拷貝文件到主機上
        docker cp  容器ID:容器內路徑 目的主機路徑
   

四.DockerFile解析

Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。 是什麼 Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。 構建三步驟 編寫Dockerfile文件 docker build docker run 文件什麼樣??? 以咱們熟悉的CentOS爲例 https://hub.docker.com/_/centos/ 構建三步驟 1.編寫Dockerfile文件 2.docker build 3.docker run 文件什麼樣??? 以咱們熟悉的CentOS爲例 https://hub.docker.com/_/centos/ Dockerfile內容基礎知識 1:每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數 2:指令按照從上到下,順序執行 3:#表示註釋 4:每條指令都會建立一個新的鏡像層,並對鏡像進行提交 DockerFile構建過程解析 Dockerfile內容基礎知識 1:每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數 2:指令按照從上到下,順序執行 3:#表示註釋 4:每條指令都會建立一個新的鏡像層,並對鏡像進行提交 Docker執行Dockerfile的大體流程 (1)docker從基礎鏡像運行一個容器 (2)執行一條指令並對容器做出修改 (3)執行相似docker commit的操做提交一個新的鏡像層 (4)docker再基於剛提交的鏡像運行一個新容器 (5)執行dockerfile中的下一條指令直到全部指令都執行完成 小總結 Docker執行Dockerfile的大體流程 (1)docker從基礎鏡像運行一個容器 (2)執行一條指令並對容器做出修改 (3)執行相似docker commit的操做提交一個新的鏡像層 (4)docker再基於剛提交的鏡像運行一個新容器 (5)執行dockerfile中的下一條指令直到全部指令都執行完成 DockerFile體系結構(保留字指令)

 FROM
基礎鏡像,當前新鏡像是基於哪一個鏡像的
MAINTAINER
鏡像維護者的姓名和郵箱地址
RUN
容器構建時須要運行的命令
EXPOSE
當前容器對外暴露出的端口
WORKDIR
指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點
ENV
用來在構建鏡像過程當中設置環境變量
ADD
將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
COPY
相似ADD,拷貝文件和目錄到鏡像中。
將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
COPY src dest
COPY ["src", "dest"]
VOLUME
容器數據卷,用於數據保存和持久化工做
CMD
指定一個容器啓動時要運行的命令
Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 以後的參數替換
ENTRYPOINT
指定一個容器啓動時要運行的命令
ENTRYPOINT 的目的和 CMD 同樣,都是在指定容器啓動程序及參數
ONBUILD
當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發
小總結
相關文章
相關標籤/搜索