Странно не получался getsockopt: операция не разрешена в Docker-Compose - PullRequest
0 голосов
/ 09 марта 2019

Я получаю странную ошибку при попытке запуска роя Docker с помощью docker-compose. Я пытаюсь использовать следующий (краткий) учебник для преобразования роя docker-compose с использованием HAProxy для использования letsencrypt ssl. Вы можете посмотреть учебник здесь: http://blog.armstrongconsulting.com/?p=392.

Вот мой файл docker-compose:

version: '3.3'
services:
  back:
    image: patientplatypus/lowtechback:latest
    ports:
      - '5000:5000'
    deploy:
      replicas: 3
      restart_policy:
       condition: on-failure
       max_attempts: 5
       window: 120s
    networks:
      - web
  front:
    image: patientplatypus/lowtechfront:latest
    ports:
      - '80:3000'
    depends_on:
      - back
    deploy:
      replicas: 3
      restart_policy:
       condition: on-failure
       max_attempts: 5
       window: 120s
    networks:
      - web
  proxy:
    # image: dockercloud/haproxy
    image: nmarus/haproxy-certbot
    depends_on:
      - back
      - front
    environment:
      - BALANCE=leastconn
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8080:8080
    expose:
      - "8080"
      - "3000"
      - "5000"
    cap_add:
      - ALL
      - NET_ADMIN
    volumes:
      - ./data/config:/config
      - ./data/letsencrypt:/etc/letsencrypt
      - ./data/certs:/usr/local/etc/haproxy/certs.d
    networks:
      - web
    deploy:
      placement:
        constraints: [node.role == manager]
networks:
  web:
    driver: overlay

В ./data/config/haproxy.cfg есть файл с параметрами конфигурации для haproxy, чтобы использовать ssl. Единственное соответствующее изменение, которое я внес в конфигурацию по умолчанию (вы можете видеть это здесь: https://hub.docker.com/r/nmarus/haproxy-certbot), которое я сделал, было это:

backend my_http_backend
  mode http
  balance leastconn
  option tcp-check
  option log-health-checks
  server back back:5000 check port 5000
  server front front:80 check port 80

для маршрутизации в мои собственные контейнеры.

Когда я запускаю следующие команды (как root):

 docker swarm init \
   --advertise-addr MY_IP_ADD_SS
docker stack deploy --compose-file=docker-compose.yaml prod2

Я получаю следующее:

root@ubuntu-1gb-nyc3-01:/lowteck# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                                 PORTS
ko2xkerpki9f        prod2_back          replicated          3/3                 patientplatypus/lowtechback:latest    *:5000->5000/tcp
rly8rrb5uiht        prod2_front         replicated          3/3                 patientplatypus/lowtechfront:latest   *:80->3000/tcp
nuf7219sxteu        prod2_proxy         replicated          0/1                 nmarus/haproxy-certbot:latest         *:8080->8080/tcp
root@ubuntu-1gb-nyc3-01:/lowteck# docker service logs prod2_proxy
prod2_proxy.1.y2eagrgn52fg@ubuntu-1gb-nyc3-01    | getsockopt failed strangely: Operation not permitted
prod2_proxy.1.ycbj0rojv2tl@ubuntu-1gb-nyc3-01    | getsockopt failed strangely: Operation not permitted
prod2_proxy.1.y4mt1es20q0v@ubuntu-1gb-nyc3-01    | getsockopt failed strangely: Operation not permitted
prod2_proxy.1.ohopcbdmgvwt@ubuntu-1gb-nyc3-01    | getsockopt failed strangely: Operation not permitted

Насколько я могу сказать, я установил параметр cap_add, чтобы разрешить эту операцию в прокси-контейнере, я выполнил команду swarm от имени пользователя root, и у меня должны быть права на чтение / запись / выполнение для моего haproxy.cfg файл. Почему я получаю эту странную ошибку?

1 Ответ

1 голос
/ 09 марта 2019

Я предполагаю, что привязанные монтирования вызывают эту проблему в haproxy или просто что-то не так с образом nmarus/haproxy-certbot.

В Swarm рекомендуется использовать том докера для хранения постоянных данных, таких как сертификаты и конфигурации, генерируемые вашим контейнером.Если вы используете несколько узлов Swarm, вам нужно использовать общее хранилище с чем-то вроде http://rexray.io, чтобы убедиться, что тома не "зависли" на одном узле.

При желании вы можете использовать Swarm Secrets and Configs для внедренияэти вещи в контейнеры, если вы предоставляете их в контейнер при запуске, но я предполагаю, что используемое вами изображение генерирует их на лету.

Также, depends_on, cap_add, иexpose не используются Swarm.См. файл для создания документа doc по каждой функции, которую вы хотите использовать в yaml.

Наконец, похоже, что изображение, которое вы используете, не поддерживает использование док-сокета, как у вассмонтирован (у вас есть два тома: объекты в одной и той же службе), и поэтому вам действительно следует посмотреть на прокси, которые «осведомлены о рое» и могут самообновляться в зависимости от развертываемых вами служб. Traefik делает это, и я рассматриваю примеры его использования в Swarm на GitHub .

...