当前位置: 首页 > 后端技术 > Python

通过DockerSwarm部署一个简单的服务

时间:2023-03-26 12:57:15 Python

本教程将介绍如何使用dockerswarm来编排和分发容器friendlyhello:v4。可以通过浏览器访问此服务以获取当前节点的主机名。最终效果如下:STEP1:创建虚拟机为了模拟集群环境,我们创建了3台虚拟机,一台作为manager节点,另外两台作为worker节点。我自己的mac有8g内存。虽然有点急,但是3个vm还是撑得住的For:$docker-machinecreatemanager$docker-machinecreateworker-1$docker-machinecreateworker-2然后分别进入这三个虚拟机(请打开三个终端操作):$docker-machinesshmanager$docker-machinesshworker-1$docker-machinesshworker-2STEP2:初始化集群首先确认每个vm的IP:$ifconfig比如我目前的三个ip是:经理:192.168.99.112worker-1:192.168。99.113worker-2:192.168.99.114然后在manager中执行:$dockerswarminit--addvertise-addr<你的manager节点的ip>#我自己的命令:$dockerswarminit--addvertise-addr192.168.99.112之后完成,复制输出命令加入swarm集群,分别在两个worker中执行。最终效果如下,表示成功:STEP3:创建friendlyhello:v4服务我们先在当前目录下直接创建两个文件app.pyDockerfile,添加如下代码:app.pyfromflaskimportFlaskfromredisimportRedis,RedisErrorimportosimportsocket#连接Redisredis=Redis(host="redis",db=0,socket_connect_timeout=2,socket_timeout=2)app=Flask(__name__)@app.route("/")defhello():try:visits=redis.incr("counter")exceptRedisError:visits="无法连接到Redis,计数器已禁用"html="主机名:{host_name}
"\"主机名:{hostname}
"\"访问:{visits}"returnhtml.format(host_name=os.getenv("HOSTNAME","UNKNOWN"),hostname=socket.gethostname(),visits=visits)if__name__=="__main__":app.run(host='0.0.0.0',port=5000)DockerfileFROMpython:3.7-slimWORKDIR/appCOPY./appRUNpipinstallflaskredis-ihttps://mirrors.aliyun.com/pypi/simple--trusted-hostmirrors.aliyun.comEXPOSE5000CMD["python","app.py"]然后构建镜像:$dockerbuild-tfriendlyhello:v4。然后通过dockerservicecreate创建一个服务,--replicas3参数表示创建3个副本:$dockerservicecreate--replicas3-p5000:5000--namefriendlyfriendlyhello:v4成功后可以看到这个服务的任务:$dockerservicepsfriendly但是发现只有manager节点的任务启动了,两个worker节点提示没有镜像,所以接下来我们需要分发STEP4:快速分发镜像到所有节点。我们先缩容:$dockerservicescalefriendly=1为了高效分发,我们不使用dockerhub,而是自己部署一个registry服务:$dockerservicecreate--nameregistry--publish5555:5000registry:2检查是否成功:$dockerservicepsregistryOK,然后我们将friendlyhello:v4镜像推送到registry。在此之前,我们先创建一个配置文件并添加配置,否则可能会出现https相关问题:$vi/etc/docker/daemon.jsonwrites:{"insecure-registries":[":5555"]}//我的配置:{"insecure-registries":["192.168.99.112:555"]}然后重启docker:$sudo/etc/init.d/dockerrestart重启后我们就可以重新打标签推送了到注册表:$dockertagfriendlyhello:v4:5555/friendlyhello:v4$dockerpush:5555/friendlyhello:v4#Mycommand:$dockertagfriendlyhello:v4192.168.99.112:5555/friendlyhello:v4$dockerpush192.168.99.112:5555/friendlyhello:v4如果这里出现奇怪的问题,试试等几秒再执行。接下来,分别为worker-1和worker-2添加相同的daemon.json:$vi/etc/docker/daemon.json添加完配置不要忘记重启。重启后就可以拉取我们需要的镜像了:$dockerpull192.168.99.112:5555/friendlyhello:v4$dockertag192.168。99.112:5555/friendlyhello:v4friendlyhello:v4如果又出现奇怪的问题,可以尝试在manager节点上重新push,然后在manager节点上扩容:$dockerservicescalefriendly=3这是任务3个节点都运行成功了:$dockerservicepsfriendly可以通过浏览器访问看到:部署没问题,但是我们还是要让它显示使用的节点名称,需要添加到环境中多变的。让我们现在关闭它服务:$dockerservicermfriendly并重新创建它,并添加新参数:$dockerservicecreate--replicas3-p5000:5000--namefriendly3-eHOSTNAME="{{.Node.Hostname}}"--hostname="{{.Node.Hostname}}-{{.Node.ID}}-{{.Service.Name}}"friendlyhello:v4再次访问:STEP5:用Portainer可视化管理Swarm集群返回Manager节点,现在通过dockerstack部署Portainer:$curl-Lhttps://downloads.portainer.io/portainer-agent-stack.yml-oportainer-agent-stack.yml$dockerstackdeploy--compose-file=portainer-agent-stack.yml完成portainer之后,我们可以通过port:9000访问Portainer:这里有丰富的功能,可以方便我们直观的操作swarm集群