Docker Compose:暴露不工作
docker ps-aDocker Compose:暴露不工作,docker,docker-compose,Docker,Docker Compose,docker ps-a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 83b1503d2e7c app_nginx "nginx -g 'daemon ..." 2 hours ago Up 2 hours
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83b1503d2e7c app_nginx "nginx -g 'daemon ..." 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp app_nginx_1
c9dd2231e554 app_web "/home/start.sh" 2 hours ago Up 2 hours 8000/tcp app_web_1
baad0fb1fabf app_gremlin "/start.sh" 2 hours ago Up 2 hours 8182/tcp app_gremlin_1
b663a5f026bc postgres:9.5.1 "docker-entrypoint..." 25 hours ago Up 2 hours 5432/tcp app_db_1
它们都工作正常:
- app\u nginx与app\u web连接良好
- app_网站与postgres连接良好
- app_web无法与app_gremlin连接
version: '3'
services:
db:
image: postgres:9.5.12
web:
build: .
expose:
- "8000"
depends_on:
- gremlin
command: /home/start.sh
nginx:
build: ./nginx
links:
- web
ports:
- "80:80"
command: nginx -g 'daemon off;'
gremlin:
build: ./gremlin
expose:
- "8182"
command: /start.sh
错误: 基本上,我无法从我的
app\u web
容器连接到gremlin
容器
以下所有内容都已在web\u应用程序
容器中执行
卷曲:
root@49a8f08a7b82:/# curl 0.0.0.0:8182
curl: (7) Failed to connect to 0.0.0.0 port 8182: Connection refused
netstat
root@49a8f08a7b82:/# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.11:42681 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN
udp 0 0 127.0.0.11:54232 0.0.0.0:*
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node Path
nmap
root@49a8f08a7b82:/# nmap -p 8182 0.0.0.0
Starting Nmap 7.60 ( https://nmap.org ) at 2018-06-22 09:28 UTC
Nmap scan report for 0.0.0.0
Host is up.
PORT STATE SERVICE
8182/tcp filtered vmware-fdm
Nmap done: 1 IP address (1 host up) scanned in 2.19 seconds
nslookup
root@49a8f08a7b82:/# nmap -p 8182 0.0.0.0
Starting Nmap 7.60 ( https://nmap.org ) at 2018-06-22 09:28 UTC
Nmap scan report for 0.0.0.0
Host is up.
PORT STATE SERVICE
8182/tcp filtered vmware-fdm
Nmap done: 1 IP address (1 host up) scanned in 2.19 seconds
root@88626de0c056:/#nslookup app_gremlin_1
服务器:127.0.0.11
地址:127.0.0.11#53
非权威性回答:
名称:app_gremlin_1
地址:172.19.0.3
实验: 对于Gremlin容器,我做了
ports:
- "8182:8182"
然后从Host
我可以连接到gremlin
容器,但是web
和gremlin
容器之间仍然没有连接
我正在创建一个重新创建的示例Docker文件(创建问题所需的最少材料),同时任何人都知道问题可能是什么?在web和gremlin之间的Docker-compose.yaml中没有配置链接。尝试使用以下方法:
version: '3'
services:
db:
image: postgres:9.5.12
web:
links:
- gremlin
build: .
expose:
- "8000"
depends_on:
- gremlin
command: /home/start.sh
nginx:
build: ./nginx
links:
- web
ports:
- "80:80"
command: nginx -g 'daemon off;'
gremlin:
build: ./gremlin
expose:
- "8182"
command: /start.sh
web和gremlin之间的docker-compose.yaml中没有配置链接。尝试使用以下方法:
version: '3'
services:
db:
image: postgres:9.5.12
web:
links:
- gremlin
build: .
expose:
- "8000"
depends_on:
- gremlin
command: /home/start.sh
nginx:
build: ./nginx
links:
- web
ports:
- "80:80"
command: nginx -g 'daemon off;'
gremlin:
build: ./gremlin
expose:
- "8182"
command: /start.sh
0.0.0.0地址是一个通配符,告诉应用程序在所有网络接口上侦听,但您不能作为客户端连接到此接口。对于容器到容器的通信,您需要:
- 同一用户生成网络上的容器(默认情况下,compose会为您执行此操作)
- 连接到服务的名称(或容器名称)
- 连接到另一个容器内的端口,而不是已发布的端口
curl http://gremlin:8182
在容器内运行的应用程序中,网络是以名称空间命名的,因此每个容器都可以在网桥网络上获得其开放环回接口和ip地址。因此,将应用程序移动到容器中意味着您需要监听0.0.0.0并使用DNS连接到网桥ip
您还应该从Dockerfile中删除链接和依赖,它们在版本3中不适用。链接早已被弃用,取而代之的是共享网络。而且Dependes_on在swarm模式下不起作用,而且可能没有做你想做的事情,因为它从未检查目标应用程序是否正在运行,只是启动了容器的开头
最后一点注意,expose不会影响公共网络上的容器或主机上的发布端口之间的通信能力。Expose只是在图像上设置元数据,即创建图像的人和运行图像的人之间的文档。应用程序不需要使用该值,但为了下游用户的利益,将应用程序默认为该值是一个好习惯。由于它的作用,除非您有另一个应用程序检查公开的端口列表(如自更新反向代理),否则无需在撰写文件中公开端口,除非您将撰写文件提供给其他人并且他们需要文档
0.0.0.0地址是一个通配符,告诉应用程序在所有网络接口上侦听,但您不能作为客户端连接到此接口。对于容器到容器的通信,您需要:
- 同一用户生成网络上的容器(默认情况下,compose会为您执行此操作)
- 连接到服务的名称(或容器名称)
- 连接到另一个容器内的端口,而不是已发布的端口
curl http://gremlin:8182
在容器内运行的应用程序中,网络是以名称空间命名的,因此每个容器都可以在网桥网络上获得其开放环回接口和ip地址。因此,将应用程序移动到容器中意味着您需要监听0.0.0.0并使用DNS连接到网桥ip
您还应该从Dockerfile中删除链接和依赖,它们在版本3中不适用。链接早已被弃用,取而代之的是共享网络。而且Dependes_on在swarm模式下不起作用,而且可能没有做你想做的事情,因为它从未检查目标应用程序是否正在运行,只是启动了容器的开头
最后一点注意,expose不会影响公共网络上的容器或主机上的发布端口之间的通信能力。Expose只是在图像上设置元数据,即创建图像的人和运行图像的人之间的文档。应用程序不需要使用该值,但为了下游用户的利益,将应用程序默认为该值是一个好习惯。由于它的作用,除非您有另一个应用程序检查公开的端口列表(如自更新反向代理),否则无需在撰写文件中公开端口,除非您将撰写文件提供给另一个人并且他们需要文档。您必须添加有关此的更多信息“app\u web无法连接app\u gremlin”。您如何测试连接,会收到什么错误消息?我将添加更多,我基本无法连接到端口8182您必须添加有关此“app\u web无法连接app\u gremlin”的更多信息“。您是如何测试连接的,您收到了什么错误消息?我将添加更多,我基本上无法连接到端口8182。我以前尝试过链接。但不是两个链接和依赖,将尝试它超过尝试添加链接,没有工作。在我的问题中添加了nmap、netstat等。您能否在web容器中运行
nslookup gremlin
?为我的问题添加了完整的nslookup。总结“服务器:127.0.0.11地址:127.0.0.11#53”好的,只需使用地址app_gremlin_1:8182连接到