Docker Swarm:叢集

假裝我是程式猿發表於2017-11-09

Docker Swarm 是建立伺服器叢集用的工具。把一堆伺服器綁到一塊兒用,讓它們看起來像是一臺伺服器,通過統一的介面在這些伺服器上執行應用。


叢集裡的伺服器之間相互知道彼此,它們也知道哪些伺服器上執行了什麼樣的服務,如果訪問的服務在伺服器上不存在,它會把訪問轉移到叢集裡的正確的伺服器上去處理。一個服務可以用多個容器來支援,這些容器執行在叢集裡的不同的伺服器上,請求可以均衡的分佈給這些容器。當有伺服器掛掉以後,在它上面執行的服務會被轉移到其它的伺服器上執行。


Docker Swarm 只需要幾行命令就可以為應用建立一個強大的叢集,為你的應用提供高可用的服務。


模擬叢集環境


如果你已經有了幾臺伺服器,安裝 Docker 以後就可以去建立一個伺服器叢集了,如果你想在本地測試 Docker Swarm 的功能,可以模擬一個叢集環境,也就是在本地建立幾臺 Linux 系統的虛擬機器,安裝 Docker ,配置叢集。下面介紹使用 Vagrant 建立虛擬機器的方法。
1.安裝 Virtualbox:虛擬機器軟體 2.安裝 Vagrant:管理虛擬機器用的工具,它可以管理 Virtualbox 虛擬機器 3.安裝 Vagrant Hostmanager 外掛
Windows 如果啟用了 Hyper-v 以後,就不能再使用 Virtualbox 或者其它的虛擬軟體了。
Vagrant Hostmanager 是 Vagrant 的一個外掛,設定了虛擬機器的主機名以後,這個外掛可以幫助我們設定虛擬機器中的 /etc/hosts 檔案,在裡面新增正確的主機記錄,這樣如果建立了多臺虛擬機器,這些虛擬機器之間可以使用虛擬機器的主機名來訪問到對方,這個外掛並不是必須的,不過它很有用,它也可以設定本地主機上的 hosts 檔案,這樣你在本地主機上也可以直接使用虛擬機器的主機名來訪問到它。


建立專案目錄


cd /Users/devon/docker/
mkdir docker-swarm
cd docker-swarm複製程式碼

初始化專案,使用 centos/7 這個 box


vagrant init centos/7複製程式碼

用編輯器開啟專案目錄


atom ./複製程式碼

編輯一下專案根目錄下的 Vagrantfile,替換成下面的程式碼,它可以建立三臺虛擬機器,test1,test2,test3。

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"複製程式碼

請安裝 vagrant-hostmanager 外掛


  # https://github.com/devopsgroup-io/vagrant-hostmanager
  config.hostmanager.enabled = true
  config.hostmanager.manage_host = true
  config.hostmanager.manage_guest = true

  config.vm.define "test1" do |test1|
    node1.vm.network "private_network", ip: "192.168.33.11"
    node1.vm.hostname="test1"
  end

  config.vm.define "test2" do |test2|
    node2.vm.network "private_network", ip: "192.168.33.12"
    node2.vm.hostname="test2"
  end

  config.vm.define "test3" do |test3|
    node3.vm.network "private_network", ip: "192.168.33.13"
    node3.vm.hostname="test3"
  end

end複製程式碼

啟動虛擬機器


vagrant up複製程式碼

安裝 Docker


虛擬機器啟動以後,登入到這些虛擬機器,然後在上面安裝 Docker:

curl -fsSL https://test.docker.com/ | sh
sudo systemctl enable docker
sudo systemctl start docker複製程式碼

建立叢集


叢集裡的伺服器有兩種身份,一個是 manager (管理員),一種是 worker(工人),在管理員伺服器上可以建立服務,擴充套件服務,更新服務,管理員伺服器本身也可以執行服務。先去初始化一個叢集伺服器,比如我想在 test1 這臺伺服器上初始化一下,先登入到這臺伺服器。

登入到 test1 伺服器


vagrant ssh test1複製程式碼

初始化 Swarm 叢集


docker swarm init --listen-addr test1:2377複製程式碼

這樣 test1 預設就會是這個叢集裡的管理員,現在叢集裡只有一個節點伺服器,可以檢視一下:
docker node ls
在初始化叢集的時候用了 --listen-addr,指定了一下這個叢集管理員的地址還有埠號,預設地址應該是 0.0.0.0 ,這裡我用了一個主機名來表示,test1。列出這個選項是讓展示一下你可以自由的設定伺服器的監聽地址與埠號,如果使用主機名,你要保證叢集裡的其它的伺服器可以使用這個主機名訪問到這臺伺服器。
加入叢集

有了叢集以後,你要讓其它的伺服器加入進來:

登入到 test2


vagrant ssh test2複製程式碼

讓 test2 加入到叢集


docker swarm join --listen-addr test2:2377 test1:2377複製程式碼

登入到 test3


vagrant ssh test3複製程式碼

讓 test3 加入到叢集


docker swarm join --listen-addr test3:2377 test1:2377複製程式碼

現在叢集裡一共有三臺伺服器了,在叢集的 manager 裡面可以檢視一下伺服器的列表:

docker node ls複製程式碼

讓伺服器加入叢集的時候,也用到了 --listen-addr 選項,設定了這臺伺服器監聽的地址與埠,其它的伺服器會使用這個地址與埠跟它進行交流。後面又指定了讓這臺伺服器加入到的那個叢集,也就是通知一下叢集裡的管理員伺服器。


建立叢集網路

叢集裡的伺服器使用一種 overlay 型別的網路,我們可以建立一種這樣的網路,然後在叢集裡執行服務的時候可以指定使用這個網路。在叢集的
manager 上(test1),執行:

docker network create --driver overlay skynet複製程式碼

這樣會建立一個名字是 skynet 的 overlay 型別的網路。


建立服務

在叢集的 manger 節點上,可以去建立執行應用的服務,執行一下:

docker service create --name web --network skynet --publish 3000:3000 --replicas 1 devon/test複製程式碼

上面命令會基於寧皓網的 devon/node 映象建立一個名字是 web 的服務,使用 skynet 這個名字的網路,釋出的埠是 3000 。--replicas 指定了這個服務用一個容器來執行。完成以後,可以開啟瀏覽器,訪問一下:

http://test1:3000
http://test2:3000
http://test3:3000複製程式碼

雖然 web 這個服務只有一個容器執行,它會在叢集裡的某臺伺服器上,很可能是 test1 這個伺服器,不管它在哪個伺服器上執行,訪問叢集裡的所有的伺服器,都可以正常開啟服務提供的頁面,你應該會在頁面上看到一個 hello ,還有執行這個應用的容器的 id 號。


擴充套件服務

現在我要用多個容器來執行應用,這些容器會在叢集裡的不同的伺服器上執行。擴充套件執行服務的容器的數量,在叢集的 manager 節點上執行一下:

docker service scale web=6複製程式碼

上面的命令會用 6 個容器同時執行 web 這個服務,這 6 個容器會分佈在不同的伺服器上,檢視執行服務的任務,執行一下:

docker service tasks web複製程式碼

你會看到在哪些伺服器上執行了 web 這個服務。在不同的瀏覽器上再訪問一下應用的頁面,你會發現,執行應用的容器的 id 號會有變化,也就是使用者對應用的請求會被均衡的分佈在不同的伺服器上。


更新服務

服務被建立以後,可以更新它,比如服務的埠號,資料卷,網路,映象,這些東西都可以更新。我要更新一下 web 服務用的映象,在叢集的 manager 上執行:

docker service update web --image devon/test:fanxiao2複製程式碼

它會讓 web 服務基於新的映象 devon/test:fanxiao2 去建立,更新完成以後,重新開啟瀏覽器,訪問一下應用的頁面,頁面上顯示的內容會有變化。
如果發現下面的錯誤:

docker swarm init --listen-addr test1:2377 了 提示 docker: 'swarm' is not a docker command. See 'docker --help'.複製程式碼

這是版本問題導致的,請把docker 升級到 1.12及以上

覺得我分享的文章對你有幫助或者對內容有什麼異議,請聯絡微信公眾號:範小二

相關文章