Хранение сертификатов в Docker
Хранение сертификатов держит файл acme.json в томе,
чтобы перезапуск контейнера не просил сертификат заново.
Флаг резолвера указывает путь
/letsencrypt/acme.json
внутри контейнера,
а том certs
монтируют в каталог /letsencrypt.
Запись попадает на диск хоста,
а не только в слой контейнера.
Том объявляют в секции volumes
и подключают к сервису proxy
рядом с сокетом Docker.
После успешной выдачи сертификата
файл можно увидеть в томе,
не заходя в образ заново.
Полное описание проекта:
services:
proxy:
image: traefik:3
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.email=admin@example.com
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- certs:/letsencrypt
site:
image: nginx
labels:
- traefik.enable=true
- traefik.http.routers.app.rule=Host(`app.example.com`)
- traefik.http.routers.app.entrypoints=websecure
- traefik.http.routers.app.tls.certresolver=le
volumes:
certs:
Фоновый запуск и перезапуск:
docker compose up -d
docker compose restart proxy
Том certs
не удаляют вместе с контейнером
при обычном docker compose down
без флага, который сносит тома.
Повторный старт прокси читает тот же
acme.json,
если сертификат ещё действует.
Снос тома вручную заставит Traefik
снова обратиться к Let's Encrypt.
Опишите проект с томом acme-store вместо certs и тем же путём файла внутри контейнера прокси.
Сравните, что случится с сертификатом после перезапуска контейнера прокси и после удаления тома.