尝试通过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
文件。为什么我会收到这个奇怪的错误?
答案 0 :(得分:1)
我猜想绑定安装会导致haproxy出现问题,或者nmarus/haproxy-certbot
映像出了点问题。
在Swarm中,建议您使用Docker卷来存储持久性数据,例如由容器生成的证书和配置。如果使用多个Swarm节点,则需要使用http://rexray.io之类的共享存储,以确保卷不会“塞”在一个节点上。
(可选)如果在开始时将它们提供给容器,则可以使用Swarm Secrets和Configs将这些东西注入到容器中,但是我猜您正在使用的映像会即时生成它们。
Swarm也不使用depends_on
,cap_add
和expose
。有关要在Yaml中使用的每个功能,请参见compose file doc。
最后,看起来您正在使用的映像不像您已装载的那样使用docker套接字(您有两个卷:同一服务中的对象)不支持,因此您确实应该查看“群居”的代理知道”,并可以根据您部署的服务进行自我更新。 Traefik会这样做,而我go through examples of using it in Swarm on GitHub。