正文
一、Stack介绍
在前面的文章中,我们介绍Docker Compose,缺点是不能在分布式多机器上使用;我们还介绍了Docker swarm,缺点是不能同时编排多个服务,所以才有了Docker Stack,可以在分布式多机器上同时编排多个服务。
二、使用实例
2.1 案例准备
我们使用前面文章《Docker Compose介绍及使用入门》中的2.3节的案例进行如下Docker Stack的演示。
父工程demo包含两个子工程:
- service1
- controller
@Slf4j @RestController public class HelloRest { @GetMapping("/service1/getHello") public String getHello(){ log.info("service1!!!"); return "hello from service1"; } }
- dockerfile
FROM openjdk:8 EXPOSE 8080 ADD target/service1-0.0.1-SNAPSHOT.jar /demo.jar ENTRYPOINT ["java", "-jar", "demo.jar"]
service2
controller
@Slf4j @RestController public class HelloRest { @GetMapping("/service2/getHello") public String getHello(){ log.info("service2!!!"); return "hello from service2"; } }
- dockerfile
FROM openjdk:8 EXPOSE 8081 ADD target/service2-0.0.1-SNAPSHOT.jar /demo.jar ENTRYPOINT ["java", "-jar", "demo.jar"]
务必确保两个子工程可以正常运行再进行下面的操作。
2.2 打包镜像
分别在service1和service2目录下执行如下命令,分别打包镜像:
docker build -t service1:V1 . docker build -t service2:V1 .
然后执行docker images查看一下镜像是否正常创建成功:
>docker images REPOSITORY TAG IMAGE ID CREATED SIZE service1 V1 a0ccc239fe29 22 minutes ago 544MB service2 V1 2100104dd6eb 22 minutes ago 544MB
2.3 镜像迁移
我自己需要将本地创建好的docker镜像service1和service2迁移到远程的阿里云服务器上,因为docker swarm集群都是在上面搭建的,后面docker stack实验的进行也是在上面进行。
方式一:推送和拉取
# 推送到官方Docker Hub必须要有用户名前缀 docker tag service1:V1 m***g/service1:V1 docker tag service2:V1 m***g/service2:V1 docker push liuy/service1:V1 docker push liuy/service2:V1
然后登录自己的Docker Hub账户检查下镜像是否成功push了。如果OK的话,那么登录阿里云的远程服务器,执行如下的镜像pull操作。
docker pull m***g/service1:V1 docker pull m***g/service2:V1
然后执行docker images查看镜像是否导入成功。
方式二:导出和导入
# 导出镜像到指定的目录 >docker save -o [root@wlidc ~]# service1.zip service1:V1 >docker save -o [root@wlidc ~]# service2.zip service2:V1
然后我们将这两个镜像通过远程SFTP的方式上传到服务器上,存放的目录为/root/docker-images-zip,再执行如下的命令就可以将这两个镜像加载到远程服务器的本地镜像仓库中了。
docker load -i /root/docker-images-zip/service1.zip docker load -i /root/docker-images-zip/service2.zip
然后执行docker images查看镜像是否导入成功。
2.4 编写compose
本地有这两个镜像之后,我们编写compose文件内容如下,文件路径及文件名为/root/docker-compose.yml:
version: "3.9" services: service1: image: "liuy/service1:V1" deploy: replicas: 2 ports: - "8080:8080" service2: image: "liuy/service2:V1" deploy: replicas: 3 ports: - "8081:8081"
2.5 swarm集群搭建
以有service1和service2镜像的服务器为manager,其它机器为worker node节点,具体的搭建过程在先前文章中讲过了。
2.6 stack部署
然后,我们就可以开始使用stack进行集群部署了。
# myapps是stack的自定义名称,使用具体路径的compose配置文件进行部署 docker stack deploy myapps --compose-file=/root/docker-compose.yml Creating network myapps_default Creating service myapps_service1 Creating service myapps_service2
2.7 stack其它操作
创建完成后,我们可以通过如下命令查看stack及服务的信息:
# 查看所有stack的信息 docker stack ls NAME SERVICES ORCHESTRATOR myapps 2 Swarm
# 查看某个stack中的所有任务信息 docker stack ps myapps ID NAME IMAGE NODE DESIRED STATE CURRENT STATE tvvujrf3qcr1 myapps_service1.1 liuy/service1:V1 node1 Running Running 46 seconds ago igjeydmmvzzm myapps_service1.2 liuy/service1:V1 manager Running Running 46 seconds ago 7p5c96eplwl3 myapps_service2.1 liuy/service2:V1 node1 Running Running 34 seconds ago 7shglsajip5d myapps_service2.2 liuy/service2:V1 manager Running Running 39 seconds ago upo0mr7j9tn1 myapps_service2.3 liuy/service2:V1 node2 Running Preparing 41 seconds ago # 查看某个stack中的所有服务信息 docker stack services myapps ID NAME MODE REPLICAS IMAGE PORTS icz3kjn0skb3 myapps_service1 replicated 2/2 liuy/service1:V1 *:8080->8080/tcp myuzlwnrxag4 myapps_service2 replicated 3/3 liuy/service2:V1 *:8081->8081/tcp # 移除stack docker stack rm myapps Removing service myapps_service1 Removing service myapps_service2 Removing network myapps_default