Docker 使用 Docker Swarm 部署测试集群

xinxi · 2022年09月06日 · 4197 次阅读

前言

上家公司的发展迁移后端服务部署是依托于 Docker Swarm 部署的线上服务集群。随着业务的不断发展,后来改成了 Kubernetes 来部署环境,Docker Swarm 见证了着我们当时业务从 0 到 1 的发展,虽然现在国内使用 Docker Swarm 已经过时了,还是想总结下如何使用 Docker Swarm 搭建一个测试集群,可能未来会对你有帮助呢?

Docker Swarm 是什么?

Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用 GO 语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群 Docker 宿主机变成一个单一的虚拟主机,Swarm 使用标准的 Docker API 接口作为其前端的访问入口,换言之,各种形式的 DockerClient(compose,docker-py 等) 均可以直接与 Swarm 通信,甚至 Docker 本身都可以很容易的与 Swarm 集成,这大大方便了用户将原本基于单节点的系统移植到 Swarm 上,同时 Swarm 内置了对 Docker 网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

Docker Swarm 和 Kubernetes 的区别

  • Docker Swarm 的优点和缺点都是使用标准的 Docker 接口,因为使用简单,容易集成到现有系统,所以在支持复杂的调度系统时候就会比较困难了,特别是在定制的接口中实现的调度。这也许就是成也在 Docker,败也在 Docker 的原因所在。
  • Kubernetes 作为一个容器集群管理系统,用于管理云平台中多个主机上的容器应用,Kubernetes 的目标是让部署容器化的应用变得简单且高效,所以 Kubernetes 提供了应用部署,规划,更新,维护的一整套完整的机制。

Docker Swarm 原理?

swarm 集群由管理节点(manager)和工作节点(work node)构成。

  • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
  • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

docker Swarm 搭建演示

我们来演示下 docker Swarm 搭建测试环境的完成过程,涉及: 构建镜像、创建 manager、node 等过程。

构建镜像

服务代码

使用 python 的 flask 框架编写一个简单的后端服务应用

运行 app.py 文件代码:

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

创建 Dockerfile

使用如下 dockerfile 构建一个 python flask 项目成镜像。

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

运行应用

构建完成镜像后,本地使用如下命令运行调试。

docker run -p 4000:80 friendlyhello

通过浏览器访问如下地址是正访问,说明启动成功。

curl http://localhost:4000

推送镜像

如果是企业级使用或者镜像共享的,可以把镜像推送到远程镜像仓库中托管。

注册 docker 账号

首先到https://hub.docker.com/注册一个账号,保存下用户名密码。

控制台登陆 dockerhub 账户

输入刚注册的用户名密码

docker login

查看镜像

docker image ls

重命名镜像

选择需要上传的镜像,重命名为指定的格式。

xinxixxxx:为我自己的 dockerhub 账户名称,替换成你刚注册的名称
friendlyhello:为自己为镜像取的名字
v1:为任意设置的版本号

docker tag friendlyhello xinxixxxx/friendlyhello:v1

上传镜像

上传镜像到仓库,大概会花费几分钟时间。

docker push xinxixxxx/friendlyhello:v1

创建 docker-compose.yml 文件

docker-compose.yml 文件是一个 YAML 文件,用于定义 Docker 容器在生产中的行为方式。

将下面内容保存为 docker-compose.yml, 确保已将第一部分中创建的镜像推送到远程仓库,并将 username/repo:tag 替换为你自己的镜像信息。

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

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

从注册中心中提取我们在步骤 1 中上传的镜像。

从此镜像运行 5 个实例作为一个服务,服务名为 web,限制每个实例使用最多 10%的 CPU(所有核心)和 50MB 的 RAM。

如果如果容器出错,立即重启。

将主机上的端口 4000 映射到 Web 的端口 80。

指示 Web 容器通过称为 webnet 的负载平衡网络共享端口 80。(在内部,容器发布在 web 的 80 端口)

默认使用 Webnet 网络(负载平衡网络)。

搭建 Docker Swarm 集群

前置准备

我们需要 4 个节点(1 个 master + 3 个 slave),由于没有真实地 4 台物理机,所以下文中是靠 docker-machine、virtualbox 以及 boot2docker 来虚拟出 4 个独立 IP 地址的带 docker 环境的节点,大家注意。

安装虚拟机

在本地安装虚拟机的方式运行。

https://www.virtualbox.org/

Boot2Docker 是一个极简主义的 Linux 发行版,其唯一目的是运行 Docker 容器。

brew install boot2docker

或者

https://github.com/boot2docker/boot2docker/releases/tag/v17.07.0-ce

Docker Swarm 集群实验

首先要将之前下载的 boot2docker.iso 放到/Users/你的用户名/.docker/machine/cache/目录下,然后执行如下命令:

docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso master
docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave1
docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave2
docker-machine create --virtualbox-boot2docker-url ~/.docker/machine/cache/boot2docker.iso slave3

docker-machine 命令创建虚拟机的过程:

创建完 4 个节点以后,可以使用 docker-machine ls 命令查看一下各个节点的情况,可以看到自动为其分配了独 IP 地址。

初始化 swarm

docker swarm init

运行

现在让我们来运行吧,您需要为您的应用程序命名,在这里它被设置为 getstartedlab。

docker stack deploy -c docker-compose.yml getstartedlab

docker service ls

查看所有容器 id

docker container ls -q

扩展容器

docker stack deploy -c docker-compose.yml getstartedlab

访问集群

Docker Swarm 集群图形化显示工具

Visualizer 非常直观地显示了 Swarm 集群中,各个 Docker 主机上的容器负载情况。

部署

docker run -it -d -p 8086:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer

集群展示

最终部署完成后的展示效果如下:

结语

虽然 Docker Swarm 已经沉没在历史的舞台中了,但是它的架构设计和模式还是值得我们学习的,为了后续学习 Kubernetes 也会有一个帮助指导作用。

如果大家觉得有帮助,可以关注下方微信公众号,里边有更多的技术文档和面试技巧~

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册