Docker--基礎

yoylee_web發表於2018-10-13

ps:本博文為整理博文,是樓主在學習過程中整理的資源便於以後學習,借鑑的資源都已在文末標出。

一:Docker介紹

     Docker(中文:碼頭工人) 基於Go語言並遵從Apache2.0協議開源的應用容器引擎,可以輕鬆的為任何應用建立一個輕量級的、可移植的、自給自足的容器。容器引擎與容器關係。容器小汽車,容器引擎就是引擎呀,哈哈

    1:Docker解決了什麼難題?

  • 軟體開發最大的麻煩事之一,就是環境配置。使用者計算機的環境都不相同,你怎麼知道自家的軟體,能在那些機器跑起來?

  • 使用者必須保證兩件事:作業系統的設定,各種庫和元件的安裝。只有它們都正確,軟體才能執行。如果某些老舊的模組與當前環境不相容,那就麻煩了。

  • 環境配置如此麻煩,換一臺機器,就要重來一次,曠日費時。很多人想到,能不能從根本上解決問題,軟體可以帶環境安裝?也就是說,安裝的時候,把原始環境一模一樣地複製過來。那如何解決呢?

  • 解決方法一:虛擬機器(virtual machine,縮寫為VM)就是帶環境安裝的一種解決方案。它可以在一種作業系統裡面執行另一種作業系統,比如在 Windows 系統裡面執行 Linux 系統。應用程式對此毫無感知,因為虛擬機器看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機器就是一個普通檔案,不需要了就刪掉,對其他部分毫無影響。但是缺點是:資源佔用多,冗餘步驟多,啟動慢

  • 解決方法二:linux容器(Linux Containers,縮寫為 LXC)是Linux 發展出的另一種虛擬化技術。Linux 容器不是模擬一個完整的作業系統,而是對程式進行隔離。或者說,在正常程式的外面套了一個保護層。對於容器裡面的程式來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。由於容器是程式級別的,相比虛擬機器有很多優勢:啟動快、資源佔用少、體積小

  • Docker 就是屬於 Linux 容器的一種封裝,提供簡單易用的容器使用介面。它是目前最流行的 Linux 容器解決方案。

     Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機器)、bare metal、OpenStack 叢集和其他的基礎應用平臺。 比如 Web 應用、後臺應用、資料庫應用、大資料應用比如 Hadoop 叢集、訊息佇列等等都可以打包成一個映象部署。

     Docker系統有兩個程式:docker服務端和docker客戶端。其中docker服務端是一個服務程式,管理著所有的容器。docker客戶端則扮演著docker服務端的遠端控制器,可以用來控制docker的服務端程式。大部分情況下,docker服務端和客戶端執行在一臺機器上。

     容器是完全使用沙箱機制,相互之間不會有任何介面(類似 iPhone 的 app),更重要的是容器效能開銷極低。

    2:Docker的沙箱機制

  • 沙箱機制是程式只能訪問自己的目錄,這個目錄稱為沙箱目錄,而應用程式之間禁止資料的共享和訪問;

  • 沙箱機制是一種安全機制,設計原理就是隻能允許自己的應用訪問目錄,而不允許其他的應用訪問;

    3:Docker常用場景:

  • web應用的自動化打包和釋出;

  • 自動化測試和持續整合、釋出;

  • 在服務型環境中部署和調整資料庫或其他的後臺應用;

  • 從頭編譯或者擴充套件現有的OpenShift或Cloud Foundry平臺來搭建自己的PaaS環境

    4:Docker主要用途

  • 提供一次性的環境。比如,本地測試他人的軟體、持續整合的時候提供單元測試和構建的環境。

  • 提供彈性的雲服務。因為 Docker 容器可以隨開隨關,很適合動態擴容和縮容。

  • 組建微服務架構。通過多個容器,一臺機器可以跑多個服務,因此在本機就可以模擬出微服務架構。

    5:Docker版本

  • Docker社群版(CE):為了開發人員或小團隊建立基於容器的應用,與團隊成員分享和自動化的開發管道。docker-ce提供了簡單的安裝和快速的安裝,以便可以立即開始開發。docker-ce整合和優化,基礎設施。(免費)

  • Docker企業版(EE):專為企業的發展和IT團隊建立誰。docker-ee為企業提供最安全的容器平臺,以應用為中心的平臺。(付費)

    6:Docker的image檔案

  • Docker 把應用程式及其依賴,打包在 image 檔案裡面。只有通過這個檔案,才能生成 Docker 容器。

  • image 檔案可以看作是容器的模板。Docker 根據 image 檔案生成容器的例項。同一個 image 檔案,可以生成多個同時執行的容器例項。

  • image 是二進位制檔案。實際開發中,一個 image 檔案往往通過繼承另一個 image 檔案,加上一些個性化設定而生成。舉例來說,你可以在 Ubuntu 的 image 基礎上,往裡面加入 Apache 伺服器,形成你的 image。

  • image 檔案是通用的,一臺機器的 image 檔案拷貝到另一臺機器,照樣可以使用。一般來說,為了節省時間,我們應該儘量使用別人製作好的 image 檔案,而不是自己製作。即使要定製,也應該基於別人的 image 檔案進行加工,而不是從零開始製作。

  • 為了方便共享,image 檔案製作完成後,可以上傳到網上的倉庫。Docker 的官方倉庫Docker Hub是最重要、最常用的 image 倉庫。此外,出售自己製作的 image 檔案也是可以的。

    7:Docker的容器檔案

  • image 檔案生成的容器例項,本身也是一個檔案,稱為容器檔案。

  • 也就是說,一旦容器生成,就會同時存在兩個檔案: image 檔案和容器檔案。而且關閉容器並不會刪除容器檔案,只是容器停止執行而已。

二:架構相關

    Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。

    Docker 容器通過 Docker 映象來建立。容器與映象的關係類似於物件導向程式設計中的物件(容器)與類(映象)。

    架構圖與相關解釋表格如下(來自:http://www.runoob.com/docker/docker-architecture.html):

    

Docker 映象(Images)

Docker 映象是用於建立 Docker 容器的模板。類似於映象(類),容器(類物件)。

Docker 容器(Container)

容器是獨立執行的一個或一組應用。

Docker 客戶端(Client)

Docker 客戶端通過命令列或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護程式通訊。

Docker 主機(Host)

一個物理或者虛擬的機器用於執行 Docker 守護程式和容器。

Docker 倉庫(Registry)

Docker 倉庫用來儲存映象,可以理解為程式碼控制中的程式碼倉庫。

Docker Hub(https://hub.docker.com) 提供了龐大的映象集合供使用。

Docker Machine

Docker Machine是一個簡化Docker安裝的命令列工具,通過一個簡單的命令列即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

三:基礎操作與流程

  • 安裝docker(CentOS系統為例)

//切換為root使用者或者直接使用sudo 也可以
$  su root  
   
//安裝
# yum remove docker \
        docker-client \
        docker-client-latest \
        docker-common \
        docker-latest \
        docker-latest-logrotate \
        docker-logrotate \
        docker-selinux \
        docker-engine-selinux \
        docker-engine

//安裝一些必要系統工具
# yum install -y yum-utils device-mapper-persistent-data lvm2
  • 啟動docker服務

service docker service 
  • 測試hello-world

docker run hello-world       

如果是新安裝的docker會自動下載映象並建立容器來執行,在顯示的資訊中可以看到docker的處理流程:
//docker自動處理流程
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
//翻譯後
1. Docker客戶端連線Docker守護執行緒。
2. Docker守護執行緒從Docker Hub中提取“hello-world”映象。
3. Docker守護執行緒從該映象建立一個新容器,該容器執行生成您當前正在讀取的可執行檔案
4. Docker守護程式將其輸出以流的方式 傳輸到Docker客戶端,後者將其傳送到您的終端。
cd /etc/docker

vim daemon.json   //沒有該檔案手動建立一個

//新增以下部分

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
  • Docker 允許你在容器內執行應用程式, 使用 docker run 命令來在容器內執行一個應用程式。執行簡易程式列印”Hello World!“

docker run ubuntu:15.10 /bin/echo "Hello world"

//意義:Docker 以 ubuntu15.10 映象建立一個新容器,然後在容器裡執行 bin/echo "Hello world",然後輸出結果。

//此命令各個引數解析:
* docker:         Docker 的二進位制執行檔案。
* run:            與前面的 docker 組合來執行一個容器。
* ubuntu:15.10:   指定要執行的映象,Docker首先從本地主機上查詢映象是否存在,如果不存在,Docker 就會從映象倉庫 Docker Hub 下載公共映象。
* /bin/echo "Hello world": 在啟動的容器裡執行的命令。
  • 執行互動式容器:引數(-i   -t),執行互動bash

docker run -i  ubuntu:15.10
//引數含義:
* -i  :允許你對容器內的標準輸入 (STDIN) 進行互動。
//測試:
輸入 ls  回車後顯示資料夾列表


docker run -i -t ubuntu:15.10 /bin/bash
//引數含義:
*-i  :允許你對容器內的標準輸入 (STDIN) 進行互動。
* -t    :在新容器內指定一個偽終端或終端。在該語句中我們指定/bin/bash偽造一個客戶端
//測試:
格式和我們的linux伺服器幾乎一致
  • 後臺模式啟動容器 與 停止容器

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
//語句含義:
啟動以ubuntu:15.10映象建立一個以程式方式後臺執行的容器,執行"while true; do echo hello world; sleep 1; done"語句
//返回值:
返回一個字串,就是該容器的唯一ID,通過該ID我們才可以進行
//引數含義:
-d : 後臺執行容器

docker ps 
//檢視執行的容器

docker stop 容器ID或者容器名稱
//停止容器

參考:http://www.runoob.com/docker/docker-architecture.html

https://baijiahao.baidu.com/s?id=1591887487395526427&wfr=spider&for=pc

相關文章