熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

來自:開源Linux  作者 | 慘綠少年

原文 |http://adkx。net/9804r

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

docker不是一個值得投入的領域,它解決的問題是Unix系統最初設計的一個疏忽。從一個不會用docker的小白,自己一步一步的摸索,中間也踩過許多坑。但仍然,堅持從哪裡跌倒就從哪裡爬起來。不求感動自己,但求人生無悔。

1 容器簡介

1。1 什麼是 Linux 容器

1。2 容器不就是虛擬化嗎

1。3 容器發展簡史

2 什麼是 Docker?

2。1 Docker 如何工作?

2。2 Docker 技術是否與傳統的 Linux 容器相同?

2。3 docker的目標

3 安裝Docker

3.1 Docker基礎命令操作

3。2 啟動第一個容器

3。3 Docker映象生命週期

4 docker映象相關操作

4.1 搜尋官方倉庫映象

4。2 獲取映象

4。3 匯出映象

4。4 刪除映象

4。5 匯入映象

4。6 檢視映象的詳細資訊

5 容器的日常管理

5.1 容器的起/停

5。2 進入容器方法

5。3 刪除所有容器

5。4 啟動時進行埠對映

6 Docker 資料卷的管理

6。1 掛載時建立卷

6。2 建立卷後掛載

6。3 手動將容器儲存為映象

7 Dockerfile自動構建docker映象

7.1 Dockerfile指令集

7。2 建立一個Dockerfile

7。3 使用Dcokerfile安裝kodexplorer

8 Docker中的映象分層

8.1 Docker 映象為什麼分層

8。2 可寫的容器層

8。3 容器層的細節說明

9 使用docker執行zabbix-server

9.1 容器間的互聯

9。2 啟動zabbix容器

9。3 關於zabbix API

10 docker 倉庫(registry)

10。1 建立一個普通倉庫

10。2 帶basic認證的倉庫

11 docker-compose編排工具

11.1 安裝docker-compose

11。2 編排啟動映象

11。3 haproxy代理後端docker容器

11。4 安裝socat 直接操作socket控制haproxy

12 重啟docker服務,容器全部退出的解決辦法

12.1 在啟動是指定自動重啟

12。2 修改docker預設配置檔案

13 Docker網路型別

13.1 docker的網路型別

13。2 不為容器配置網路功能

13。3 與其他容器共享網路配置(Container)

13。4 使用宿主機網路

13。5 檢視網路列表

13。6 用PIPEWORK為docker容器配置獨立IP

13。7 Docker跨主機通訊之macvlan

14 docker企業級映象倉庫harbor

14.1 使用容器的建議

14。2 關於Docker容器的監控

15 參考文獻

1 容器簡介

1。1 什麼是 Linux 容器

Linux容器是與系統其他部分隔離開的一系列程序,從另一個映象執行,並由該映象提供支援程序所需的全部檔案。容器提供的映象包含了應用的所有依賴項,因而在從開發到測試再到生產的整個過程中,它都具有可移植性和一致性。

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

更加詳細地來說,請您假定您在開發一個應用。您使用的是一臺膝上型電腦,而且您的開發環境具有特定的配置。其他開發人員身處的環境配置可能稍有不同。您正在開發的應用依賴於您當前的配置,還要依賴於某些特定檔案。與此同時,您的企業還擁有標準化的測試和生產環境,且具有自身的配置和一系列支援檔案。您希望儘可能多在本地模擬這些環境,而不產生重新建立伺服器環境的開銷。

因此,您要如何確保應用能夠在這些環境中執行和透過質量檢測,並且在部署過程中不出現令人頭疼的問題,也無需重新編寫程式碼和進行故障修復?答案就是使用容器。容器可以確保您的應用擁有必需的配置和檔案,使得這些應用能夠在從開發到測試、再到生產的整個流程中順利執行,而不出現任何不良問題。這樣可以避免危機,做到皆大歡喜。

雖然這只是簡化的示例,但在需要很高的可移植性、可配置性和隔離的情況下,我們可以利用 Linux 容器透過很多方式解決難題。無論基礎架構是在企業內部還是在雲端,或者混合使用兩者,容器都能滿足您的需求。

1。2 容器不就是虛擬化嗎

是,但也不竟然。我們用一種簡單方式來思考一下:

虛擬化使得許多作業系統可同時在單個系統上執行。

容器則可共享同一個作業系統核心,將應用程序與系統其他部分隔離開。

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

圖-普通虛擬化技術和Docker的對比

這意味著什麼?首先,讓多個作業系統在單個虛擬機器監控程式上執行以實現虛擬化,並不能達成和使用容器同等的輕量級效果。事實上,在僅擁有容量有限的有限資源時,您需要能夠可以進行密集部署的輕量級應用。Linux 容器可從單個作業系統執行,在所有容器中共享該作業系統,因此應用和服務能夠保持輕量級,並行快速執行。

1。3 容器發展簡史

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

我們現在稱為容器技術的概念最初出現在 2000 年,當時稱為 FreeBSD jail,這種技術可將 FreeBSD 系統分割槽為多個子系統(也稱為 Jail)。Jail 是作為安全環境而開發的,系統管理員可與企業內部或外部的多個使用者共享這些 Jail。

Jail 的目的是讓程序在經過修改的 chroot 環境中建立,而不會脫離和影響整個系統 — 在 chroot 環境中,對檔案系統、網路和使用者的訪問都實現了虛擬化。儘管 Jail 在實施方面存在侷限性,但最終人們找到了脫離這種隔離環境的方法。

但這個概念非常有吸引力。

2001 年,透過 Jacques Gélinas 的 VServer 專案,隔離環境的實施進入了 Linux 領域。正如 Gélinas 所說,這項工作的目的是“在高度獨立且安全的單一環境中執行多個通用 Linux 伺服器 [sic]。” 在完成了這項針對 Linux 中多個受控制使用者空間的基礎性工作後,Linux 容器開始逐漸成形並最終發展成了現在的模樣。

2 什麼是 Docker?

“Docker” 一詞指代多種事物,包括開源社群專案、開源專案使用的工具、主導支援此類專案的公司 Docker Inc。 以及該公司官方支援的工具。技術產品和公司使用同一名稱,的確讓人有點困惑。

我們來簡單說明一下:

IT 軟體中所說的 “Docker” ,是指容器化技術,用於支援建立和使用 Linux 容器。

開源 Docker 社群致力於改進這類技術,並免費提供給所有使用者,使之獲益。

Docker Inc。 公司憑藉 Docker 社群產品起家,它主要負責提升社群版本的安全性,並將改進後的版本與更廣泛的技術社群分享。此外,它還專門對這些技術產品進行完善和安全固化,以服務於企業客戶。

藉助 Docker ,您可將容器當做重量輕、模組化的虛擬機器使用。同時,您還將獲得高度的靈活性,從而實現對容器的高效建立、部署及複製,並能將其從一個環境順利遷移至另一個環境。

2。1 Docker 如何工作?

Docker 技術使用 Linux 核心和核心功能(例如 Cgroups 和 namespaces)來分隔程序,以便各程序相互獨立執行。這種獨立性正是採用容器的目的所在;它可以獨立執行多種程序、多個應用程式,更加充分地發揮基礎設施的作用,同時保持各個獨立系統的安全性。

容器工具(包括 Docker)可提供基於映象的部署模式。這使得它能夠輕鬆跨多種環境,與其依賴程式共享應用或服務組。Docker 還可在這一容器環境中自動部署應用程式(或者合併多種流程,以構建單個應用程式)。

2。2 Docker 技術是否與傳統的 Linux 容器相同?

否。Docker 技術最初是基於 LXC 技術構建(大多數人都會將這一技術與“傳統的” Linux 容器聯絡在一起),但後來它逐漸擺脫了對這種技術的依賴。

就輕量級虛擬化這一功能來看,LXC 非常有用,但它無法提供出色的開發人員或使用者體驗。除了執行容器之外,Docker 技術還具備其他多項功能,包括簡化用於構建容器、傳輸映象以及控制映象版本的流程。

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

傳統的 Linux 容器使用 init 系統來管理多種程序。這意味著,所有應用程式都作為一個整體執行。與此相反,Docker 技術鼓勵應用程式各自獨立執行其程序,並提供相應工具以實現這一功能。這種精細化運作模式自有其優勢。

2。3 docker的目標

docker的主要目標是“Build,Ship and Run any App,Angwhere”,構建,運輸,處處執行

構建:做一個docker映象

運輸:docker pull

執行:啟動一個容器

每一個容器,他都有自己的檔案系統rootfs。

3 安裝Docker

環境說明

在兩個節點上都進行操作

修改在配置:

在測試

3。1 Docker基礎命令操作

檢視docker相關資訊

配置docker映象加速

3。2 啟動第一個容器

引數說明

3。3 Docker映象生命週期

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

4 docker映象相關操作

4。1 搜尋官方倉庫映象

列表說明

4。2 獲取映象

根據映象名稱拉取映象

檢視當前主機映象列表

獲取第三方映象方法

4。3 匯出映象

4。4 刪除映象

4。5 匯入映象

4。6 檢視映象的詳細資訊

5 容器的日常管理

5。1 容器的起/停

最簡單的執行一個容器

建立容器,兩步走(不常用)

快速啟動容器方法

容器內的第一個程序必須一直處於執行的狀態,否則這個容器,就會處於退出狀態!

檢視正在執行的容器

檢視你容器詳細資訊/ip

檢視你所有容器(包括未執行的)

停止容器

5。2 進入容器方法

啟動時進去方法

退出/離開容器

啟動後進入容器的方法

啟動一個docker

attach進入容器,使用pts/0 ,會讓所用透過此方法進入放入使用者看到同樣的操作。

自命名啟動一個容器 ——name

exrc 進入容器方法(推薦使用)

5。3 刪除所有容器

5。4 啟動時進行埠對映

-p引數埠對映

不同指定對映方法

隨機對映

6 Docker 資料卷的管理

6。1 掛載時建立卷

掛載卷

容器內站點目錄: /usr/share/nginx/html

在宿主機寫入資料,檢視

設定共享卷,使用同一個卷啟動一個新的容器

檢視卷列表

6。2 建立卷後掛載

建立一個卷

指定卷名

檢視卷路徑

使用卷建立

設定卷

檢視使用的埠

6。3 手動將容器儲存為映象

本次是基於docker官方centos 6。8 映象建立

官方映象列表:https://hub。docker。com/explore/

啟動一個centos6。8的映象

啟動完成後映象ssh連線測試

將容器提交為映象

使用新的映象啟動容器

在容器安裝httpd服務

編寫啟動指令碼指令碼

注意執行許可權

再次提交為新的映象

啟動映象,做好埠對映。並在瀏覽器中測試訪問

7 Dockerfile自動構建docker映象

官方構建dockerffile檔案參考:https://github。com/CentOS/CentOS-Dockerfiles

7。1 Dockerfile指令集

dockerfile主要組成部分:

dockerfile常用指令:

dockerfile其他指令:

7。2 建立一個Dockerfile

建立第一個Dockerfile檔案

構建docker映象

使用自構建的映象啟動

7。3 使用Dcokerfile安裝kodexplorer

Dockerfile檔案內容

更多的Dockerfile可以參考官方方法。

8 Docker中的映象分層

參考文件:http://www。maiziedu。com/wiki/cloud/dockerimage

Docker 支援透過擴充套件現有映象,建立新的映象。實際上,Docker Hub 中 99% 的映象都是透過在 base 映象中安裝和配置需要的軟體構建出來的。

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

從上圖可以看到,新映象是從 base 映象一層一層疊加生成的。每安裝一個軟體,就在現有映象的基礎上增加一層。

8。1 Docker 映象為什麼分層

映象分層最大的一個好處就是共享資源。

比如說有多個映象都從相同的 base 映象構建而來,那麼 Docker Host 只需在磁碟上儲存一份 base 映象;同時記憶體中也只需載入一份 base 映象,就可以為所有容器服務了。而且映象的每一層都可以被共享。

如果多個容器共享一份基礎映象,當某個容器修改了基礎映象的內容,比如 /etc 下的檔案,這時其他容器的 /etc 是不會被修改的,修改只會被限制在單個容器內。這就是容器 Copy-on-Write 特性。

8。2 可寫的容器層

當容器啟動時,一個新的可寫層被載入到映象的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“映象層”。

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

所有對容器的改動 - 無論新增、刪除、還是修改檔案都只會發生在容器層中。只有容器層是可寫的,容器層下面的所有映象層都是隻讀的。

8。3 容器層的細節說明

映象層數量可能會很多,所有映象層會聯合在一起組成一個統一的檔案系統。如果不同層中有一個相同路徑的檔案,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說使用者只能訪問到上層中的檔案 /a。在容器層中,使用者看到的是一個疊加之後的檔案系統。

檔案操作說明

只有當需要修改時才複製一份資料,這種特性被稱作 Copy-on-Write。可見,容器層儲存的是映象變化的部分,不會對映象本身進行任何修改。

這樣就解釋了我們前面提出的問題:容器層記錄對映象的修改,所有映象層都是隻讀的,不會被容器修改,所以映象可以被多個容器共享。

9 使用docker執行zabbix-server

9。1 容器間的互聯

在執行zabbix之前務必要了解容器間互聯的方法

命令執行過程

9。2 啟動zabbix容器

1、啟動一個mysql的容器

2、啟動java-gateway容器監控java服務

3、啟動zabbix-mysql容器使用link連線mysql與java-gateway。

4、啟動zabbix web顯示,使用link連線zabbix-mysql與mysql。

9。3 關於zabbix API

關於zabbix API可以參考官方文件:https://www。zabbix。com/documentation/3。4/zh/manual/api

獲取token方法

10 docker 倉庫(registry)

10。1 建立一個普通倉庫

1、建立倉庫

2、修改配置檔案,使之支援http

重啟docker讓修改生效

3、修改映象標籤

4、將新打標籤的映象上傳映象到倉庫

10。2 帶basic認證的倉庫

1、安裝加密工具

2、設定認證密碼

3、啟動容器,在啟動時傳入認證引數

4、使用驗證使用者測試

至此,一個簡單的docker映象倉庫搭建完成

11 docker-compose編排工具

11。1 安裝docker-compose

安裝docker-compose

國內開啟pip 下載加速:http://mirrors。aliyun。com/help/pypi

11。2 編排啟動映象

1、建立檔案目錄

2、編寫編排檔案

3、啟動

4、瀏覽器上訪問http://10。0。0。100:8000

進行wordpress的安裝即可

11。3 haproxy代理後端docker容器

1、修改編排指令碼

2、同時啟動兩臺wordpress

3、安裝haproxy

4、修改haproxy配置檔案

關於配置檔案的詳細說明,參考:https://www。cnblogs。com/MacoLee/p/5853413。html

5、啟動haproxy

6、使用瀏覽器訪問hapeoxy監聽的8000埠可以看到負載的情況

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

7、使用瀏覽器訪問 http://10。0。0。100:8888/haproxy-status

可以看到後端節點的監控狀況,

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

11。4 安裝socat 直接操作socket控制haproxy

1、安裝軟體

2、檢視幫助

3、下線後端節點

4、上線後端節點

5、編寫php測試頁,放到/data/web_data下,在瀏覽器中訪問可以檢視當前的節點

12 重啟docker服務,容器全部退出的解決辦法

12。1 在啟動是指定自動重啟

12。2 修改docker預設配置檔案

docker server配置檔案/etc/docker/daemon。json參考

重啟生效,只對在此之後啟動的容器生效

13 Docker網路型別

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

13。1 docker的網路型別

Bridge預設docker網路隔離基於網路名稱空間,在物理機上建立docker容器時會為每一個docker容器分配網路名稱空間,並且把容器IP橋接到物理機的虛擬網橋上。

13。2 不為容器配置網路功能

此模式下建立容器是不會為容器配置任何網路引數的,如:容器網絡卡、IP、通訊路由等,全部需要自己去配置。

13。3 與其他容器共享網路配置(Container)

此模式和host模式很類似,只是此模式建立容器共享的是其他容器的IP和埠而不是物理機,此模式容器自身是不會配置網路和埠,建立此模式容器進去後,你會發現裡邊的IP是你所指定的那個容器IP並且埠也是共享的,而且其它還是互相隔離的,如程序等。

13。4 使用宿主機網路

此模式建立的容器沒有自己獨立的網路名稱空間,是和物理機共享一個Network Namespace,並且共享物理機的所有埠與IP,並且這個模式認為是不安全的。

13。5 檢視網路列表

13。6 用PIPEWORK為docker容器配置獨立IP

官方網站:https://github。com/jpetazzo/pipework

宿主環境:centos7。2

1、安裝pipework

2、配置橋接網絡卡

安裝橋接工具

修改網絡卡配置,實現橋接

3、執行一個容器映象測試:

在其他主機上測試埠及連通性

4、再執行一個容器,設定網路型別為none:

進行訪問測試

5、重啟容器後需要再次指定:

Dcoker跨主機通訊之overlay可以參考:

http://www。cnblogs。com/CloudMan6/p/7270551。html

1。13。7 Docker跨主機通訊之macvlan

建立網路

設定網絡卡為混雜模式

建立使用macvlan網路容器

14 docker企業級映象倉庫harbor

容器管理

1、安裝docker、docker-compose

下載 harbor

2、修改主機及web介面密碼

3、執行安裝指令碼

瀏覽器訪問 http://10。0。0。11

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

新增一個專案

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

4、映象推送到倉庫的指定專案

5、推送映象

6、在web介面裡檢視

熬夜淦了近 3W 字的 Docker 教程,從入門到精通(建議收藏)

14。1 使用容器的建議

不要以拆分方式進行應用程式釋出

不要建立大型映象

不要在單個容器中執行多個程序

不要在映象內儲存憑證,不要依賴IP地址

以非root使用者執行程序

不要使用“最新”標籤

不要利用執行中的容器建立映象

不要使用單層映象

不要將資料存放在容器內

14。2 關於Docker容器的監控

容器的基本資訊

包括容器的數量、ID、名稱、映象、啟動命令、埠等資訊

容器的執行狀態

統計各狀態的容器的數量,包括執行中、暫停、停止及異常退出

容器的用量資訊

統計容器的CPU使用率、記憶體使用量、塊裝置I/O使用量、網路使用情況等資源的使用情況

參考文獻

[1] https://www。redhat。com/zh/topics/containers/whats-a-linux-container

[2] https://www。redhat。com/zh/topics/containers/what-is-docker

[3] http://blog。51cto。com/dihaifeng/1713512

[4] https://www。cnblogs。com/Bourbon-tian/p/6867796。html

[5] https://www。cnblogs。com/CloudMan6/p/6806193。html

END

TAG: 容器映象Docker啟動