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
行以添加配置和内容。)
我试图进入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
行以添加配置和内容。)