部署集群
在群集模式下运行Docker引擎时,可以使用docker stack deploy将全部应用程序堆栈部署到群集。该deploy命令以Compose文件的形式接受堆栈描述。
该docker stack deploy命令支持任何版本为“3.0”或更高版本的Compose文件。如果您的版本较旧,请参阅升级指南。1.13.0或更高版本的Docker引擎,以群集模式运行。如果您不熟悉swarm模式,则可能需要阅读 Swarm模式的关键概念 和如何使用服务。注意:如果你想在本地开发环境中尝试一些东西,你可以用你的引擎进入群集模式docker swarm init。如果您已经运行了多节点群,请记住必须从管理器节点运行所有 命令docker stack和docker service命令。Docker撰写版本1.10或更高版本。第一步
设置一个Docker注册表
在你的群上启动注册表作为服务:
$ docker service create --name registry --publish published=5000,target=5000 registry:2 # name 根据自己喜欢而定
检查其状态docker service ls:你会发现你注册成功的registry
$ docker service lsID NAME REPLICAS IMAGE COMMANDl7791tpuwkco registry 1/1 registry:2@sha256:1152291c7f93a4ea2ddc95e46d142c31e743b6dd70e194af9e6ebe530f782c17
第二步
创建示例应用程序
本指南中使用的应用程序基于“ Docker Compose入门指南”中的命中计数器应用程序 。它由一个Python应用程序组成,它在Redis实例中维护一个计数器,并在您访问计数器时增加计数器。为项目创建一个目录:
$ mkdir stackdemo$ cd stackdemo
第三步
创建一个app.py项目
from flask import Flaskfrom redis import Redisapp = Flask(__name__)redis = Redis(host='redis', port=6379)@app.route('/')def hello(): count = redis.incr('hits') return 'Hello World! I have been seen {} times.\n'.format(count)if __name__ == "__main__": app.run(host="0.0.0.0", port=8000, debug=True)
创建一个名为requirements.txt并粘贴这两行的文件:
flaskredis
创建一个名为Dockerfile:
FROM python:3.4-alpineADD . /codeWORKDIR /codeRUN pip install -r requirements.txtCMD ["python", "app.py"]
创建一个名为docker-compose.yml
version: '3'services: web: image: 127.0.0.1:5000/stackdemo build: . ports: - "8000:8000" redis: image: redis:alpine
注意:Web应用程序的图像是使用上面定义的Dockerfile构建的。它也被标记为127.0.0.1:5000- 之前创建的注册表的地址。将应用程序分发给群体时,这非常重要。
若是在本地,直接去除build, image换成自己的镜像,详情见下本地示例
第三步
开始与应用程序docker-compose up。这会构建Web应用程序图像,如果您尚未拥有它,请拉取Redis映像,然后创建两个容器。
$ docker-compose up -d# -d 启动后在后台运行
检查应用程序是否正在运行docker-compose ps:
$ docker-compose ps Name Command State Ports-----------------------------------------------------------------------------------stackdemo_redis_1 docker-entrypoint.sh redis ... Up 6379/tcpstackdemo_web_1 python app.py Up 0.0.0.0:8000->8000/tcp
将应用程序关闭:
$ docker-compose down --volumesStopping stackdemo_web_1 ... doneStopping stackdemo_redis_1 ... doneRemoving stackdemo_web_1 ... doneRemoving stackdemo_redis_1 ... doneRemoving network stackdemo_default
第四步
将生成的图像推送到注册表
要在整个群体中分发Web应用程序的图像,需要将它推送到之前设置的注册表。使用Compose$ docker-compose pushPushing web (127.0.0.1:5000/stackdemo:latest)...The push refers to a repository [127.0.0.1:5000/stackdemo]5b5a49501a76: Pushedbe44185ce609: Pushedbd7330a79bcf: Pushedc9fc143a069a: Pushed011b303988d2: Pushedlatest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372
现在你已经部署好了
最后
创建堆栈docker stack deploy:
$ docker stack deploy --compose-file docker-compose.yml stackdemoIgnoring unsupported options: buildCreating network stackdemo_defaultCreating service stackdemo_webCreating service stackdemo_redis
检查它是否正在运行
$ docker stack services stackdemoID NAME MODE REPLICAS IMAGEorvjk2263y1p stackdemo_redis replicated 1/1 redis:3.2-alpine@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86ds1nf0xy8t1un stackdemo_web replicated 1/1 127.0.0.1:5000/stackdemo@sha256:adb070e0805d04ba2f92c724298370b7a4eb19860222120d43e0f6351ddbc26f
一旦它的运行,你应该看到1/1在REPLICAS两种服务。如果您有多节点群,这可能需要一些时间,因为需要拉取图像。
看到这恭喜你,成功部署了docker-swarm
如果此时你也测试成功,想用自己的本地代码测试部署,发现出现了问题,那么别急
首先然后将你的Web做成image, 在docker-compose.yml文件中修改
然后docker-compose.yml
version: '3'services: nginx: image: nginx:alpine ports: - "8880:443" volumes: - ./src:/src - ./config/nginx:/etc/nginx/conf.d - ./config/ssl:/usr/share/nginx/ssl depends_on: - web web: image: 127.0.0.1:5000/stackdemo:20180530 command: "python3 /src/manage.py runserver 0.0.0.0:8802" depends_on: - db volumes: - ./src:/src db: image: postgres:latest
此时的web image 是你本地测试好的image 镜像,一定是在docker-compose 测试成功后
最后
docker-compose push docker stack deploy --compose-file docker-compose.yml stackdemo
稍作等待即可
使用完了然后删除
docker stack rm stackdemoRemoving service stackdemo_webRemoving service stackdemo_redisRemoving network stackdemo_default
$ docker service rm registry
如果只是在本地计算机上进行测试,并希望将Docker Engine从群集模式中移出,请使用docker swarm leave:
$ docker swarm leave --force
Node left the swarm.