docker實戰(一):docker容器生態系統簡介和docker machine多主機管理配置

docker容器生態系統簡介

容器技術

docker目前作爲容器技術使用最爲廣泛的容器技術,可以說已經成爲了容器技術的代名詞。在介紹docker之前首先介紹一下容器技術和虛擬機技術的區別,區分好容器和虛擬機這兩個概念,便能夠很好得理解容器技術。
首先介紹一下虛擬機技術,一臺虛擬機需要模擬整臺機器包括硬件。每臺虛擬機都需要有自己的操作系統,虛擬機一旦被開啓,預分配給它的資源將全部被佔用。每一臺虛擬機都至少包括應用,必要的二進制和庫,以及一個完整的用戶操作系統。之前介紹的openstack雲平臺管理項目,其管理分配的計算,網絡和存儲等資源即通過虛擬機的形式呈現給用戶來使用。因爲openstack的主要功能爲計算網絡存儲資源的分配,因此openstack屬於Iaas層的技術。
而容器技術是和我們的宿主機共享硬件資源及操作系統,可以實現資源的動態分配。容器包含應用和其所有的依賴包,但是與其他容器共享內核。容器在宿主機操作系統中,在用戶空間以分離的進程運行,以linux容器技術例,Linux 容器不是模擬一個完整的操作系統,而是對進程進行隔離,相當於是在正常進程的外面套了一個保護層。對於容器裏面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。可以說,容器技術是實現操作系統虛擬化的一種途徑,可以讓您在資源受到隔離的進程中運行應用程序及其依賴關係。docker屬於linux容器的封裝,屬於 Linux 容器的一種封裝,提供簡單易用的容器使用接口,它是目前最流行的 Linux 容器解決方案。docker可以把一個應用以及應用所依賴的環境打包成一個包,這個包也就是鏡像image,這個鏡像可以在不同的環境中原生運行,成爲一個容器Container,這樣就爲用戶提供了一個環境來保證該應用的開發測試運維環境的一致性,因此docker屬於Paas層的技術。鏡像image,容器container以及存放image的公有和私有倉庫regsitry是docker中的最基本概念。

容器生態系統

以docker爲基石容器生態系統,包含核心技術,平臺技術和支持技術,下面將針對這三部分內容分別進行介紹

容器核心技術

容器核心技術是指能夠讓container在host上運行起來的那些技術,主要包括容器規範,容器runtime,容器管理工具,容器定義工具,倉庫Registries和容器OS:

  1. 容器規範:docker只是容器技術中的一種,還有其他容器,比如CoreOS的rkt。爲了保證不同容器之間能夠兼容,制定了開放的容器規範,包括runtime spec和image format spec;
  2. 容器runtime:runtime是容器真正運行的地方。runtime需要跟操作系統Kernel緊密協作,爲容器提供運行環境。目前主流的三種容器runtime包括lxc,runc和rkt,docker目前使用的runtime爲runc;
  3. 容器管理工具:容器管理工具對內與runtime交互,對外爲用戶提供interface,比如CLI,使得用戶可以使用該工具對容器進行管理。針對不同的容器runtime有不同的容器管理工具,針對runc的容器管理工具爲docker engine,docker engine包括daemon和cli兩個部分,可以理解爲一個後臺管理的守護進程以及一個客戶端與用戶交互;
  4. 容器定義工具:容器定義工具允許用戶定義容器的內容與屬性,這樣容器就能夠被保存、共享和重建。對於docker來說容器定義工具包括docker image和dockerfile。docker image是docker 容器的模板,runtime依據docker image創建容器。dockerfile是包含若干命令的文本文件,可以通過這些命令創建出docker image;
  5. Registry:容器通過image創建,需要有一個倉庫來統一存放image,這個倉庫就叫Registry。目前的公有Registry包括Docker Hub(https://hub.docker.com)和Quay.io(https://quay.io/),企業和個人也可以通過Docker Registry鏡像來構建自己的私有Registry;
  6. 容器OS:容器OS是專門運行容器的操作系統,與傳統OS相比,容器OS通常體積更小,啓動更快,目前的容器OS有CoreOS、Ubuntu Core等;

容器平臺技術

前面介紹的容器核心技術可以讓容器能夠在單個host上運行,而容器平臺技術能夠讓容器作爲集羣在分佈式環境中運行。容器平臺技術包括容器編排引擎,容器管理平臺和基於容器的Paas:

  1. 容器編排引擎:基於容器的應用一般會採用微服務架構,在這種架構下,應用會被劃分爲不同的組件,並以服務的形式運行在各自的容器中,通過API來對外提供服務。爲了保證應用的高可用,每個組件都可能會運行多個相同的容器,這些容器會組成集羣,我們需要有一種高效的方法來管理容器集羣,因此便出現了容器編排引擎。所謂編排,通常包括容器管理,調度,集羣定義和服務發現等。通過容器編排引擎,容器被有機地組合成微服務應用,實現業務需求。目前的容器編排引擎包括docker自研的docker swarm,Google領導開發的容器編排引擎Kubernetes和mesos集羣資源調度平臺+marathon聯合提供容器編排引擎功能;
  2. 容器管理平臺:容器管理平臺是架構在容器編排引擎之上更爲通用的一個平臺。通常容器管理平臺能夠支持多種編排引擎,抽象了編排引擎的底層實現細節,對用戶更加友好。Rancher和ContainerShip是容器管理平臺的典型代表;
  3. 基於容器的Paas:基於容器的Paas爲微服務應用開發人員和公司提供了開發、部署和管理應用的平臺,使用戶不必關心底層基礎設施而專注於應用的開發。Deis、Flynn和Doku都是開源容器Paas的代表;

容器支持技術

多容器集羣的實現和健康運行,需要在網絡,服務發現,日誌監控等多方面技術上提供支持,這部分即爲容器支持技術。容器支持技術,包括容器網絡,服務發現,監控,數據管理,日誌管理和安全性等方面:

  1. 容器網絡:多容器集羣的網絡,需要管理好容器與容器,容器與宿主機實體之間的連通性和隔離性,這需要專門的容器網絡解決方案來進行管理。容器網絡解決方案,目前常用的有docker原生的網絡解決方案docker network,第三方開源解決方案flannel,weave和calico;
  2. 服務發現:以容器技術爲基礎的微服務架構,最大的一個特點就是動態變化,能根據外界負載大小自動創建新的容器或者銷燬舊的容器,不同host上的容器也能根據不同host的負載情況在host之間進行遷移。這種動態的環境需要一種機制來快速發現服務對應的容器的變化並保存該容器集羣中所有微服務的最新消息,比如IP和端口等,並對外提供哦你API和服務,這就是服務發現。目前常用的服務發現的解決方案包括etcd,consul和zookeeper;
  3. 監控:容器集羣的動態特性對監控提出了更高的要求與挑戰,除了docker原生的命令行工具之外,sysdig、cAdvisor/Heapster和Weave Scope也是常用的第三方開源的容器監控方案;
  4. 數據管理:容器集羣中的容器經常會在不同的host之間遷移,如何保證持久化數據也能夠動態遷移,是Rex-Ray這類數據管理工具提供的能力;

docker-machine多主機管理工具的安裝與使用

通過docker-machine來安裝多主機docker

單主機下docker的安裝與配置相對來說比較簡單(相比較openstack需要用多篇博文來講解各個組件的配置來說…),這裏不再作介紹。我們接下來介紹一種能夠在多主機上安裝配置docker的工具——docker machine,用docker machine可以批量安裝和配置docker host。我們的實驗環境爲一臺安裝了linux系統的宿主機192.168.1.102,兩臺運行在virtualbox中的虛擬機192.168.1.104和192.168.1.105,系統均爲ubuntu16。首先要配置宿主機在root賬號下免密碼ssh登錄兩臺虛擬機,具體方法可參考我之前寫的博文https://blog.csdn.net/weixin_41977332/article/details/104130967。之後在宿主機上安裝docker-machine,官方安裝文檔在https://docs.docker.com/machine/install-machine/,主要是在root用戶下執行如下命令

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

執行完安裝命令後,若在命令行執行docker-machine version能夠顯示docker-machine的版本,證明docker-machine安裝成功。
對於docker machine來說,術語Machine就是運行docker daemon的主機,創建Machine就是在host上安裝和部署docker,以在虛擬機192.168.1.104上部署docker爲例,在該虛擬機上創建host1的命令如下:

docker-machine create --driver generic --generic-ip-address=192.168.1.104 --engine-registry-mirror http://XXXXX.m.daocloud.io host1

其中–driver部分的參數,因爲我們要在linux系統中安裝docker,所以使用generic driver,其他的driver可參考https://docs.docker.com/machine/drivers/。–engine-registry-mirror爲配置國內加速鏡像,因爲在國內的網絡環境中可能會因爲網絡問題導致安裝失敗,所以需要去daocloud.io網站上註冊一個用戶,然後獲取加速鏡像網址。
如果安裝成功的話,在安裝了docker-machine的宿主機上執行docker-machine ls 命令,能夠顯示host相關的信息,如下所示:
在這裏插入圖片描述

bash completion script配置

如果我們需要在宿主機上登錄host1,可以通過如下命令來進行訪問

docker-machine env host1

會顯示如下內容

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.1.104:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/host1"
export DOCKER_MACHINE_NAME="host1"
# Run this command to configure your shell: 
# eval $(docker-machine env host1)

所以接下來執行eval $(docker-machine env host1)即可進入host1環境
在這裏插入圖片描述注意,在未配置bash completion script之前,方括號內的host1是不會顯示的,此時很難判斷是否進入host1環境中,因此需要配置bash completion script,其步驟如下:
首先下載三個腳本

git clone https://github.com/docker/machine/contrib/completion/bash

將三個腳本放到/etc/bash_completion.d中
將如下代碼添加到~/.bashrc中

PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
source /etc/bash_completion.d/docker-machine-wrapper.bash
source /etc/bash_completion.d/docker-machine-prompt.bash
source /etc/bash_completion.d/docker-machine.bash

退出root用戶exit,重新登錄su後,通過docker-machine登錄host1即能顯示如上內容。

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