Как использовать частный реестр с docker swarm и traefik в докере

Я запускаю рой с одним узлом, использую traefik для управления всеми своими внешними подключениями и хочу запустить реестр, чтобы я мог подключиться к нему по адресуRegistry.myhost.com.

Теперь все примеры, которые я вижу, предлагают создать реестр как обычный контейнер, а не службу, однако, когда я это делаю, у меня нет возможности добавить его в свою сеть traefik и, таким образом, разрешить его поиск извне.

Нужно ли создавать еще одну внутреннюю сеть и подключать к ней и траефик и его, и если да, то какого типа. Или мне нужно запустить реестр как службу (я работаю только на одном узле, поэтому объем не должен быть большой проблемой).

И для бонусных баллов, может ли кто-нибудь дать мне несколько советов о том, как настроить его с помощью s3 в качестве хранилища?


person user2959736    schedule 23.03.2018    source источник


Ответы (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

docker-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 Центр вашего реестра

На вашем клиенте запустите:

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 на эту клиентскую машину.

person maiermic    schedule 17.07.2018