這篇文章講了Docker-machine新啼,Docker-compose拉宗,Docker-swarm的一些基礎(chǔ)知識(shí)如孝。
這里是基于docker1.12之前的版本
1 Docker Machine
1.1 簡(jiǎn)介
Docker Machine 是 Docker 官方編排(Orchestration)項(xiàng)目之一操禀,負(fù)責(zé)在多種平臺(tái)
上快速安裝 Docker 環(huán)境君躺。
現(xiàn)在支持很多驅(qū)動(dòng)寇蚊,通過(guò)-d參數(shù)即可笔时,比如:
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)所說(shuō):
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)問(wè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è)大的問(wèn)題就是允耿,github使用的amazon的云被墻了借笙,所以都不行。
2 Docker-compose
2.1 簡(jiǎn)介
Docker Compose 是 Docker 官方編排(Orchestration)項(xiàng)目之一较锡,負(fù)責(zé)快速在集
群中部署分布式應(yīng)用业稼。
- 定義和運(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)如下:
haproxy目錄下:haproxy.cfg是配置文件。
web目錄下:python web啟動(dòng)的dockerfile及index.py和html這兩個(gè)后端和前端文件蚂蕴。
dockerfile如下所示:
FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
最后使用docker-compose up 即可啟動(dòng)低散。
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庫(kù)與遠(yuǎn)程Docker Daemon/Swarm API -Server通信
- 按依賴(lài)性排序/調(diào)度
3 Docker Swarm
3.1 簡(jiǎn)介
Docker Swarm 是 Docker 官方編排(Orchestration)項(xiàng)目之一,負(fù)責(zé)對(duì) Docker 集
群進(jìn)行管理骡楼。
- 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 接口作為其前端訪問(wèn)入口引镊,換言之,各種形式的 Docker 工具比如 Dokku篮条,Compose弟头,Krane,Deis涉茧,docker-py亮瓷,Docker 本身等都 可以很容易的與 Swarm 進(jìn)行集成。
工作原理如下:
下面我使用2個(gè)方向來(lái)介紹Docker Swarm的使用:
- 使用Docker-machine來(lái)創(chuàng)建swarm集群
- 使用原生Swarm命令來(lái)創(chuàng)建Swarm集群
3.2 使用Docker-machine來(lái)創(chuàng)建swarm集群
Docker 集群管理需要使用服務(wù)發(fā)現(xiàn)(Discovery service backend)功能降瞳,Swarm支持 以下的幾種方式:DockerHub 提供的服務(wù)發(fā)現(xiàn)功能嘱支,本地的文件,etcd挣饥,consul除师, zookeeper 和 IP 列表,本節(jié)會(huì)詳細(xì)講解前三種方式扔枫,其他的用法都是大同小異 的汛聚。
3.2.1 使用Dockerhub提供的服務(wù)發(fā)現(xiàn)功能
Step1: 創(chuàng)建Token
swarm create - 從Docker Hub發(fā)現(xiàn)服務(wù)申請(qǐng)一個(gè)唯一標(biāo)識(shí)此集群的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 – 啟動(dòng)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
通過(guò)docker-machine env swarm-master倚舀,可以直接操控swarm-master,進(jìn)一步來(lái)控制整個(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的加速器糠排,國(guó)外太慢舵稠。
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
可以看出來(lái),使用-H的話(huà),可以?xún)蓚€(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次哺徊,啟動(dòng)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的命令列一下:
啟動(dòng)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啟動(dòng)了一個(gè)docker環(huán)境 localtest巢钓,ssh進(jìn)去后,創(chuàng)建一個(gè)etcd的鏡像谣膳,并暴露4001端口竿报。
啟動(dòng)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 使用原生命令啟動(dòng)swarm集群
根據(jù)官網(wǎng)的介紹。
In Docker 1.12 and higher, Swarm mode is integrated with Docker Engine.
所以阵幸,對(duì)于Docker1.12版本之前可以參閱此文檔中使用docker-machine的辦法來(lái)創(chuàng)建swarm集群花履。
對(duì)于Docker1.12版本之后,可以用新的姿勢(shì)來(lái)創(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)度策略來(lái)選擇節(jié)點(diǎn)诡壁。每次在swarm啟動(dòng)container的時(shí)候,swarm 會(huì)根據(jù)選擇的調(diào)度策略來(lái)選擇節(jié)點(diǎn)運(yùn)行container荠割。目前支持的有: spread妹卿,binpack和 random。
在執(zhí)行 swarm manage 命令啟動(dòng) swarm 集群的時(shí)候可以通過(guò) --strategy 參數(shù) 來(lái)指定蔑鹦,默認(rèn)的是spread夺克。
spread和binpack策略會(huì)根據(jù)每臺(tái)節(jié)點(diǎn)的可用CPU,內(nèi)存以及正在運(yùn)行的containers 的數(shù)量來(lái)給各個(gè)節(jié)點(diǎn)分級(jí)嚎朽,而random策略铺纽,顧名思義,他不會(huì)做任何的計(jì)算哟忍,只是 單純的隨機(jī)選擇一個(gè)節(jié)點(diǎn)來(lái)啟動(dòng)container狡门。這種策略一般只做調(diào)試用。
使用spread策略锅很,swarm會(huì)選擇一個(gè)正在運(yùn)行的container的數(shù)量最少的那個(gè)節(jié)點(diǎn)來(lái) 運(yùn)行container其馏。這種情況會(huì)導(dǎo)致啟動(dòng)的container會(huì)盡可能的分布在不同的機(jī)器上運(yùn)行,這樣的好處就是如果有節(jié)點(diǎn)壞掉的時(shí)候不會(huì)損失太多的container爆安。
binpack 則相反尝偎,這種情況下,swarm會(huì)盡可能的把所有的容器放在一臺(tái)節(jié)點(diǎn)上面 運(yùn)行。這種策略會(huì)避免容器碎片化致扯,因?yàn)樗麜?huì)把未使用的機(jī)器分配給更大的容器肤寝, 帶來(lái)的好處就是swarm會(huì)使用最少的節(jié)點(diǎn)運(yùn)行最多的容器。
3.4.3 過(guò)濾器
swarm 的調(diào)度器(scheduler)在選擇節(jié)點(diǎn)運(yùn)行容器的時(shí)候支持幾種過(guò)濾器 (filter):
可以在執(zhí)行 swarm manage 命令的時(shí)候通過(guò) --filter 選項(xiàng)來(lái)設(shè)置抖僵。
- Constraint
- Affinity: 通過(guò)使用 Affinity Filter鲤看,可以讓一個(gè)容器緊挨著另一個(gè)容器啟動(dòng),也就是說(shuō)讓兩個(gè) 容器在同一個(gè)節(jié)點(diǎn)上面啟動(dòng)耍群。
- Port:Port 也會(huì)被認(rèn)為是一個(gè)唯一的資源
- Dependency,
- Health
具體可以參閱官方文檔义桂。
4 others
Docker鏡像蜂巢加速:
http://support.c.163.com/md.html#!容器服務(wù)/鏡像倉(cāng)庫(kù)/使用技巧/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