getsockopt奇怪地失败:在Docker-Compose

时间:2019-03-08 23:13:32

标签: docker ssl docker-compose docker-swarm haproxy

尝试通过docker-compose启动docker-swarm时遇到一个奇怪的错误。我正在尝试使用以下(简短)教程,使用HAProxy来使用letencrypt ssl来转换docker-compose swarm。您可以在此处查看该教程: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

路由到我自己的容器。

当我以根用户身份运行以下命令时:

 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选项以允许在代理容器中执行此操作,我已经以root用户身份运行了swarm命令,并且我应该具有对以下文件的读取/写入/执行权限我的haproxy.cfg文件。为什么我会收到这个奇怪的错误?

1 个答案:

答案 0 :(得分:1)

我猜想绑定安装会导致haproxy出现问题,或者nmarus/haproxy-certbot映像出了点问题。

在Swarm中,建议您使用Docker卷来存储持久性数据,例如由容器生成的证书和配置。如果使用多个Swarm节点,则需要使用http://rexray.io之类的共享存储,以确保卷不会“塞”在一个节点上。

(可选)如果在开始时将它们提供给容器,则可以使用Swarm Secrets和Configs将这些东西注入到容器中,但是我猜您正在使用的映像会即时生成它们。

Swarm也不使用depends_oncap_addexpose。有关要在Yaml中使用的每个功能,请参见compose file doc

最后,看起来您正在使用的映像不像您已装载的那样使用docker套接字(您有两个卷:同一服务中的对象)不支持,因此您确实应该查看“群居”的代理知道”,并可以根据您部署的服务进行自我更新。 Traefik会这样做,而我go through examples of using it in Swarm on GitHub