Как использовать личный реестр с Docker Swarm и Traefik в Docker
Я использую один узел, я использую traefik для управления всеми своими внешними соединениями, и я хочу запустить реестр таким образом, чтобы я мог подключиться к нему в registry.myhost.com
Теперь все примеры, которые я вижу, предлагают создать реестр как обычный контейнер, а не как службу, однако, когда я делаю это, у меня нет возможности добавить его в мою сеть traefik и, таким образом, включить его для внешнего поиска.
Нужно ли создавать еще одну внутреннюю сеть и подключать к ней и трафик, и если да, то какого типа. Или мне нужно запустить реестр как службу (я только на одном узле, поэтому объем не должен быть большой проблемой).
А что касается бонусных баллов, кто-нибудь может дать мне несколько советов о том, как настроить его с s3 в качестве бэкэнда хранилища?
1 ответ
обзор
У вас есть две машины:
- Сервер: Ваш (единственный) узел диспетчера Docker Swarm, который запускает traefik и другие контейнеры Docker, такие как реестр.
- Клиент: еще один компьютер, который должен иметь возможность подключаться к реестру и передавать на него образы Docker.
Я предполагаю, что у вас есть два файла сертификата:
registry.myhost.com.crt
registry.myhost.com.key
сервер
Настройка вашего сервера может выглядеть так:
~/certs/registry.myhost.com.crt
~/certs/registry.myhost.com.key
~/docker-compose.yml
~/traefik.toml
докер-compose.yml
version: '3'
services:
frontproxy:
image: traefik
command: --api --docker --docker.swarmmode
ports:
- "80:80"
- "443:443"
volumes:
- ./certs:/etc/ssl:ro
- ./traefik.toml:/etc/traefik/traefik.toml:ro
- /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events
docker-registry:
image: registry:2
deploy:
labels:
- traefik.port=5000 # default port exposed by the registry
- traefik.frontend.rule=Host:registry.myhost.com
- traefik.frontend.auth.basic=user:$$apr1$$9Cv/OMGj$$ZomWQzuQbL.3TRCS81A1g/ # user:password, see https://docs.traefik.io/configuration/backends/docker/#on-containers
traefik.toml
defaultEntryPoints = ["http", "https"]
# Redirect HTTP to HTTPS and use certificate, see https://docs.traefik.io/configuration/entrypoints/
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[[entryPoints.https.tls.certificates]]
certFile = "/etc/ssl/registry.myhost.com.crt"
keyFile = "/etc/ssl/registry.myhost.com.key"
# Docker Swarm Mode Provider, see https://docs.traefik.io/configuration/backends/docker/#docker-swarm-mode
[docker]
endpoint = "tcp://127.0.0.1:2375"
domain = "docker.localhost"
watch = true
swarmMode = true
Для развертывания реестра выполните:
docker stack deploy myregistry -c ~/docker-compose.yml
Добавить еще один стек
Если ваш сервис не определен в том же docker-compose.yml, что и traefik, вы можете использовать (внешнюю) сеть сервиса traefik:
version: '3'
services:
whoami:
image: emilevauge/whoami # A container that exposes an API to show its IP address
networks:
- frontproxy_default # add network of traefik service "frontproxy"
- default
deploy:
labels:
traefik.docker.network: frontproxy_default
traefik.frontend.rule: Host:whoami.myhost.com
traefik.frontend.auth.basic: user:$$apr1$$9Cv/OMGj$$ZomWQzuQbL.3TRCS81A1g/ # user:password, see https://docs.traefik.io/configuration/backends/docker/#on-containers
networks:
frontproxy_default:
external: true # network of traefik service "frontproxy" is defined in another stack
Убедитесь, что вы добавили файлы сертификатов whoami.myhost.com
на traefik.toml:
[[entryPoints.https.tls.certificates]]
certFile = "/etc/ssl/registry.myhost.com.crt"
keyFile = "/etc/ssl/registry.myhost.com.key"
[[entryPoints.https.tls.certificates]]
certFile = "/etc/ssl/whoami.myhost.com.crt"
keyFile = "/etc/ssl/whoami.myhost.com.key"
или используйте (один) подстановочный сертификат *.myhost.com
[[entryPoints.https.tls.certificates]]
certFile = "/etc/ssl/myhost.com.crt"
keyFile = "/etc/ssl/myhost.com.key"
См. https://docs.traefik.io/configuration/entrypoints/ для получения дополнительной информации.
клиент
копия registry.myhost.com.crt
на вашем клиентском компьютере, чтобы /etc/docker/certs.d/registry.myhost.com/ca.crt
в Linux или~/.docker/certs.d/registry.myhost.com/ca.crt
на Mac. Теперь вы сможете войти в систему с клиента:
docker login -u user -p password registry.myhost.com
Скопируйте изображение из Docker Hub в свой реестр
На вашем клиенте запустите:
docker pull hello-world:latest
docker tag hello-world:latest registry.myhost.com/hello-world:latest
docker push registry.myhost.com/hello-world:latest
Теперь вы можете перетащить этот образ на другую машину (например, на сервер):
docker pull registry.myhost.com/hello-world:latest
Не забудьте добавить registry.myhost.com.crt
на этой клиентской машине тоже.