Docker集群管理基礎(chǔ)

這篇文章講了Docker-machine,Docker-compose,Docker-swarm的一些基礎(chǔ)知識。

這里是基于docker1.12之前的版本

1 Docker Machine

1.1 簡介

Docker Machine 是 Docker 官方編排(Orchestration)項(xiàng)目之一,負(fù)責(zé)在多種平臺
上快速安裝 Docker 環(huán)境。
現(xiàn)在支持很多驅(qū)動,通過-d參數(shù)即可,比如:

驅(qū)動

1.2 安裝

Linux下:

$curl -L https://github.com/docker/machine/releases/download/v0.10.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine &&
    chmod +x /tmp/docker-machine &&
    sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

or mac環(huán)境下:

$brew install docker-machine

1.3 運(yùn)行

v0.10.0有一個(gè)比較大的change,如官網(wǎng)所說:

There is one small breaking change in this release. The default driver for docker-machine create has been changed from none to virtualbox. virtualbox was far more common than none, so this change allows you to quickly create VirtualBox machines like so:

$ docker-machine create manager
...
$ docker-machine create worker
...

boot2docker:
如果上述中出現(xiàn)問題,可以手工安裝boot2docker:
https://github.com/boot2docker/boot2docker/releases

$curl -Lo ~/.docker/machine/cache/boot2docker.iso https://github.com/boot2docker/boot2docker/releases/download/v1.13.1/boot2docker.iso

現(xiàn)在一個(gè)大的問題就是,github使用的amazon的云被墻了,所以都不行。

2 Docker-compose

2.1 簡介

Docker Compose 是 Docker 官方編排(Orchestration)項(xiàng)目之一,負(fù)責(zé)快速在集
群中部署分布式應(yīng)用。

docker compose
  • 定義和運(yùn)行多個(gè)Docker容器的工具
  • 一個(gè)文件 – docker-compose.yml
  • 一條命令 – docker-compose up

2.2 安裝

$curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

2.3 例子

docker-compose.yml

weba:
  build: ./web
  expose:
    - 80
webb:
  build: ./web
  expose:
    - 80
webc:
  build: ./web
  expose:
    - 80
haproxy:
  image: haproxy:latest
  volumes:
    - ./haproxy:/haproxy-override
    - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
  links:
    - weba
    - webb
    - webc
  ports:
    - "80:80"
    - "70:70"
  expose:
    - "80"
    - "70"  

子文件夾結(jié)構(gòu)如下:

文件架結(jié)構(gòu)

haproxy目錄下:haproxy.cfg是配置文件。
web目錄下:python web啟動的dockerfile及index.py和html這兩個(gè)后端和前端文件。
dockerfile如下所示:

FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py

最后使用docker-compose up 即可啟動。

2.4 Docker-compose命令集

  • 管理鏡像 – build/pull
  • 管理服務(wù) – up/start/stop/kill/rm/scale
  • 服務(wù)狀態(tài) – ps/logs/port
  • 一次性命令 - run

2.5 Docker Compose工作原理

  • 工程(project)/服務(wù)(service)/容器(container)
  • 調(diào)用docker-py庫與遠(yuǎn)程Docker Daemon/Swarm API -Server通信
  • 按依賴性排序/調(diào)度

3 Docker Swarm

3.1 簡介

Docker Swarm 是 Docker 官方編排(Orchestration)項(xiàng)目之一,負(fù)責(zé)對 Docker 集
群進(jìn)行管理。

Docker Swarm
  • Docker集群管理工具
  • 多個(gè)Docker主機(jī)抽象成一個(gè)單一的虛擬主機(jī)
  • 支持標(biāo)準(zhǔn)Docker API

Docker Swarm 是 Docker公司官方在 2014 年 12月初發(fā)布的一套管理 Docker 集群 的工具。它將一群 Docker 宿主機(jī)變成一個(gè)單一的,虛擬的主機(jī)。
Swarm 使用標(biāo)準(zhǔn)的 Docker API 接口作為其前端訪問入口,換言之,各種形式的 Docker 工具比如 Dokku,Compose,Krane,Deis,docker-py,Docker 本身等都 可以很容易的與 Swarm 進(jìn)行集成。

工作原理如下:

工作原理

下面我使用2個(gè)方向來介紹Docker Swarm的使用:

  1. 使用Docker-machine來創(chuàng)建swarm集群
  2. 使用原生Swarm命令來創(chuàng)建Swarm集群

3.2 使用Docker-machine來創(chuàng)建swarm集群

Docker 集群管理需要使用服務(wù)發(fā)現(xiàn)(Discovery service backend)功能,Swarm支持 以下的幾種方式:DockerHub 提供的服務(wù)發(fā)現(xiàn)功能,本地的文件,etcd,consul, zookeeper 和 IP 列表,本節(jié)會詳細(xì)講解前三種方式,其他的用法都是大同小異 的。

3.2.1 使用Dockerhub提供的服務(wù)發(fā)現(xiàn)功能

參考:https://docs.docker.com/swarm/discovery/

Step1: 創(chuàng)建Token

swarm create - 從Docker Hub發(fā)現(xiàn)服務(wù)申請一個(gè)唯一標(biāo)識此集群的token

$docker run swarm create
b7625e5a7a2dc7f8c4faacf2b510078e

Step2:創(chuàng)建Swarm管理節(jié)點(diǎn)及工作節(jié)點(diǎn)

管理節(jié)點(diǎn)swarm-master:

docker-machine create \
     -d virtualbox \
    --engine-registry-mirror http://db8ff3fd.m.daocloud.io\
     --swarm \
     --swarm-master \
     --swarm-discovery token://b7625e5a7a2dc7f8c4faacf2b510078e \
     swarm-master
docker@swarm-master:~$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                      COMMAND                                                                                                                                                                                                                                                         CREATED             STATUS              PORTS                                            NAMES
2c4773d7ca84f1547580aa43ec38250651fb8ec9a005062d2dc4fbf130490771   microbox/etcd:latest       "/bin/etcd -addr 10.0.2.15:4001 -peer-addr 10.0.2.15:7001"                                                                                                                                                                                                      14 hours ago        Up 14 hours         0.0.0.0:4001->4001/tcp, 0.0.0.0:7001->7001/tcp   shipyard-discovery
3d4493eb0934ac1aba15c503cea4f9512a0e3c50d4d0c61ca9674ea95e23cf36   russmckendrick/nginx-php   "supervisord"                                                                                                                                                                                                                                                   18 hours ago        Up 18 hours         0.0.0.0:80->80/tcp, 443/tcp                      kickass_aryabhata
3e81e904465f9a162a7b6e8059d9bb46d237795ded58db7f50f038f6a500b775   swarm:latest               "/swarm join --advertise 192.168.99.101:2376 etcd://192.168.99.100:4001"                                                                                                                                                                                        18 hours ago        Up 18 hours         2375/tcp                                         swarm-agent
0ecc90458128926e56cbcc28f02bab3fc759ceba92cb3e3d167136442180d912   swarm:latest               "/swarm manage --tlsverify --tlscacert=/var/lib/boot2docker/ca.pem --tlscert=/var/lib/boot2docker/server.pem --tlskey=/var/lib/boot2docker/server-key.pem -H tcp://0.0.0.0:3376 --strategy spread --advertise 192.168.99.101:3376 etcd://192.168.99.100:4001"   18 hours ago        Up 18 hours         2375/tcp, 0.0.0.0:3376->3376/tcp                 swarm-agent-master

swarm manage – 啟動swarm manage進(jìn)程

工作節(jié)點(diǎn)swarm-node-00:

docker-machine create \
     -d openstack \
     --engine-registry-mirror http://db8ff3fd.m.daocloud.io\
     --swarm \
     --swarm-discovery token://b7625e5a7a2dc7f8c4faacf2b510078e  \
     swarm-node-00
 docker@swarm-node-00:~$ docker ps --no-trunc
CONTAINER ID                                                       IMAGE                      COMMAND                                                                    CREATED             STATUS              PORTS                         NAMES
f9fe781e0e34fa73921d7fc741a9e7648f982a99a79f612535727275635b8166   russmckendrick/nginx-php   "supervisord"                                                              3 weeks ago         Up 3 weeks          0.0.0.0:80->80/tcp, 443/tcp   brave_heyrovsky
0914302f17258775f95aab4c61c725735dd004fba6df8b2a9b582d8e6e883d64   mysql                      "docker-entrypoint.sh mysqld"                                              3 weeks ago         Up 3 weeks          3306/tcp                      mysql
759617d53f392279f3c927f3b6583b0eec17eed4d1ccb95b1d70e55090a69654   swarm:latest               "/swarm join --advertise 192.168.99.102:2376 etcd://192.168.99.100:4001"   3 weeks ago         Up 3 weeks          2375/tcp                      swarm-agent 

這樣我們就創(chuàng)造了一個(gè)名字為swarm-master的管理節(jié)點(diǎn),及swarm-node-00和swarm-node-01的集群。

Step3: 顯示集群信息

集群信息
eval $(docker-machine env --swarm swarm-master)
XiaoleideMacBook-Pro:nss professor$ docker-machine ls
NAME            ACTIVE   DRIVER       STATE     URL                         SWARM                   DOCKER    ERRORS
localtest       *        virtualbox   Running   tcp://192.168.99.100:2376                           v1.13.1
swarm-master    -        virtualbox   Running   tcp://192.168.99.101:2376   swarm-master (master)   v1.13.1
swarm-node-00   -        virtualbox   Running   tcp://192.168.99.102:2376   swarm-master            v1.13.1
swarm-node-01   -        virtualbox   Running   tcp://192.168.99.103:2376   swarm-master            v1.13.1
XiaoleideMacBook-Pro:nss professor$ eval $(docker-machine env --swarm swarm-master)
XiaoleideMacBook-Pro:nss professor$ docker info
Containers: 11
 Running: 7
 Paused: 0
 Stopped: 4
Images: 6
Server Version: swarm/1.2.6
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint, whitelist
Nodes: 3
 swarm-master: 192.168.99.101:2376
  └ ID: RIRL:X5TL:EQQP:LSON:ANTV:TT4F:ZCVN:QPHN:2EX7:ID5C:VK5A:LZ3X
  └ Status: Healthy
  └ Containers: 2 (2 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: kernelversion=4.4.47-boot2docker, operatingsystem=Boot2Docker 1.13.1 (TCL 7.2); HEAD : b7f6033 - Wed Feb  8 20:31:48 UTC 2017, provider=virtualbox, storagedriver=aufs
  └ UpdatedAt: 2017-03-28T07:25:40Z
  └ ServerVersion: 1.13.1
 swarm-node-00: 192.168.99.102:2376
  └ ID: GJIW:ABWA:6OP5:ZHYU:2GWG:NV32:QJJE:5H7Y:ISTD:62AL:VEWL:47Y3
  └ Status: Healthy
  └ Containers: 6 (3 Running, 0 Paused, 3 Stopped)
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: kernelversion=4.4.47-boot2docker, operatingsystem=Boot2Docker 1.13.1 (TCL 7.2); HEAD : b7f6033 - Wed Feb  8 20:31:48 UTC 2017, provider=virtualbox, storagedriver=aufs
  └ UpdatedAt: 2017-03-28T07:25:40Z
  └ ServerVersion: 1.13.1
 swarm-node-01: 192.168.99.103:2376
  └ ID: LOW7:5ZSC:7XQR:KLRU:CIHB:IF34:6DEZ:EGBB:W3BS:D54H:TPA5:MF3D
  └ Status: Healthy
  └ Containers: 3 (2 Running, 0 Paused, 1 Stopped)
  └ Reserved CPUs: 0 / 1
  └ Reserved Memory: 0 B / 1.021 GiB
  └ Labels: kernelversion=4.4.47-boot2docker, operatingsystem=Boot2Docker 1.13.1 (TCL 7.2); HEAD : b7f6033 - Wed Feb  8 20:31:48 UTC 2017, provider=virtualbox, storagedriver=aufs
  └ UpdatedAt: 2017-03-28T07:25:40Z
  └ ServerVersion: 1.13.1

通過docker-machine env swarm-master,可以直接操控swarm-master,進(jìn)一步來控制整個(gè)集群。
其中:eval $(docker-machine env --swarm swarm-master),可以理解為直接控制了這個(gè)docker管理節(jié)點(diǎn)。
比如:

XiaoleideMacBook-Pro:nss professor$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                NAMES
7310e34db6b5        russmckendrick/nginx-php   "supervisord"            3 weeks ago         Up 3 weeks          192.168.99.103:80->80/tcp, 443/tcp   swarm-node-01/elated_joliot
f9fe781e0e34        russmckendrick/nginx-php   "supervisord"            3 weeks ago         Up 3 weeks          192.168.99.102:80->80/tcp, 443/tcp   swarm-node-00/brave_heyrovsky
0914302f1725        mysql                      "docker-entrypoint..."   3 weeks ago         Up 3 weeks          3306/tcp                             swarm-node-00/mysql

tips: --engine-registry-mirror http://db8ff3fd.m.daocloud.io
生成machine之前加入這個(gè)參數(shù)可以使用daocloud的加速器,國外太慢。

step4:創(chuàng)建容器
例子1 :創(chuàng)建2個(gè)容器

$docker -H 192.168.99.101:2376 pull redis
$docker -H 192.168.99.102:2376 pull mysql

docker run -d --name mysql -e affinity:image==mysql -e MYSQL_ROOT_PASSWORD=root mysql

docker run -d --name redis1 -e affinity:image==redis redis

eval $(docker-machine env --swarm swarm-master)
XiaoleideMacBook-Pro:compose-haproxy-web professor$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
72896f932fae        mysql               "docker-entrypoint..."   4 seconds ago       Up 3 seconds        3306/tcp            swarm-node-00/mysql
68a7c531ec08        redis               "docker-entrypoint..."   3 minutes ago       Up 3 minutes        6379/tcp            swarm-master/redis1

可以看出來,使用-H的話,可以兩個(gè)鏡像分別在兩個(gè)node中

例子2:創(chuàng)建3個(gè)容器

$docker -H 192.168.99.101:2376 pull russmckendrick/nginx-php
$docker -H 192.168.99.102:2376 pull russmckendrick/nginx-php
$docker -H 192.168.99.103:2376 pull russmckendrick/nginx-php

運(yùn)行3次,啟動3個(gè)容器。
docker run -d -p 80:80 russmckendrick/nginx-php

雖然端口一樣。但是swarm將其分到兩個(gè)節(jié)點(diǎn)上。

XiaoleideMacBook-Pro:nss professor$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                NAMES
3d4493eb0934        russmckendrick/nginx-php   "supervisord"            2 seconds ago       Up 2 seconds        192.168.99.101:80->80/tcp, 443/tcp   swarm-master/kickass_aryabhata
7310e34db6b5        russmckendrick/nginx-php   "supervisord"            3 weeks ago         Up 3 weeks          192.168.99.103:80->80/tcp, 443/tcp   swarm-node-01/elated_joliot
f9fe781e0e34        russmckendrick/nginx-php   "supervisord"            3 weeks ago         Up 3 weeks          192.168.99.102:80->80/tcp, 443/tcp   swarm-node-00/brave_heyrovsky
0914302f1725        mysql                      "docker-entrypoint..."   3 weeks ago         Up 3 weeks          3306/tcp                             swarm-node-00/mysql
3.2.2 使用etcd提供的服務(wù)發(fā)現(xiàn)功能

這里不做贅述,只把如何配置etcd服務(wù),及如何修改docker-machine的命令列一下:

啟動etcd服務(wù):

$docker-machine create \
    --engine-registry-mirror http://db8ff3fd.m.daocloud.io\
    localtest
$eval $(docker-machine env localtest)
$docker run -ti -d -p 4001:4001 -v /etc/ssl/certs/:/etc/ssl/certs/ docker.io/microbox/etcd --name discovery

這里可以看出,使用docker-machine啟動了一個(gè)docker環(huán)境 localtest,ssh進(jìn)去后,創(chuàng)建一個(gè)etcd的鏡像,并暴露4001端口。

啟動swarm管理及工作節(jié)點(diǎn):

$docker-machine create \
     -d virtualbox \
    --engine-registry-mirror http://db8ff3fd.m.daocloud.io\
     --swarm \
     --swarm-master \
     --swarm-discovery etcd://192.168.99.100:4001 \
     swarm-master
$docker-machine create \
     -d openstack \
     --engine-registry-mirror http://db8ff3fd.m.daocloud.io\
     --swarm \
     --swarm-discovery etcd://192.168.99.100:4001  \
     swarm-node-00
$docker-machine create \
     -d virtualbox \
     --engine-registry-mirror http://db8ff3fd.m.daocloud.io\
     --swarm \
     --swarm-discovery etcd://192.168.99.100:4001 \
     swarm-node-01
$ docker run swarm list etcd://192.168.99.100:4001
time="2017-03-28T07:32:45Z" level=info msg="Initializing discovery without TLS"
192.168.99.101:2376
192.168.99.102:2376
192.168.99.103:2376

可以看出和上面github提供的token相比,--swarm-discovery使用的是etcd
后面就一樣了。

3.3 使用原生命令啟動swarm集群

根據(jù)官網(wǎng)的介紹。

In Docker 1.12 and higher, Swarm mode is integrated with Docker Engine.

所以,對于Docker1.12版本之前可以參閱此文檔中使用docker-machine的辦法來創(chuàng)建swarm集群。
對于Docker1.12版本之后,可以用新的姿勢來創(chuàng)造swarm集群。具體參閱另外一篇文章

3.4 docker-swarm工作原理

3.4.1 服務(wù)發(fā)現(xiàn) –swarm-discovery

總共有以下幾種方式:

  • Docker Hub (token://<token>)
  • etcd (etcd://<etcd服務(wù)器ip:端口>)
  • consul (consul://<consul服務(wù)器ip:端口>)
  • zookeeper (zk://<zookeeper服務(wù)器ip:端口>)
  • 靜態(tài)文件(file://文件路徑)
  • 節(jié)點(diǎn)發(fā)現(xiàn)(nodes://<工作節(jié)點(diǎn)ip:端口>)
3.4.2 調(diào)度機(jī)制

swarm支持多種調(diào)度策略來選擇節(jié)點(diǎn)。每次在swarm啟動container的時(shí)候,swarm 會根據(jù)選擇的調(diào)度策略來選擇節(jié)點(diǎn)運(yùn)行container。目前支持的有: spread,binpack和 random
在執(zhí)行 swarm manage 命令啟動 swarm 集群的時(shí)候可以通過 --strategy 參數(shù) 來指定,默認(rèn)的是spread。
spread和binpack策略會根據(jù)每臺節(jié)點(diǎn)的可用CPU,內(nèi)存以及正在運(yùn)行的containers 的數(shù)量來給各個(gè)節(jié)點(diǎn)分級,而random策略,顧名思義,他不會做任何的計(jì)算,只是 單純的隨機(jī)選擇一個(gè)節(jié)點(diǎn)來啟動container。這種策略一般只做調(diào)試用。
使用spread策略,swarm會選擇一個(gè)正在運(yùn)行的container的數(shù)量最少的那個(gè)節(jié)點(diǎn)來 運(yùn)行container。這種情況會導(dǎo)致啟動的container會盡可能的分布在不同的機(jī)器上運(yùn)行,這樣的好處就是如果有節(jié)點(diǎn)壞掉的時(shí)候不會損失太多的container。
binpack 則相反,這種情況下,swarm會盡可能的把所有的容器放在一臺節(jié)點(diǎn)上面 運(yùn)行。這種策略會避免容器碎片化,因?yàn)樗麜盐词褂玫臋C(jī)器分配給更大的容器, 帶來的好處就是swarm會使用最少的節(jié)點(diǎn)運(yùn)行最多的容器。

3.4.3 過濾器

swarm 的調(diào)度器(scheduler)在選擇節(jié)點(diǎn)運(yùn)行容器的時(shí)候支持幾種過濾器 (filter):
可以在執(zhí)行 swarm manage 命令的時(shí)候通過 --filter 選項(xiàng)來設(shè)置。

  • Constraint
  • Affinity: 通過使用 Affinity Filter,可以讓一個(gè)容器緊挨著另一個(gè)容器啟動,也就是說讓兩個(gè) 容器在同一個(gè)節(jié)點(diǎn)上面啟動。
  • Port:Port 也會被認(rèn)為是一個(gè)唯一的資源
  • Dependency,
  • Health

具體可以參閱官方文檔。

4 others

Docker鏡像蜂巢加速:

http://support.c.163.com/md.html#!容器服務(wù)/鏡像倉庫/使用技巧/DockerHub 鏡像加速.md

Ubuntu | Debian | Centos

$ sudo echo "DOCKER_OPTS=\"--insecure-registry registry.hz.netease.com -H 0.0.0.0:2375 -H unix:///var/run/docker.sock\"" >> /etc/default/docker
$ service docker restart
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄 Swarm簡介 Swarm架構(gòu) Swarm命令 總結(jié) 1. Swarm簡介 Docker自誕生以來,其容器特...
    garyond閱讀 1,429評論 1 9
  • 前兩篇東西,我們分別介紹了Mesos和Dockers的安裝和使用。在《Mesos實(shí)戰(zhàn)》這篇的結(jié)尾,我說過將會介紹如...
    燕京博士閱讀 1,597評論 0 2
  • 很寂寞不管精神 還是肉體很寂寞不管白天 還是黑夜 秋葉隕落秋也寂寞 我是十月的天使墜落人間 從此芳菲塵土有關(guān)前生所...
    木南京路閱讀 293評論 1 4
  • 從一出生,我們就哇哇大哭,進(jìn)入了這個(gè)世界,隨著時(shí)間的流逝,人的身體慢慢長大,閱歷越來越多,思想也越來越豐富。 思想...
    2f2fc2384970閱讀 347評論 0 0

友情鏈接更多精彩內(nèi)容