Sri*_*esh 1 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 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
Run Code Online (Sandbox Code Playgroud)
他们都很好:
没有工作文件:
泊坞窗,compose.yaml
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
Run Code Online (Sandbox Code Playgroud)
错误:
基本上我无法gremlin从app_web容器连接到容器.
以下所有内容均已在web_app容器内执行
卷曲:
root@49a8f08a7b82:/# curl 0.0.0.0:8182
curl: (7) Failed to connect to 0.0.0.0 port 8182: Connection refused
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
NSLOOKUP
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"
Run Code Online (Sandbox Code Playgroud)
然后从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
Run Code Online (Sandbox Code Playgroud)
curl 0.0.0.0:8182
Run Code Online (Sandbox Code Playgroud)
0.0.0.0地址是一个通配符,告诉应用程序监听所有网络接口,您不作为客户端连接到此接口.对于容器到容器的通信,您需要:
在您的情况下,命令应该是:
curl http://gremlin:8182
Run Code Online (Sandbox Code Playgroud)
网络在容器内运行的应用程序中被命名空间,因此每个容器在桥接网络上获得它的开放环回接口和IP地址.因此,将应用程序移动到容器意味着您需要侦听0.0.0.0并使用DNS连接到网桥ip.
您还应该从Dockerfile中删除链接和depends_on,它们不适用于版本3.链接早已被弃用,转而使用共享网络.并且depends_on在群集模式下不起作用,可能没有做你想要的,因为它从未检查目标应用程序是否正在运行,只有该容器的开始才被启动.
最后一点,expos不会影响公共网络上的容器之间通信或发布主机上的端口的能力.Expose只是在图像上设置元数据,该图像是创建图像的人和运行图像的人之间的文档.应用程序不需要使用该值,但为了下游用户的利益,使您的应用程序默认为该值是一个好习惯.由于它的作用,除非你有另一个应用程序检查暴露的端口列表,比如自我更新反向代理,否则不需要在compose文件中公开端口,除非你将compose文件提供给另一个人并且他们需要文档.
| 归档时间: |
|
| 查看次数: |
1689 次 |
| 最近记录: |