docker-compose详解(五)

本文详细解释了DockerCompose如何通过YAML配置文件管理多容器应用程序,包括网络模式设置(如桥接、主机模式等)、服务间的网络连接、静态IP地址分配、端口映射、共享PID命名空间和重启策略。特别提到了在Swarm模式下的一些注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

b54876510060ff2907aaf916a0f831f7.png

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许用户使用YAML格式的配置文件(通常是docker-compose.yml)来配置应用程序所需的所有服务,并可以通过一个命令来启动或关闭这些容器。

服务配置(接上一篇)

26. network_mode

设置网络模式。使用和Docker客户端中的--network的参数一样的值,格式为service:[service name]。可以指定使用服务或者容器的网络。示例如下:

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

注意事项:

在swarm mode下部署堆栈时,该选项将被忽略。

network_mode: "host"不能与links配置项混用。

27. networks

指定所加入的网络。需要在顶层networks配置项中引入具体的网络信息。例如:

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

(1) aliases

指定服务在此网络上的别名(备用主机名)。同一网络上的其他容器可以使用服务名称或此别名来连接到服务的任何一个容器。由于aliases属于网络范围,因此同一服务在不同的网络上可以具有不同的别名。例如:

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


在以下示例中,提供了web、worker和db三个服务,以及new和legacy两个网络:

version: "3.8"
services:
  web:
    image: "nginx:alpine"
    networks:
      - new
  worker:
    image: "my-worker-image:latest"
    networks:
      - legacy
  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql
networks:
  new:
  legacy:

在该例中,可以通过主机名db或database在new网络上访问db服务,通过db或mysql在legacy网络上访问db服务。

注意:网络范围内的别名可以被多个容器甚至多个服务共享。如果是这样,则不能保证名称恰好解析到哪一个容器。

(2) ipv4_address、ipv6_address

加入网络后,为此服务的容器指定一个静态IP地址。在顶层networks配置项中的相应网络配置必须有子网配置覆盖每个静态地址的ipam配置。例如:

version: "3.8"
services:
  app:
    image: nginx:alpine
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10
networks:
  app_net:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

注意:如果需要IPv6寻址,则必须使用V2.x版本的Compose配置文件并设置顶层networks配置项下的enable_ipv6选项。在当前swarm mode下IPv6选项不会起作用。

28. pid

跟主机系统共享进程命名空间。

pid: "host"

将PID模式设置为主机PID模式,打开该选项的容器之间,以及容器和宿主机操作系统之间可以通过进程ID来相互访问和操作。

29. ports

暴露端口。注意端口映射与network_mode: host不兼容。支持short和long两种格式的语法。short语法可以使用HOST:CONTAINER的格式指定端口映射,也可以指定容器端口,宿主机会随机选择临时端口进行映射。例如:

ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"
  - "6060:6060/udp"
  - "12400-12500:1240"

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

long语法支持配置short语法中不支持的附加字段。这些附加字段如下:

target:指定容器内的端口。

published:指定公开的端口。

protocol:指定端口协议(tcp或udp)。

mode:使用host在每个节点公开一个主机端口,或使用ingress对swarm mode端口进行负载均衡。

示例如下:

ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host

long语法在3.2版的配置文件格式中加入

30. restart

指定重启策略。例如想要在容器退出时总是会重启容器,指定以下重启策略:

restart: always

一共支持以下重启策略:

no:在任何情况下都不会重启容器。默认的重启策略。

always:在容器退出时总是重启容器。

on-failure:在容器以非0状态码退出时才会重启。

unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。

使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,restart配置项将被忽略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值