概念
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