概念
docker-compose 只能单机部署项目
docker swarm 集群部署项目但是不能同时编排多个服务
docker stack 集群部署项目且可同时编排多个服务
root@chris-virtualmachine-2:~# docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
实战准备
以.net 6 web api项目为例,源码地址
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Docker.Stack.Demo/Docker.Stack.Demo.csproj", "Docker.Stack.Demo/"]
RUN dotnet restore "Docker.Stack.Demo/Docker.Stack.Demo.csproj"
COPY . .
WORKDIR "/src/Docker.Stack.Demo"
RUN dotnet build "Docker.Stack.Demo.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Docker.Stack.Demo.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Docker.Stack.Demo.dll"]
docker-compose.yml
version: '3.8'
services:
web:
image: stack-demo:1.0
ports:
- 8080:80
networks:
- my-network
deploy:
mode: replicated
replicas: 10 # 部署10个service
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s
order: stop-first
networks:
my-network:
driver: overlay
实战
swarm 进群搭建
# 此节点是leader节点
docker swarm init --advertise-addr 192.168.32.129
# 此节点是worker节点
docker swarm join --token SWMTKN-1-2k33oy7alpiq3v22m3m0gc3klhwma75yrsqn18teo0frzcltcd-apx903yjwediqshvb8nkz2t8i 192.168.32.129:2377
生成镜像
由于本实例docker-compose.yml中用到的镜像必须依赖于Dockerfile去构建,而docker stack 不会自动帮我们去构建,多以需要主动去构建镜像
# 根据Dockerfile构建镜像
docker build -t stack-demo:1.0 .
stack部署
root@chris-virtualmachine-2:~/stack-demo# docker stack --help
Usage: docker stack [OPTIONS] COMMAND
Manage Docker stacks
Options:
--orchestrator string Orchestrator to use (swarm|kubernetes|all)
Commands:
deploy Deploy a new stack or update an existing stack
ls List stacks
ps List the tasks in the stack
rm Remove one or more stacks
services List the services in the stack
# 开始部署
docker stack deploy stackdemo --compose-file=docker-compose.yml
# 查看stack服务列表
root@chris-virtualmachine-2:~/stack-demo# docker stack ls
NAME SERVICES ORCHESTRATOR
stackdemo 1 Swarm
# 查看stackdemo服务部署详情--会分不到集群中的每一个节点上
root@chris-virtualmachine-2:~/stack-demo# docker stack ps stackdemo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
f0aa6lsd1n52 stackdemo_web.1 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
primxwvd26rg stackdemo_web.2 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
q7qxdwalbvi4 stackdemo_web.3 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
ymcpg367u3n7 stackdemo_web.4 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
pgro39ceqfni stackdemo_web.5 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
n0d2yklfx520 stackdemo_web.6 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
m9753wn9yjgz stackdemo_web.7 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
9pykf97jcz9z stackdemo_web.8 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
cb3jvkls46na stackdemo_web.9 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago
e95ouv20wrr8 stackdemo_web.10 stack-demo:1.0 chris-virtualmachine-2 Running Preparing 23 seconds ago