curl: (7) 无法连接到我的引导系统端口 8079:连接被拒绝

curl: (7) Failed to connect to my-boot-system port 8079: Connection refused

我试图进入nginx容器来curl url:http://my-boot-system:8079,但是出现了如题的错误。

在 nginx Dockerfile 中,我有:

FROM nginx
VOLUME /tmp
ENV LANG en_US.UTF-8
RUN echo "server {  \
                      listen       80; \
                      location ^~ /my-boot { \
                      proxy_pass              http://my-boot-system:8079/my-boot/; \
                      proxy_set_header        Host my-boot-system; \
                      proxy_set_header        X-Real-IP $remote_addr; \
                      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for; \
                  } \
                  location / { \
                     root   /var/www/html/; \
                      index  index.html index.htm; \
                      if (!-e $request_filename) { \
                          rewrite ^(.*)$ /index.html?s=$1 last; \
                          break; \
                      } \
                  } \
                  access_log  /var/log/nginx/access.log ; \
              } " > /etc/nginx/conf.d/default.conf \
    &&  mkdir  -p  /var/www \
    &&  mkdir -p /var/www/html

ADD dist/ /var/www/html/
EXPOSE 80

nginx容器好像找不到网络??但是,在 docker-compose 中,我有:

version: '2.4'
services:

  my-iot-survey-web:
    build:
      context: .
    restart: always
    container_name: my-iot-survey-web
    image: my-iot-survey-web
    ports:
      - 7070:80
    networks:
      - my-iot-surver-api_default

networks:
  my-iot-surver-api_default:
    external: true

我已经有一个名为 my-iot-surver-api_default 的网络,它显示在 'docker network ls' 命令中。并且网络 my-iot-surver-api_default 也存在于 docker-compose of my-boot-system definition

version: '2.4'
services:
  my-boot-redis:
    image: redis:5.0
    ports:
      - 6378:6379
    restart: always
    container_name: my-boot-redis

  my-boot-system:
    build:
      context: ./my-boot-module-system
    restart: always
    container_name: my-boot-system
    image: my-boot-system
    ports:
      - 8079:8080
    networks:
      - my-iot-surver-api_default
networks:
  my-iot-surver-api_default:
    external: true

以下是docker的网络检查:

[
    {
        "Name": "my-iot-surver-api_default",
        "Id": "aaeda9e6419a1d603e6c3de6364025ef7c3ea034de57ba3a63c00b608f844d5f",
        "Created": "2021-03-19T14:39:56.432760565+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "3c59d1d44ea2d08a3c6a68fb16539db0830d535ce585d128d10e90b57c1f5642": {
                "Name": "my-boot-redis",
                "EndpointID": "30b21c59c1da1b031f8ce2b85c7fc8c62f03b7623fb69ee205af8dfa5a95d61a",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "9fd99e54d2bc7ad51dc539586f8a49a295f9ea0ba2bd1c9555d864d351d4d4be": {
                "Name": "my-iot-survey-web",
                "EndpointID": "dc8fabe7113742476c00f0eee98f40c99772835e1e3fe9b41f5cef8cda9824ae",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "fd999975f007537c4449b65cf5f2cb86b1d5b40655a7c324c2cc9f35bf4632f5": {
                "Name": "my-boot-system",
                "EndpointID": "ede496dc1ff7f73d45bff969a15dd5e3a05d82979cbfa7f3226360c24b4369f4",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

同一 Docker 网络上容器之间的连接忽略 ports:。您始终需要连接到容器内服务正在侦听的端口;如果您有 ports:,容器间连接的端口号需要与 second 端口号匹配。 (如果不需要从外部访问该服务 Docker,则完全停止 ports: 也是有效的。)

在此特定设置中,您还可以注意到收到“连接被拒绝”错误。如果你得到那个错误(而不是“没有这样的主机”错误),Nginx 已经成功地查找了它被赋予的主机名,这意味着 Docker-level 设置是正确的。

这意味着您可以将 Nginx 配置更改为:

proxy_pass              http://my-boot-system:8080/my-boot/;
#     Not remapped 8079 but the standard port ^^^^

(我会考虑在 Docker 文件中进行一些其他清理。COPY 配置文件而不是尝试 RUN 一个冗长的逃逸倾向 shell 命令内联创建它。不要声明 VOLUME;它通常只会产生令人困惑的副作用,不会带来任何好处。在大多数情况下,更喜欢 COPY 而不是 ADD。 Docker Hub nginx 基础镜像也已经包含 EXPOSE 和一个内容目录,所以使用它的 /usr/share/nginx/html 而不是 /var/www/html。那会减少 Docker文件添加到 FROM 行和两个 COPY 行以添加配置和内容。)