docker-swarm

部署集群

在群集模式下运行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 ls
ID            NAME      REPLICAS  IMAGE                                                                               COMMAND
l7791tpuwkco  registry  1/1       registry:2@sha256:1152291c7f93a4ea2ddc95e46d142c31e743b6dd70e194af9e6ebe530f782c17

第二步

创建示例应用程序
本指南中使用的应用程序基于“ Docker Compose入门指南”中的命中计数器应用程序 。它由一个Python应用程序组成,它在Redis实例中维护一个计数器,并在您访问计数器时增加计数器。

为项目创建一个目录:

$ mkdir stackdemo
$ cd stackdemo

第三步  

创建一个app.py项目

from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.
'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

创建一个名为requirements.txt并粘贴这两行的文件:

flask
redis

创建一个名为Dockerfile:

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["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/tcp
stackdemo_web_1     python app.py                    Up      0.0.0.0:8000->8000/tcp

将应用程序关闭:

$ docker-compose down --volumes

Stopping stackdemo_web_1 ... done
Stopping stackdemo_redis_1 ... done
Removing stackdemo_web_1 ... done
Removing stackdemo_redis_1 ... done
Removing network stackdemo_default

第四步

将生成的图像推送到注册表
要在整个群体中分发Web应用程序的图像,需要将它推送到之前设置的注册表。使用Compose

$ docker-compose push

Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372

现在你已经部署好了

最后  

创建堆栈docker stack deploy:

$ docker stack deploy --compose-file docker-compose.yml stackdemo

Ignoring unsupported options: build

Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis

检查它是否正在运行

$ docker stack services stackdemo

ID            NAME             MODE        REPLICAS  IMAGE
orvjk2263y1p  stackdemo_redis  replicated  1/1       redis:3.2-alpine@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d
s1nf0xy8t1un  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 stackdemo

Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default

 

$ docker service rm registry

如果只是在本地计算机上进行测试,并希望将Docker Engine从群集模式中移出,请使用docker swarm leave:

$ docker swarm leave --force

Node left the swarm.

 

  

  

  

  

  

  

  

  

  

  

  

  

原文地址:https://www.cnblogs.com/flash55/p/9113565.html