Services 服务 的基本用法
分布式应用的不同部分都分别视为服务。比如一个视频网站,可能包含应用数据库存储数据的服务、将用户上传的视频转码的服务、用于前端展示的服务等。
服务可以视为生产环境中的容器。一个服务只运行一个镜像,但规定了镜像运行的方式——使用的端口,为达到服务所需的运行限度而要运行的副本数量等。拓展一个服务会改变运行该软件的容器示例的数量,为进程中的服务分配更多的计算资源。
通过一个docker-compose.yml
文件即可定义、运行并拓展服务。
YAML(Yet Another Markup Language\ YAML Ain’t a Markup Language)。
- docker-compose.yml文件:
version: "3"
services:
web:
image: josephthatwho/get-started:part2
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
networks:
webnet:
这个文件告诉docker:
从远程库中拉取 josephthatwho/get-started:part2 镜像;
运行5组该镜像的实例(容器),命名为web服务,限制每一组服务最多使用10%的CPU time以及50MB的内存;
如果某容器挂了,立刻重启该容器;
映射web服务的80端口为4000端口;
通过webnet这一负载均衡的网络使5个容器共用80端口(服务内部,容器通过临时端口连接web服务的80端口);
定义webnet使用缺省设置;
- 运行负载均衡的应用
$ docker swarm init
Swarm initialized: current node (jto8z0a1763vv6umjt0i6jpt6) is now a manager.
执行并命名应用,本例命名为getstartedlab
$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
但前即有五个部署在主机上的镜像的容器实例运行在一个服务栈内。可以通过以下命令查看:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
wbu140j527p8 getstartedlab_web replicated 5/5 josephthatwho/get-started:part2 *:4000->80/tcp
运行在服务内的容器称为task(任务)。各个任务都有单独、递增的ID,以下命令列出指定服务内的所有task:
$ docker service ps getstartedlab_web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jjgvubwkbqci getstartedlab_web.1 josephthatwho/get-started:part2 starx-B85-D3V Running Running 11 minutes ago
mcqdrhp84ahj getstartedlab_web.2 josephthatwho/get-started:part2 starx-B85-D3V Running Running 11 minutes ago
kn8d8ax4bax6 getstartedlab_web.3 josephthatwho/get-started:part2 starx-B85-D3V Running Running 11 minutes ago
ks2hindi14mx getstartedlab_web.4 josephthatwho/get-started:part2 starx-B85-D3V Running Running 11 minutes ago
ieqz6s6ap2gn getstartedlab_web.5 josephthatwho/get-started:part2 starx-B85-D3V Running Running 11 minutes ago
也可以用如下命令列出栈内所有task:
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
jjgvubwkbqci getstartedlab_web.1 josephthatwho/get-started:part2 starx-B85-D3V Running Running 42 minutes ago
mcqdrhp84ahj getstartedlab_web.2 josephthatwho/get-started:part2 starx-B85-D3V Running Running 42 minutes ago
kn8d8ax4bax6 getstartedlab_web.3 josephthatwho/get-started:part2 starx-B85-D3V Running Running 42 minutes ago
ks2hindi14mx getstartedlab_web.4 josephthatwho/get-started:part2 starx-B85-D3V Running Running 42 minutes ago
ieqz6s6ap2gn getstartedlab_web.5 josephthatwho/get-started:part2 starx-B85-D3V Running Running 42 minutes ago
- 拓展应用
修改docker-compose.yml
中replicas
的值,保存后重新执行docker stack deploy命令即可在运行中更新应用,不需要终止栈或容器:
docker stack deploy -c docker-compose.yml getstartedlab
- 终止应用与集群
用docker stack rm
命令卸载应用:
docker stack rm getstartedlab
终止集群:
docker swarm leave --force
Swarms 集群 的基本用法
swarm指一组运行docker并加入集群的机器。集群中的机器可以是实体机器也可以是虚拟机,这些机器被称为nodes(节点)。
docker swarm
命令将启用swarm模式并设置当前机器为swarm manager,在其他机器上执行docker swarm join
命令使其作为worker加入swarm。
- 安装docker machine
docker machine用于在虚拟系统内安装docker engine,以及给node从传递指令。 - 新建虚拟机:
$ docker-machine create --driver virtualbox myvm1
Running pre-create checks...
(myvm1) No default Boot2Docker ISO found locally, downloading the latest release...
(myvm1) Latest release for github.com/boot2docker/boot2docker is v18.09.9
(myvm1) Downloading /home/starx/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v18.09.9/boot2docker.iso...
(myvm1) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(myvm1) Copying /home/starx/.docker/machine/cache/boot2docker.iso to /home/starx/.docker/machine/machines/myvm1/boot2docker.iso...
(myvm1) Creating VirtualBox VM...
(myvm1) Creating SSH key...
(myvm1) Starting the VM...
(myvm1) Check network to re-create if needed...
(myvm1) Found a new host-only adapter: "vboxnet0"
(myvm1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env myvm1
$ docker-machine create --driver virtualbox myvm2
...
查看所有的机器以及他们的IP:
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v18.09.9
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.9
- 初始化集群并增加节点
使用docker-machine ssh
命令向虚拟机发送指令,以下命令用docker swarm init
将myvm1设为swarm manager:
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2377"
Swarm initialized: current node (pgogozd45yyf640vrzf3diakr) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2680qpmszswxp25m4ciup660st5adphexfooehpeaqzw5rhjim-cuzj7865dxzpksyk7huiqt6na 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意端口号不能用2376,这是docker daemon的端口号。
使用docker swarm join
将myvm2作为worker加入swarm:
$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-2680qpmszswxp25m4ciup660st5adphexfooehpeaqzw5rhjim-cuzj7865dxzpksyk7huiqt6na 192.168.99.100:2377"
This node joined a swarm as a worker.
在swarm manager上使用docker node ls
命令可以查看swarm中的node:
docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pgogozd45yyf640vrzf3diakr * myvm1 Ready Active Leader 18.09.9
to8mml6jbyvbr6xrazlwegfdm myvm2 Ready Active 18.09.9
在所有node下执行docker swarm leave
即可解散集群,其中swarm manager要执行docker swarm leave --force
。
- 在集群上部署应用
将docker-machine配置给swarm manager使可以不用docker-machine ssh包裹直接对docker manager使用命令行
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/home/starx/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
$ eval $(docker-machine env myvm1)
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v18.09.9
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.9
按提示执行eval $(docker-machine env myvm1)
后,可以看到myvm1的ACTIVE状态转为’*’,表示当前myvm1时激活状态。
在swarm manager上部署应用,再次使用docker stack deploy
命令部署应用,并查看服务栈:
$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
cx2hf7g4eco3 getstartedlab_web.1 josephthatwho/get-started:part2 myvm1 Running Running 12 seconds ago
gprl3l3v5qrl getstartedlab_web.2 josephthatwho/get-started:part2 myvm2 Running Running 17 seconds ago
xsi9yhqxw2fk getstartedlab_web.3 josephthatwho/get-started:part2 myvm2 Running Running 17 seconds ago
udyoz9ykrhbo getstartedlab_web.4 josephthatwho/get-started:part2 myvm1 Running Running 12 seconds ago
ne47ewzuf2kt getstartedlab_web.5 josephthatwho/get-started:part2 myvm2 Running Running 17 seconds ago
可以看到服务以及容器被分配到了myvm1和myvm2上。
使用docker-machine env
可以切换到其他节点。
使用eval $(docker-machine env -u)
命令取消docker-machine的环境变量。
主机关机后,docker机器也会停止运行,可以用docker-machine ls
命令检查,用docker-machine start <machine-name>
命令运行docker机器。