Ubuntu 开源 wordpress mysql linux shell apache 微软 java Windows nginx 程序员 编程 centos php Android 云计算 Python Firefox google

聊聊Docker理論知識(二)

一、什麽是Dcoker

相信docker是什麽大家都已經比較清楚了,網上有很詳細的介紹,我這裏只是大概描述一下。

Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平臺。

Docker通常用於如下場景:

web應用的自動化打包和發布;
自動化測試和持續集成、發布;
在服務型環境中部署和調整數據庫或其他的後臺應用;
從頭編譯或者擴展現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境。
二、Docker的三大核心概念

1、鏡像(Image)

Docker鏡像(Image)類似與虛擬機的鏡像,可以將他理解為一個面向Docker引擎的只讀模板,包含了文件系統。

例如:一個鏡像可以完全包含了Ubuntu操作系統環境,可以把它稱作一個Ubuntu鏡像。鏡像也可以安裝了Apache應用程序(或其他軟件),可以把它稱為一個Apache鏡像。

鏡像是創建Docker容器的基礎,通過版本管理和增量的文件系統,Docker提供了一套十分簡單的機制來創建和更新現有的鏡像。
用戶可以從網上下載一個已經做好的應用鏡像,並通過命令直接使用。

總之,應用運行是需要環境的,而鏡像就是來提供這種環境。

2、容器(Container)

Docker容器(Container)類似於一個輕量級的沙箱子(因為Docker是基於Linux內核的虛擬技術,所以消耗資源十分少),Docker利用容器來運行和隔離應用。

容器是從鏡像創建的應用運行實例,可以將其啟動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。

可以吧每個容器看作一個簡易版的Linux系統環境(包括了root用戶權限、進程空間、用戶空間和網絡空間),以及與運行在其中的應用程序打包而成的應用盒子。

鏡像自身是只讀的。容器從鏡像啟動的時候,Docker會在鏡像的最上層創建一個可寫層,鏡像本身將保持不變。就像用ISO裝系統之後,ISO並沒有什麽變化一樣。

3、倉庫(Repository)

Docker倉庫(Repository)類似與代碼倉庫,是Docker集中存放鏡像文件的場所。

有時候會看到有資料將Docker倉庫和註冊服務器(Registry)混為一談,並不嚴格區分。實際上,註冊服務器是存放倉庫的地方,其上往往存放著多個倉庫。每個倉庫集中存放某一類鏡像,往往包括多個鏡像文件,通過不同的標簽(tag)來進行區分。例如存放Ubuntu操作系統鏡像的倉庫,稱為Ubuntu倉庫,其中可能包括14.04,12.04等不同版本的鏡像。

根據存儲的鏡像公開分享與否,Docker倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

目前,最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括Docker Pool等,可以提供穩定的國內訪問。山東理工大學開源社區什麽時候搞個這個啊,可以提上進程。

如果用戶不希望公開分享自己的鏡像文件,Docker也支持用戶在本地網絡內創建一個只能自己訪問的私有倉庫。

當用戶創建了自己的鏡像之後就可以使用push明亮將它上傳到指定的公有或則私有倉庫。這樣用戶下次在另一臺機器上使用該鏡像時,只需將其從倉庫pull下來就可以了。

Docker利用倉庫管理鏡像的設計理念甚至命令和git非常相似,也就意味著非常好上手。

三、Docker架構組成

Docker 采用的是 Client/Server 架構。客戶端向服務器發送請求,服務器負責構建、運行和分發容器。客戶端和服務器可以運行在同一個 host 上,客戶端也可以通過 socket 或 REST API 與遠程的服務器通信。

https://docs.docker.com/engine/docker-overview/#union-file-systems

 

聊聊Docker理论知识(二)

四、Docker的技術組件

Docker 可以運行於任何安裝了現代 Linux 內核的 x64 主機上。推薦的內核版本是 3.8 或者更高。Docker 的開銷比較低,可以用於服務器、臺式機或者筆記本。它包括以下幾個部分。

一個原生的 Linux 容器格式,Docker 中稱為 libcontainer。
Linux 內核的命名空間(namespace),用於隔離文件系統、進程和網絡。
文件系統隔離:每個容器都有自己的 root 文件系統。
進程隔離:每個容器都運行在自己的進程環境中。
網絡隔離:容器間的虛擬網絡接口和ip地址都是分開的。
資源隔離和分組:使用 cgroups(即control group,Linux 的內核特性之一)將 CPU 和內存之類的資源獨立分配給每個 Docker 容器。
寫時復制(Copy on write):文件系統都是通過寫時復制創建的,這就意味著文件系統是分層的、快速的,而且占用磁盤空間更小。
日誌:容器產生的STDOUT、STDERR和STDIN這些IO流都會被收集並計入日誌。用來進行日誌分割和故障排錯。
交互式Shell:用戶可以創建一個偽 tty 終端,將其連接到STDIN,為容器提供一個交互式shell。
五、Docker的安裝(Ubuntu)

1、環境選擇

因為 Ubuntu 系統的內核版本比較高,而且官方也建議我們使用 Ubuntu,並且各大網站博客的教程很多都是基於 Ubuntu 系統,所以我們這裏選擇Ubuntu 16.04 進行安裝Docker。

運行64位CPU的計算機
運行Linux 3.8或者更高的內核
內核需要支持Device Manager、AUFS、vfs、btrfs、ZFS中的一種
內核必須支持開啟cgroup和命名空間namespace功能
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-using-the-repository

2、允許apt命令HTTPS訪問Docker源

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
3、添加 Docker 官方的GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4、將Docker的源添加到 /etc/apt/sources.list

sudo add-apt-repository \
  "deb [Arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
5、安裝 Docker

sudo apt-get update
sudo apt-get install docker-ce
6、運行第一個容器

docker run hello-world

聊聊Docker理论知识(二)

五、配置加速器

由於眾所周知的一些原因,我們訪問 Docker Hub 速度非常慢,為此我們需要添加一個國內的鏡像站來作為極速器。

1、阿裏雲加速器

登錄地址https://dev.aliyun.com/search.html ,點擊"創建我的容器鏡像",找到"Docker Hub 鏡像站點",如下圖:


聊聊Docker理论知识(二)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://78ssvya7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2、DaoCloud 加速器

註冊 DaoCloud 賬戶(支持微信登錄),然後訪問:https://www.daocloud.io/mirror#accelerator-doc

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://b149d2fd.m.daocloud.io
六、Docker開啟遠程管理

默認配置下,Docker daemon 只能響應來自本地 Host 的客戶端請求。如果要允許遠程客戶端請求,需要在配置文件中打開 TCP 監聽,步驟如下:

1、修改配置文件

編輯配置文件 /etc/systemd/system/multi-user.target.wants/docker.service,在環境變量 ExecStart 後面添加 -H tcp://0.0.0.0,允許來自任意 IP 的客戶端連接。

聊聊Docker理论知识(二)

2、重启Docker daemon

systemctl daemon-reload
systemctl restart docker

3、验证

聊聊Docker理论知识(二)

延伸阅读

    评论