Docker 入門須知。

注:文章內容均是摘自 https://yeasy.gitbooks.io/docker_practice/content/  部分內容加上自己的理解,方便自己後續查看!

 

一  簡介

docker是使用go語言開發的。Docker 最初是在 Ubuntu 12.04 上開發實現的;

優勢:

1.啓動快。

傳統的虛擬機技術啓動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接運行於宿主內核,無需啓動完整的操作系統,因此可以做到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。

2.更高效的利用系統資源。

由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用。

3.一致的運行環境

開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 「這段代碼在我機器上沒問題啊」 這類問題。

4.持續交互和部署

對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。

使用 Docker 可以通過定製應用鏡像來實現持續集成、持續交付、部署。開發人員可以通過 Dockerfile 來進行鏡像構建,並結合 持續集成(Continuous Integration) 系統進行集成測試,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署。

而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像。

5.更輕鬆的遷移

由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運行結果是一致的。因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況。

6.更輕鬆的維護和擴展

Docker 使用的分層存儲以及鏡像的技術,使得應用重複部分的複用更爲容易,也使得應用的維護更新更加簡單,基於基礎鏡像進一步擴展鏡像也變得非常簡單。此外,Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接在生產環境使用,又可以作爲基礎進一步定製,大大的降低了應用服務的鏡像製作成本。

二  概念

docker有三個概念。1.鏡像(image)。2.容器(container)。3.倉庫(repository)。

(1) 鏡像image

操作系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛載 root 文件系統爲其提供用戶空間支持。而 Docker 鏡像(Image),就相當於是一個 root 文件系統。比如官方鏡像 Ubuntu 18.04 就包含了完整的一套 Ubuntu 18.04 最小系統的 root 文件系統。

Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。

(2)關於鏡像分層存儲。

因爲鏡像包含操作系統完整的 root 文件系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計爲分層存儲的架構。所以嚴格來說,鏡像並非是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。

鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層儘量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。(這就相當於鏡像實質上只會按層遞增體積,文件在那層創建的只能在那層徹底清除,後續層刪除只是假刪除。)

分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至可以用之前構建好的鏡像作爲基礎層,然後進一步添加新的層,以定製自己所需的內容,構建新的鏡像。

(3) 容器 container

鏡像 (image) 和容器 (container) 的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等。

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的 命名空間。因此容器可以擁有自己的 root· 文件系統、自己的網絡配置、自己的進程空間,甚至自己的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也因爲這種隔離的特性,很多人初學 Docker 時常常會混淆容器和虛擬機。(容器相當於沙箱,隔離宿主機起的進程,即使出現病毒也是威脅不到宿主機的)

鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,是以鏡像爲基礎層在其上創建一個當前容器的存儲層,我們可以稱這個爲容器運行時讀寫而準備的存儲層爲 容器存儲層。docker run image  --->container  容器添加存儲層。

容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。

按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。(綁定宿主目錄是一個好的方法,相當於docker容器的某個目錄打到了宿主機的某個目錄)

數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷後,容器刪除或者重新運行之後,數據卻不會丟失。

(4)  註冊 Docker Registry

鏡像構建完成後,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。

一個 Docker Registry 中可以包含多個 倉庫Repository);每個倉庫可以包含多個 標籤Tag);每個標籤對應一個鏡像

(registry理解的就是一個註冊中心,裏面包括不同系統項目的倉庫,而一個倉庫就是一個鏡像的集合,每個鏡像對應的tag就是一個版本的鏡像。)

通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以 latest 作爲默認標籤。

以 Ubuntu 鏡像 爲例,ubuntu 是倉庫的名字,其內包含有不同的版本標籤,如,16.0418.04。我們可以通過 ubuntu:16.04,或者 ubuntu:18.04 來具體指定所需哪個版本的鏡像。如果忽略了標籤,比如 ubuntu,那將視爲 ubuntu:latest

倉庫名經常以 兩段式路徑 形式出現,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用戶環境下的用戶名,後者則往往是對應的軟件名。但這並非絕對,取決於所使用的具體 Docker Registry 的軟件或服務。

(我們可以下載docker官方registry的鏡像,由於外網也可以使用國內的加速器,例如阿里雲。這種鏡像都是在公有registry中的,而我們企業開發時,就是私有的registry,我們把創建的私有鏡像發佈到docker registry註冊中心。如:harbor)

三 安裝docker 

安裝詳情參照--- https://yeasy.gitbooks.io/docker_practice/content/install/ubuntu.html

本篇文章基於Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-142-generic x86_64) 編寫。

查詢ubuntu系統的配置:https://blog.csdn.net/kinglyjn/article/details/53584652

可以用這個命令 :  cat /etc/os-releas  查看當前的Ubuntu信息

舊版本的 Docker 稱爲 docker 或者 docker-engine,使用以下命令卸載舊版本:

$ sudo apt-get remove docker \
               docker-engine \
               docker.io

使用 APT 安裝

由於 apt 源使用 HTTPS 以確保軟件下載過程中不被篡改。因此,我們首先需要添加使用 HTTPS 傳輸的軟件包以及 CA 證書。

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

鑑於國內網絡問題,強烈建議使用國內源,官方源請在註釋中查看。

爲了確認所下載軟件包的合法性,需要添加軟件源的 GPG 密鑰。

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -


# 官方源
# $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

然後,我們需要向 source.list 中添加 Docker 軟件源

$ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"


# 官方源
# $ sudo add-apt-repository \
#    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
#    $(lsb_release -cs) \
#    stable"

以上命令會添加穩定版本的 Docker CE APT 鏡像源,如果需要測試或每日構建版本的 Docker CE 請將 stable 改爲 test 或者 nightly。

安裝 Docker CE

更新 apt 軟件包緩存,並安裝 docker-ce

$ sudo apt-get update

$ sudo apt-get install docker-ce

啓動 Docker CE

$ sudo systemctl enable docker
$ sudo systemctl start docker

 

配置國內鏡像加速

https://yeasy.gitbooks.io/docker_practice/content/install/mirror.html

對於使用 systemd 的系統,請在 /etc/docker/daemon.json 中寫入如下內容(如果文件不存在請新建該文件)

{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com"
  ]
}

注意,一定要保證該文件符合 json 規範,否則 Docker 將不能啓動。 然後重啓docker 

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker run  hello-world 看一下是否成功。

 

關於centos 按照:https://yeasy.gitbooks.io/docker_practice/content/install/centos.html

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章