简介

企业的一套完整的服务必定是由若干微服务组成,Docker推荐每个容器里部署一个微服务,难道要手动去执docker run将这些微服务所在的容器一个个启动?肯定是不行的,Docker Compose就是针对上述容器管理难题提供解决方案的,Docker Compose通过yaml配置文件来定义运行多个容器,从而轻松高效地管理众多容器。这种通过配置文件去管理众多容器的方式被称为容器编排,容器编排更高级的解决方案应该是K8S
Docker Compose官网:https://docs.docker.com/compose/
这里摘取官网对Docker Compose的概述:

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features. Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases. Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.

补充:docker-compose是 docker 官方的开源项目,使用 python 编写,需要安装。

  1. version: "3.9" # optional since v1.27.0
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. volumes:
  8. - .:/code
  9. - logvolume01:/var/log
  10. links:
  11. - redis
  12. redis:
  13. image: redis
  14. volumes:
  15. logvolume01: {}

Compose重要概念:

如果官方镜像下载很慢可以尝试 国内镜像

curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s-uname -m` > /usr/local/bin/docker-compose

  1. 默认是将Docker Compose下载到了`/usr/local/bin/docker-compose`目录下。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2608713/1623851010978-b248fb21-ead0-4b17-ac18-b6678fd658e1.png#clientId=u042d8b4e-16be-4&from=paste&height=82&id=u02722c3e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=82&originWidth=651&originalType=binary&ratio=1&size=8351&status=done&style=none&taskId=u89311e10-5ab7-4313-a81d-abdf5b3f400&width=651)
  2. <a name="I8HFR"></a>
  3. ### 修改目录为可执行目录
  4. ```shell
  5. chmod +x /usr/local/bin/docker-compose

测试Docker Compose是否安装成功

  1. docker-compose version

image.png

快速体验

官网参考连接:https://docs.docker.com/compose/gettingstarted/

  1. 创建并进入一个文件夹

    1. mkdir composetest
    2. cd composetest
  2. 创建文件 app.py ```python import time

import redis from flask import Flask

app = Flask(name) cache = redis.Redis(host=’redis’, port=6379)

def get_hit_count(): retries = 5 while True: try: return cache.incr(‘hits’) except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5)

@app.route(‘/‘) def hello(): count = get_hit_count() return ‘Hello World! I have been seen {} times.\n’.format(count)

  1. 3. 导入的依赖包文件 `requirements.txt`
  2. ```shell
  3. flask
  4. redis
  1. 创建 Dockerfile文件

    1. # syntax=docker/dockerfile:1
    2. FROM python:3.7-alpine
    3. RUN sed -i 's/https/http/' /etc/apk/repositories
    4. RUN apk add curl
    5. WORKDIR /code
    6. ENV FLASK_APP=app.py
    7. ENV FLASK_RUN_HOST=0.0.0.0
    8. RUN apk add --no-cache gcc musl-dev linux-headers
    9. COPY requirements.txt requirements.txt
    10. RUN pip install -r requirements.txt
    11. EXPOSE 5000
    12. COPY . .
    13. CMD ["flask", "run"]
  2. 创建 docker-compose.yml文件

    1. version: "3.9"
    2. services:
    3. web:
    4. build: .
    5. ports:
    6. - "5000:5000"
    7. redis:
    8. image: "redis:alpine"

    目前为止目录应该是这样的
    image.png

  3. 使用docker compose 构建和启动应用

    1. docker-compose up

    启动稍微有点慢 耐心等待,出现下面的界面,启动成功
    image.pngimage.png

Docker Compose常用命令

Docker Compose跟Docker一样,也有一套自己的命令,下面介绍一下Docker Compose的常用命令。

docker-compose命令格式

  1. docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

选项如下:
-f,–file FILE     指定Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,–project-name  NAME指定项目名称,默认将使用所在目录名称作为项目名。
-x-network-driver   使用Docker的可拔插网络后端特性(需要Docker 1.9+版本)
-x-network-driver    DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9+版本)
-verbose        出更多调试信息
-v,–version      打印版本并退出

docker-compose up

启动Docker Compose服务:

  1. docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

选项如下:

  • -d:在后台运行服务容器
  • –no-color:不使用颜色来区分不同的服务的控制输出
  • –no-deps:不启动服务所链接的容器
  • –force-recreate:强制重新创建容器,不能与–no-recreate同时使用
  • –no-recreate:如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
  • –no-build:不自动构建缺失的服务镜像
  • –build:在启动容器前构建服务镜像
  • –abort-on-container-exit:停止所有容器,如果任何一个容器被停止,不能与-d同时使用
  • -t, –timeout TIMEOUT:停止容器时候的超时(默认为10秒)
  • –remove-orphans:删除服务中没有在compose文件中定义的容器
  • –scale SERVICE=NUM:设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数

举例:

  1. # 启动所有服务
  2. docker-compose up
  3. # 在后台所有启动服务
  4. docker-compose up -d
  5. # -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
  6. docker-compose -f docker-compose.yml up -d

docker-compose ps

列出项目中所有的的容器:

  1. docker-compose ps [options] [SERVICE...]

举例:

  1. # 列出项目中目前的所有容器
  2. docker-compose ps

docker-compose start

  1. # 启动已经存在的服务容器
  2. docker-compose start [SERVICE...]

docker-compose stop

停止正在运行的容器:

  1. docker-compose stop [options] [SERVICE...]

选项包括:

  • -t, –timeout:TIMEOUT 停止容器时候的超时(默认为10秒)

举例:

  1. # 停止正在运行的名为nginx的容器,可以通过docker-compose start 再次启动
  2. docker-compose stop nginx

docker-compose restart

  1. # 重启项目中的服务
  2. docker-compose restart [options] [SERVICE...]

选项包括:

  • -t, –timeout TIMEOUT:指定重启前停止容器的超时(默认为10秒)

    docker-compose pause

    1. # 暂停一个服务容器
    2. docker-compose pause [SERVICE...]

    docker-compose unpause

    1. # 恢复处于暂停状态中的服务
    2. docker-compose unpause [SERVICE...]

    docker-compose kill

    1. # 通过发送SIGKILL信号来强制停止服务容器
    2. docker-compose kill [options] [SERVICE...]

    举例:

    1. # 支持通过-s参数来指定发送的信号,例如通过如下指令发送SIGINT信号:
    2. docker-compose kill -s SIGINT

    docker-compose -h

    查看Docker Compose的帮助文档

    1. # 查看帮助
    2. docker-compose -h

    docker-compose down

    1. # 停止和删除容器、网络、卷、镜像。
    2. docker-compose down [options]

    选项包括:

  • –rmi type:删除镜像,类型必须是all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像

  • -v, –volumes:删除已经在compose文件中定义的和匿名的附在容器上的数据卷
  • –remove-orphans:删除服务中没有在compose中定义的容器

举例:

  1. # 停用移除所有容器以及网络相关
  2. docker-compose down

docker-compose create

  1. # 为服务创建容器
  2. docker-compose create [options] [SERVICE...]

选项包括:

  • –force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
  • –no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
  • –no-build:不创建镜像,即使缺失
  • –build:创建容器前,生成镜像

    docker-compose run

    1. # 在指定服务上执行一个命令
    2. docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

    举例:

    1. # 在服务名为ubuntu的容器上执行一个ping命令
    2. docker-compose run ubuntu ping www.baidu.com

    docker-compose exec

    1. # 进入某个服务所在的容器
    2. docker-compose exec [options] SERVICE COMMAND [ARGS...]

    选项包括:

  • -d:分离模式,后台运行命令

  • –privileged: 获取特权
  • –user USER:指定运行的用户
  • -T:禁用分配TTY,默认docker-compose exec分配TTY
  • –index=index:当一个服务拥有多个容器时,可通过该参数登陆到到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器

    docker-compose rm

    1. # 删除所有(停止状态的)服务容器,推荐先执行docker-compose stop命令来停止容器
    2. docker-compose rm [options] [SERVICE...]

    选项包括:

  • –f, –force,强制直接删除,包括非停止状态的容器

  • -v,删除容器所挂载的数据卷

    docker-compose build

    1. # 构建(重新构建)项目中的服务容器
    2. docker-compose build [options] [--build-arg key=val...] [SERVICE...]

    选项包括:

  • –compress:通过gzip压缩构建上下环境

  • –force-rm: 删除构建过程中的临时容器
  • –no-cache:构建镜像过程中不使用缓存
  • –pull:始终尝试通过拉取操作来获取更新版本的镜像
  • -m, –memory MEM:为构建的容器设置内存大小
  • –build-arg key=val:为服务设置build-time变量

服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务

docker-compose pull

  1. # 拉取服务依赖的镜像
  2. docker-compose pull [options] [SERVICE...]

选项包括:

  • –ignore-pull-failures:忽略拉取镜像过程中的错误
  • –parallel:多个镜像同时拉取
  • –quiet:拉取镜像过程中不打印进度信息

    docker-compose push

    1. # 推送服务依赖的镜像
    2. docker-compose push [options] [SERVICE...]

    选项包括:

  • –ignore-push-failures:忽略推送镜像过程中的错误

    docker-compose logs

    1. # 查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色
    2. docker-compose logs [options] [SERVICE...]

    举例: ```dockerfile

    查看服务名为nginx的容器日志,关闭颜色区分

    docker compose -no-color nginx

查看nginx服务的实时日志

docker-compose logs -f nginx

  1. <a name="yfnjz"></a>
  2. ### docker-compose scale
  3. 指定服务的容器副本数
  4. ```dockerfile
  5. # 设置指定服务运行的容器个数,通过service=num的参数来设置数量
  6. docker-compose scale web=3 db=2

dokcer-compose config

# 验证并查看compose文件配置
docker-compose config [options]

选项包括:

  • –resolve-image-digests:将镜像标签标记为摘要
  • -q, –quiet:只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
  • –services:打印服务名,一行一个
  • –volumes :打印数据卷名,一行一个

    docker-compose port

    # 显示某个容器端口所映射的公共端口
    docker-compose port [options] SERVICE PRIVATE_PORT
    

    选项包括:

  • –protocol=proto:指定端口协议,TCP(默认值)或者UDP

  • –index=index:如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)

    docker-compose version

    # 打印docker compose的版本信息
    docker-compose version
    

    Docker Compose配置编写规则

    一个Docker-Compose.yaml由三部分组成:

  • version:Docker-Compose的版本,目前最新的是3;

  • services:整个服务由哪些微服务组成,即被编排的容器微服务;
  • 其他:这一部分主要是整个Docker Compose的环境,最常见的有volumes和networks。

举一个稍微复杂的Docker-Compose.yaml:

version: '3'
services:
  mongodb3.2:
    container_name: mongodb3.2
    image: xxxxxx/library/zujuan_mongodb3.2:v1
    ports:
      - "16016:27017"
    volumes:
      - "/Docker-Ser/Mongodb/data/db:/data/db:rw"
      - "/Docker-Ser/Mongodb/data/backup:/data/backup:rw"
    networks:
      mall-network:
        aliases:
          - mongodb3.2
  redis:
    container_name: redis
    image: xxx:5588/library/zujuan_redis:v1
    ports:
      - "7480:6379"
    networks:
      mall-network:
        aliases:
          - redis
    depends_on:
      - mongodb3.2

  math_engine:
    container_name: math_engine
    image: xxx:5588/library/engine:v1
    ports:
      - "7101"
    volumes:
      - "/Docker-Ser/math_engine/www:/home/www:rw"
      - "/Docker-Ser/math_engine/supervisor.conf.d:/etc/supervisor.conf.d:rw"
      - "/Docker-Ser/math_engine/logs/math_engine.log:/tmp/math_engine.log:rw"
    networks:
      mall-network:
        aliases:
          - math_engine
    depends_on:
      - mongodb3.2

  en_engine:
    container_name: en_engine
    image: xxx:5588/library/engine:v1
    volumes:
      - "/Docker-Ser/en_engine/www:/home/www:rw"
      - "/Docker-Ser/en_engine/supervisor.conf.d:/etc/supervisor.conf.d:rw"
      - "/Docker-Ser/en_engine/logs/en_engine.log:/tmp/en_engine.log:rw"
    ports:
      - "7001"
    networks:
      mall-network:
        aliases:
          - en_engine
    depends_on:
      - mongodb3.2

  zujuan_qt:
    container_name: zujuan_qt
    image: xxx:5588/library/zujuan_qiantai:v1
    ports:
      - "80:80"
    volumes:
      - "/Docker-Ser/Pyweb/www:/home/www:rw"
      - "/Docker-Ser/Pyweb/supervisor.conf.d:/etc/supervisor.conf.d:rw"
      - "/Docker-Ser/Pyweb/log:/mnt/log:rw"
      - "/Docker-Ser/Nginx/conf.d:/etc/nginx/conf.d:rw"
    networks:
      mall-network:
        aliases:
          - zujuan_qt
    depends_on:
      - mongodb3.2
      - redis
      - math_engine
      - en_engine

networks:
  mall-network:
    driver: bridge

下面详细介绍一下Docker-Compose.yaml的书写规则。

image

services:
  web:
    image: hello-world

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会从仓库中尝试拉取这个镜像。
例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

build

服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器。

build: /path/to/build/dir

也可以是相对路径,只要上下文确定就可以读取到 Dockerfile。

build: ./dir

设定上下文根目录,然后以该目录为准指定 Dockerfile。

build:
  context: ../
  dockerfile: path/of/Dockerfile

注意 build 都是一个目录,如果你要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 dockerfile 标签指定,如上面的例子。如果你同时指定了 image 和 build 两个标签,那么 Compose 会构建镜像并且把镜像命名为 image 后面的那个名字。

build: ./dir
image: webapp:tag

既然可以在 docker-compose.yml 中定义构建任务,那么一定少不了 arg 这个标签,就像 Dockerfile 中的 ARG 指令,它可以在构建过程中指定环境变量,但是在构建成功后取消,在 docker-compose.yml 文件中也支持这样的写法:

build:
  context: .
  args:
    buildno: 1
    password: secret

下面这种写法也是支持的,一般来说下面的写法更适合阅读。

build:
  context: .
  args:
    - buildno=1
    - password=secret

与 ENV 不同的是,ARG 是允许空值的。例如:

args:
  - buildno
  - password

command

使用 command 可以覆盖容器启动后默认执行的命令。

command: bundle exec thin -p 3000

也可以写成类似 Dockerfile 中的格式:

command: [bundle, exec, thin, -p, 3000]

container_name

前面说过 Compose 的容器名称格式是:<项目名称><服务名称><序号>
虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:

container_name: app

这样容器的名字就指定为 app 了。

depends_on

在使用 Compose 时,最大的好处就是少打启动命令,但是一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败。
例如在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。
例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意的是,默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系。

dns

和 —dns 参数一样用途,格式如下:

dns: 8.8.8.8

也可以是一个列表:

dns:
  - 8.8.8.8
  - 9.9.9.9

此外 dns_search 的配置也类似:

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

tmpfs

挂载临时目录到容器内部,与 run 的参数一样效果:

tmpfs: /run
tmpfs:
  - /run
  - /tmp

entrypoint

在 Dockerfile 中有一个指令叫做 ENTRYPOINT 指令,用于指定接入点,第四章有对比过与 CMD 的区别。
在 docker-compose.yml 中可以定义接入点,覆盖 Dockerfile 中的定义:

entrypoint: /code/entrypoint.sh

格式和 Docker 类似,不过还可以写成这样:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

推荐使用第一种方式。

env_file

还记得前面提到的 .env 文件吧,这个文件可以设置 Compose 的变量。而在 docker-compose.yml 中可以定义一个专门存放变量的文件。
如果通过 docker-compose -f FILE 指定了配置文件,则 env_file 中路径会使用配置文件路径。
如果有变量名称与 environment 指令冲突,则以后者为准。格式如下:

env_file: .env

或者根据 docker-compose.yml 设置多个:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

注意的是这里所说的环境变量是对宿主机的 Compose 而言的,如果在配置文件中有 build 操作,这些变量并不会进入构建过程中,如果要在构建中使用变量还是首选前面刚讲的 arg 标签。

environment

与上面的 env_file 标签完全不同,反而和 arg 有几分类似,这个标签的作用是设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置,这是与 arg 最大的不同。
一般 arg 标签的变量仅用在构建过程中。而 environment 和 Dockerfile 中的 ENV 指令一样会把变量一直保存在镜像、容器中,类似 docker run -e 的效果。

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET

external_links

在使用Docker过程中,我们会有许多单独使用docker run启动的容器,为了使Compose能够连接这些不在docker-compose.yml中定义的容器,我们需要一个特殊的标签,就是external_links,它可以让Compose项目里面的容器连接到那些项目配置外部的容器(前提是外部容器中必须至少有一个容器是连接到与项目内的服务的同一个网络里面)。
格式如下:

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

extra_hosts

添加主机名的标签,就是往/etc/hosts文件中添加一些记录,与Docker client的—add-host类似:

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

启动之后查看容器内部etc/hosts:

162.242.195.82  somehost
50.31.209.229   otherhost

links

还记得上面的depends_on吧,那个标签解决的是启动顺序问题,这个标签解决的是容器连接问题,与Docker client的—link一样效果,会连接到其它服务中的容器。
格式如下:

links:
 - db
 - db:database
 - redis

使用的别名将会自动在服务容器中的/etc/hosts里创建。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis

相应的环境变量也将被创建。

logging

这个标签用于配置日志服务。格式如下:

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

默认的driver是json-file。只有json-file和journald可以通过docker-compose logs显示日志,其他方式有其他日志查看方式,但目前Compose不支持。对于可选值可以使用options指定。
有关更多这方面的信息可以阅读官方文档:
https://docs.docker.com/engine/admin/logging/overview/

ports

映射端口的标签。
使用HOST:CONTAINER格式或者只是指定容器的端口,宿主机会随机映射端口。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

对于8080:18088, 8080是宿主机端口,18088是容器端口

注意:当使用HOST:CONTAINER格式来映射端口时,如果你使用的容器端口小于60你可能会得到错误的结果,因为YAML将会解析xx:yy这种数字格式为60进制。所以建议采用字符串格式。

volumes

挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有效保护宿主机的文件系统。
Compose的数据卷指定路径可以是相对路径,使用 . 或者 .. 来指定相对目录。
数据卷的格式可以是下面多种形式:

volumes:
  // 只是指定一个路径,Docker 会自动再创建一个数据卷(这个路径是容器内部的)。
  - /var/lib/mysql
  // 使用绝对路径挂载数据卷
  - /opt/data:/var/lib/mysql
  // 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
  - ./cache:/tmp/cache
  // 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
  // 已经存在的命名的数据卷。
  - datavolume:/var/lib/mysql

对于/opt/data:/var/lib/mysql,前一个路径:/opt/data是宿主机目录,后一个路径:/var/lib/mysql是容器目录。
如果你不使用宿主机的路径,你可以指定一个volume_driver。

volume_driver: mydriver

volumes_from

从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的。

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

network_mode

网络模式,与Docker client的—net参数类似,只是相对多了一个service:[service name] 的格式。
例如:

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

加入指定网络,格式如下:

services:
  some-service:
    networks:
     - some-network
     - other-network

关于这个标签还有一个特别的子标签aliases,这是一个用来设置服务别名的标签,例如:

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

相同的服务可以在不同的网络有不同的别名。