You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose部署Traefik出现多卷问题及持久化验证

问题

我需要搭建一个包含后端、前端和Traefik的Docker Compose环境,要求Traefik用持久化卷存储Let's Encrypt证书,避免每次启动都请求新证书触发限流。但部署后发现创建了5个Docker卷,远超预期的1个,同时不确定Traefik是否正确使用了持久化卷。

我的项目目录myproject下的compose.yaml配置如下:

# compose.yaml
services:
  # frontend & backend services removed
  traefik:
    image: "traefik:v2.10"
    container_name: "traefik"
    restart: always
    command:
      - "--api.insecure=false"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      # Configure letsencrypt
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.letsencrypt.acme.email=<my email address>"
      - "--certificatesresolvers.letsencrypt.acme.storage=/certificates/acme.json"
    ports:
      - "80:80"
      - "443:443"
    networks:
      - traefik_webgateway
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "traefik-public-certificates-volume:/certificates" # using volume for persistent storage

# Explicitly define the network
networks:
  traefik_webgateway:
    external: true

# Explicitly define docker volume which stores certificates
volumes:
  traefik-public-certificates-volume:  # using volume for persistent storage

执行的部署步骤:

docker system prune
docker network create traefik_webgateway
docker compose up

执行docker volume ls后得到的卷列表:

user@ubuntu:~/myproject# docker volume ls
DRIVER    VOLUME NAME
local     XXXXXXXXXXf5842b884e84fc165d275ca139f3a296331d154c1cffec2a753acd
local     myproject_traefik-public-certificates
local     myproject_traefik_traefik-public-certificates-volume
local     traefik-public-certificates
local     traefik-public-certificates-volume

为什么会出现5个Docker卷?

这些卷的出现主要是配置变更残留和Docker Compose的默认命名规则导致:

  • traefik-public-certificates-volume:你在compose.yaml中显式定义的卷名,但由于未设置external: true,Docker Compose并不会直接使用这个名称,该卷大概率是之前手动创建或旧配置运行后留下的残留。
  • myproject_traefik-public-certificates-volume:Docker Compose的自动命名结果,规则为项目目录名_卷定义名,这是当前配置实际在使用的卷(因为你的compose未将卷标记为外部卷)。
  • traefik-public-certificates和myproject_traefik-public-certificates:应该是你之前修改compose配置时使用过的旧卷名,运行后未清理的残留。
  • 随机ID命名的卷:可能是某次运行中Traefik容器意外生成的匿名卷,或是旧配置中未指定明确卷名的绑定操作导致Compose自动创建。

如何确保Traefik正在使用持久化卷?

1. 修正Compose配置,明确卷的使用方式

如果你希望使用不带项目前缀的卷名,需要将卷标记为外部卷,修改compose.yaml的volumes部分:

volumes:
  traefik-public-certificates-volume:
    external: true

然后先手动创建该卷:

docker volume create traefik-public-certificates-volume

之后再运行docker compose up,此时Compose会直接使用你手动创建的外部卷,不会自动生成带前缀的版本。

2. 验证Traefik的卷挂载情况

  • 查看Traefik容器的挂载详情,确认/certificates对应的卷:
    docker inspect traefik | grep -A 10 "Mounts"
    
    找到Source字段,确认其值为你指定的卷名(如traefik-public-certificates-volume)。
  • 检查卷内是否存在证书文件:
    docker run --rm -v traefik-public-certificates-volume:/certificates alpine ls -l /certificates
    
    如果能看到acme.json文件,说明持久化存储已生效;启动Traefik后,该文件会自动生成并保存证书。
  • 重启Traefik后查看日志,确认是否复用已有证书:
    docker logs traefik | grep "acme"
    
    若日志显示Found valid certificate而非Requesting a certificate,说明持久化的证书正在被正确使用。

3. 清理无用卷

先停止容器:

docker compose down

然后删除未被使用的残留卷(注意不要删除正在使用的卷,可通过docker volume inspect 卷名查看是否有容器引用):

docker volume rm XXXXXXXXXXf5842b884e84fc165d275ca139f3a296331d154c1cffec2a753acd myproject_traefik-public-certificates traefik-public-certificates

内容的提问来源于stack exchange,提问作者brnk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:16:17