Skip to content

03. 入门 服务

官方原文

在分布式应用程序中,应用程序的不同部分称为“服务”service

服务实际上是生产环境中的容器。

服务可以扩展应用程序app并启用负载平衡

1. 前提

linux需要安装docker-compose

curl -L https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

2. 编写文件

文档:docker-compose

定义服务需要编写docker-compose.yml文件,此文件规定如何运行容器。可在任意位置编写,例子:

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:

3. 运行app

发布一个stack

docker swarm init

# getstartedlab 是你的app名字,也是stack名字,随意取名
docker stack deploy -c docker-compose.yml getstartedlab

服务的名字以"stack_name" + "_" + "compose文件中服务名"为名。

# 列出所有的服务
docker service ls
# 列出指定的服务
docker stack services getstartedlab

在服务中运行的一个容器叫做一个任务task,数量是在yml文件中的replicas字段定义的。对于每个请求,以循环方式选择这些任务中的一个来响应。

# 查看一个服务中的任务
docker service ps getstartedlab_web

# 查看一个stack中的任务
docker stack ps getstartedlab

# 查看所有的任务,列出的是container_id,与task_id不同
docker container ls

4. 扩展app

直接修改docker-compose.yml文件,然后重新运行docker stack deploy app_nameapp_name要相同)命令即可实现扩展。docker执行替换式更新,无需关闭任何stack或container。

bug:改变映射端口之后不会负载均衡了,一直都是一个任务在提供服务。

5. 关闭app和swarm

docker stack rm getstartedlab

docker swarm leave --force

6. 常用命令

docker stack ls                                            # List stacks or apps
docker stack deploy -c <composefile> <appname>  # Run the specified Compose file
docker service ls                 # List running services associated with an app
docker service ps <service>                  # List tasks associated with an app
docker inspect <task_id or container_id>                   # Inspect(查阅) task or container
docker container ls -q                                      # List container IDs
docker stack rm <appname>                             # Tear down an application
docker swarm leave --force      # Take down a single node swarm from the manager