docker 1.12.6

一、基本原理

  1. 什麼是Docker?
    • Docker是基於Go語言實現的雲開源項目。
    • Docker的主要目標是“Build,Ship and Run Any App,Anywhere”,也就是通過對應用組件的封裝、分發、部署、運行等生命週期的管理,使用戶的APP(可以是一個WEB應用或者數據庫應用等等)及其運行環境能夠做到“==一次封裝,到處運行==”。
    • Docker引擎的基礎是Linux自帶的容器(Linux Containers,LXC)技術。
  2. Docker給DevOps帶來的好處
    • ==更快速的交付和部署==:開發人員可以使用鏡像快速的構建標準開發環境;開發完成後,測試和運維人員可以使用開發人員提供的docker鏡像快速部署應用,可以避免開發和測試運維人員之間的環境差異導致的部署問題。
    • ==更高校的資源利用==:Docker容器的運行不需要額外的虛擬化管理程序支持,它是內核級的虛擬化,在佔用更少資源的情況實現更高的性能。
    • ==更方便的遷移和擴展==:Docker容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、服務器等。這種兼容使得用戶可以在不同的平臺之間很方便的完成應用遷移。
    • ==更簡單的更新管理==:使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作,並且所有修改都以增量方式進行分發和更新。
  3. 虛擬化與Docker


- 虛擬化的核心是對資源進行抽象,目標往往是爲了在同一個機器上運行多個系統或應用,從而提高系統資源的利用率。虛擬化分爲很多類型,比如常見的硬件輔助虛擬化(VMware workstation、 KVM等)。Docker所代表的容器虛擬化技術屬於操作系統級虛擬化:內核通過創建多個虛擬的操作系統實例(內核和庫)來隔離不同的進程。
- 傳統虛擬化和容器技術結構比較:傳統虛擬化技術是在硬件層面實現虛擬化,增加了系統調用鏈路的環節,有性能損耗;容器虛擬化技術以共享Kernel的方式實現,幾乎沒有性能損耗。
4. Docker怎麼實現的?
- Docker是Client/Server的架構,Docker客戶端與Docker daemon進行交互,daemon負責構建、運行和發佈Docker容器。客戶端可以和服務端運行在同一個系統中,也可以連接遠程的daemon。Docker的客戶端的daemon通過RESTful API進行socket通信。

如上圖,Docker守護進程(daemon)在主機上運行,用戶不能直接和守護進程打交道,但是可以通過Docker客戶端與其進行交互;Client是Docker的初始用戶界面,它接收用戶的命令並反饋,並且與Docker的守護進行交互。
- Docker基於Linux容器技術(LXC),Namespace,Cgroup,UnionFS(聯合文件系統)等技術實現:
- namespace(命名空間):命名空間是 Linux 內核一個強大的特性。每個容器都有自己單獨的命名空間,運行在其中的應用都像是在獨立的操作系統中運行一樣。命名空間保證了容器之間彼此互不影響。docker實際上一個進程容器,它通過namespace實現了進程和進程所使用的資源的隔離。使不同的進程之間彼此不可見。
Docker用到的一些命名空間有:
pid命名空間:用於隔離進程,容器都有自己獨立的進程表和1號進程;
net命名空間:用於管理網絡,容器有自己獨立的networkinfo;
ipc命名空間:用於訪問IPC資源(IPC:InterProcess Communication);
mnt命名空間:用於管理掛載點,每個容器都有自己唯一的目錄掛載;
uts命名空間:用於隔離內核和版本標識(UTS:UnixTimeProcess System),每個容器都有獨立的hostname和domain。
- cgroup(控制組):是 Linux 內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當多個容器同時運行時的對系統資源的競爭。控制組技術最早是由 Google 的程序員 2006 年起提出,Linux 內核自 2.6.24 開始支持。控制組可以提供對容器的內存、CPU、磁盤 IO 等資源的限制和審計管理。
- UnionFS(聯合文件系統):Union文件系統(UnionFS)是一種分層、輕量級並且高性能的文件系統,它支持對 文件系統的修改作爲一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統下(unite several directories into a single virtual filesystem)。Union 文件系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(沒有父鏡像),可以製作各種具體的應用鏡像。另外,不同 Docker 容器就可以共享一些基礎的文件系統層,同時再加上自己獨有的改動層,大大提高了存儲的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一種 Union FS。 AUFS 支持爲每一個成員目錄(類似 Git 的分支)設定只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)權限, 同時 AUFS 裏有一個類似分層的概念, 對只讀權限的分支可以邏輯上進行增量地修改(不影響只讀部分的)。Docker 目前支持的 Union 文件系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper。

二、爲什麼使用

  1. Docker 容器的啓動可以在秒級實現,這相比傳統的虛擬機方式要快得多。

  2. Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器,==容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高==,同時系統的開銷儘量小。

  3. 傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啓動 10 個隔離的應用即可。

  4. 與傳統虛擬機相比

特性 容器 虛擬機
啓動 秒級 分鐘級
硬盤使用 一般爲MB 一般爲GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 一般幾十個

三、如何使用

  1. 鏡像Image
    • 引用其它任何基礎鏡像,再結合自身需求,對其二次加工成新的鏡像
    • 直接pull第三方或官方(類似npm,下載速度堪憂,可以配置阿里加速)的鏡像,比如:nginx,MySQL,tomcat等等
    • 公司內部私服(和nexus一樣)
    • 本地導入
    • 國內第三方,如:阿里、網易…
  2. 啓動容器Container
    • 直接啓動docker run
    • 導入本地容器快照或者從某個URL導入
    • docker-compose

四、進階使用

  1. 默認docker啓動會創建一個虛擬網橋叫docker0 (172.17.0.0網段),啓動的容器都會動態從這個網段分配未使用的ip,容器可以與容器以及宿主機通信(未映射其它容器),默認docker會將用戶的端口映射加入iptables(防火牆重啓失效需重啓docker)

  2. 如果不喜歡默認橋,我們也可以重新定義網橋或者基於默認橋修改

  3. 自定義網橋,由於默認的網橋有個缺點,就是每次容器啓動順序不一樣分配的ip也不一樣,自定義網橋的話,我們可以指定各容器ip,這樣就不用每次更換ip了

五、通信機制

  1. host模式,docker使用linux中的namespace隔離資源,一個docker容器會分配一個獨立的network namespace。但是如果容器採用host時,那麼這個容器會和宿主機公用一個network namespqce,容器將不會虛擬出自己的網卡,配置自己的ip,而是使用宿主機的ip和端口

  2. contianer模式是指和已經存在的一個容器共享一個network namespaces,那兩個容器除了網絡方面,其它的資源還是隔離的,兩個容器的進程可以通過lo網卡設備通信

  3. none模式時docker擁有自己的network namespaces,但是docker進行任何網絡配置,需要我們自己爲docker容器添加網絡、配置ip

  4. ==bridge模式是docker默認的網絡設置,此模式會爲每個容器分配network namespace、設置ip等,並將一個主機的docker容器連接到一個虛擬網絡上==

六、資源分配

  1. 一般使用默認的配置,如果需要自定義資源分配,可以在啓動容器時通過一些命令指定,如:-m:內存限制,–memory-swap等等,詳細可以使用dcoker run –help查看

七、實戰

  1. plantdata_console前臺部署到生產環境中。
    • 一臺物理機(模擬測試機,部署docker)、一臺虛擬機(模擬生產環境)
    • 在測試機使用Dockerfile 構建生產的鏡像
    • 提交到私服或者本地導出
    • 導入部署環境,私服docker pull 192.168.1.138:5000/nginx,本地docker load -i nginx.tar
    • docker run –name plantdata_nginx -p 80:80 -d nginx

八、安裝注意

  1. 從1.8.2開始,==Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum, which CentOS 7 runs.==
  2. Docker之前的版本是可以運行在較低內核版本之上的,比如1.7.1。但是docker引擎也會給出警告“==level=warning msg=”You are running linux kernel version 2.6.32-504.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0.==”
  3. 在1.12之前的版本有很多集成特性沒有,比如docker swarm和network(==引擎沒這個,還怎麼玩==)以及其它之前需要第三方工具實現的,現在內部都直接集成,比之前要方便很多很多
  4. docker-compose現在最新版是1.16.1,而每個版本都有最低docker 引擎的要求以及docker-compose.yml格式版本的要求(目前最新3.3,且之前的每個大版本直接完全不兼容),很早之前的根本無法用,具體請參考

  5. 特別說明:

    • 以redhat(centos是redhat再編譯產物)舉例,下表是各發行版與對應的內核
      image
    • 如果自行升級內核至3.10.0+,要麼升級失敗,要麼在安裝docker失敗(因爲依舊缺少許許多多模塊)
    • ==強烈建議用原生髮行版自帶內核==,一方面可以在用自帶yum源安裝,另一方用最新源安裝也是非常方便
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章