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 /certificatesacme.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
相关产品推荐
相关产品推荐

