Docker-Compose:更新后无法访问服务


version: '3.7'
services:
shinyproxy:
build: /home/administrator/shinyproxy
deploy:
replicas: 1
placement:
constraints:
- node.hostname==testnode
user: root:root
hostname: shinyproxy
image: shinyproxy-example
restart: always
networks:
- sp-example-net
volumes:
- type: bind
source: /var/run/docker.sock
target: /var/run/docker.sock
- type: bind
source: /home/administrator/shinyproxy/application.yml
target: /opt/shinyproxy/application.yml
ports:
- 4000:4000
mariadb:
image: mariadb
networks:
- sp-example-net
volumes:
- type: bind
source: /home/administrator/mariadbdata
target: /var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: keycloak
MYSQL_USER: keycloak
MYSQL_PASSWORD: xyz
deploy:
placement:
constraints:
- node.hostname==testnode
keycloak:
image: jboss/keycloak
networks:
- sp-example-net
volumes:
- type: bind
source: /home/administrator/compose/nginx/fullchain.pem
target: /etc/x509/https/tls.crt
- type: bind
source: /home/administrator/compose/nginx/privkey.pem
target: /etc/x509/https/tls.key
- ./theme/:/opt/jboss/keycloak/themes/custom/
environment:
- PROXY_ADDRESS_FORWARDING=true
- KEYCLOAK_USER=xyzasd
- KEYCLOAK_PASSWORD=xyz
ports:
- 8443:8443
deploy:
placement:
constraints:
- node.hostname==testnode
restart: "always"
nginx_service:
image: nginx_custom
ports:
- '80:80'
- '443:443'
build: ./nginx/
networks:
- sp-example-net

networks:
sp-example-net:
driver: overlay
external: true
attachable: true

这是我的compose file.密钥斗篷服务对闪亮代理用户进行身份验证。我使用docker-compose up --build -d来运行一切并且它有效。有时我必须更改我的 shinyproxy 服务的小部分并使用相同的命令更新所有内容: 检测到更改,输出如下所示:

compose_keycloak_1 is up-to-date
Recreating compose_shinyproxy_1 ... done

我正在结合nginx运行服务,并收到以下错误:

nginx_service_1  | 2020/06/05 10:02:11 [error] 7#7: *54 connect() failed (113: No route to host) while connecting to upstream, client: 185.130.32.1, server: myserver.com, request: "GET / HTTP/1.1", upstream: "http://10.0.3.181:4000/", host: "myserver.com"

运行docker-compose down然后再次docker-compose up --build工作,但我不想为了更新一个而关闭我的所有服务。 谁能告诉我为什么会发生这种情况以及如何解决它?

编辑:我越来越确定这是一个nginx问题,而不是docker问题。可能是这样吗?

我的nginx.conf看起来像这样:

server {
listen                443;
server_name           server.com;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_certificate /etc/certs/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/certs/privkey.pem; # managed by Certbot

location / {
proxy_pass          http://shinyproxy:4000; ### Übernahme der servicenamen aus Docker-compose
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 600s;
proxy_redirect    off;
proxy_set_header  Host             $http_host;
proxy_set_header  X-Real-IP        $remote_addr;
proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header  X-Forwarded-Protocol $scheme;
}
....

edit2:问题可能与此有关: https://github.com/docker/compose/issues/2003

实际上,您可以通过运行docker-compose up -d serviceName来启动该特定服务,而不是对整个项目执行docker-compose down然后docker-compose up --build。看看这个例子。

-d代表守护程序/分离模式。

version: '3'
services:
test:
container_name: test
image: 'busybox'
command: 'sleep 5d'
test1:
container_name: test1
image: 'busybox'
command: 'sleep 4d'
$ docker-compose up -d
Creating network "proj_default" with the default driver
Creating test  ... done
Creating test1 ... done
$ docker-compose ps
Name    Command    State   Ports
--------------------------------
test    sleep 5d   Up           
test1   sleep 5d   Up 
$ docker-compose up -d test1 
Recreating test1 ... done

解决方案是重新启动nginx。似乎每次重新启动后容器都会得到一个新IP,而nginx使用旧IP,并且无法找到它。

更新上游服务器时重新启动 nginx 容器

docker exec <nginx_container_id> nginx -s reload

最新更新