docker使用第三部分,我们将要对上一节生成的容器进行扩展并启用负载均衡,这里就是用到一个更高级的分布式应用:服务。
什么是服务:
在分布式应用程序中,应用程序的不同部分叫做服务,例如,如一个视频共享站点,它可能包括存储应用程序数据的数据库服务,后台转码服务和上传服务及前端服务等。
服务仅仅只是”生产中的容器”,一个服务只运行一个镜像,但是它管理着镜像运行的方式:哪个端口可以使用,程序可以运行多少副本来达到服务所需要的容量等等。扩展服务将会更改运行容器实例的数量,并控制在服务过程中分配更多的计算机资源。
而docker的运行和扩展服务非常简单,只需要编写一个docker-compose.yml文件,这个文件用来定义docker容器在生产过程中的行为。
docker-compose.yml

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repository:tag
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
networks:
  webnet:

该docker-compose.yml文件告诉docker执行以下操作:

1. 得到要运行的docker镜像

2. 运行5个实例来调用web服务,并限制每个服务最多使用10%的CPU和50M的内存

3. 如果发生故障,则重启容器

4. 将容器端口80映射到主机的80端口

5. 设置web容器通过webnet方式共享80端口来实现负载均衡

6. 使用webnet的默认设置来定义网络

运行加入负载均衡方式的应用程序,在运行之前,我们需要对它进行初始化:

docker swarm init

如果不运行初始化命令,将会报 “this node is not a swarm manager.”的错误。

linux 把环境打包docker linux deploy docker_docker-负载均


然后运行 docker stack deploy -c docker-compose.yml getstartedlab 命令,等待执行结束,然后运行docker stack ps getstartedlab命令,可以查看到5个服务处于运行状态。

linux 把环境打包docker linux deploy docker_分布式应用_02


在这个过程中我遇到一个问题,就是我的docker版本是1.12的,根据docker官方文档说明,需要1.13以上版本,在升级的过程中,怎么都不能找到1.13的版本,无奈只能按照官方提示升级到17.03-ce版本。需要先卸载1.12版本,安装17版本链接https://store.docker.com/editions/community/docker-ce-server-centos

然后在浏览器中输入http://192.168.83.129/来查看得到的结果,可以看到hostname的变化随机出现上图中列出的ID,表示服务运行正常,但是这个HTTP请求需要30s左右来得到响应。这并不代表docker或群组性能的问题,而是因为redis依赖关系的问题,将在后面介绍。

这里用curl方式查看hostname的变化。

linux 把环境打包docker linux deploy docker_分布式应用_03


停止负载均衡服务器的运行,输入命令:

docker stack rm getstartedlab