S1码农多,docker问题求助(已解决)
本帖最后由 spikedingo 于 2019-7-3 11:24 编辑这两天在折腾docker-compose,似乎还差临门一脚
情况是这样的,web项目里写的mongodb和redis连接host都是127.0.0.1,但是使用docker-compose时用network连起来时,却无法访问127.0.0.1:6379的redis服务器
yml文件如下
version: '2'
services:
web:
build:
context: .
dockerfile: docker-web-Dockerfile
restart: always
depends_on:
- redis
- mongo_db
ports:
- "127.0.0.1:8001:8080"
networks:
- wood-network
mongo_db:
build:
context: .
dockerfile: docker-mongo-Dockerfile
restart: always
ports:
- "127.0.0.1:27017:27017"
volumes:
- "/home/volumes/mongo:/data/db"
- "/etc/localtime:/etc/localtime"
networks:
- wood-network
redis:
image: "redis:alpine"
ports:
- "127.0.0.1:6379:6379"
restart: always
networks:
- wood-network
networks:
wood-network:
driver: bridge
PS: yml里去掉web那个容器,把mongodb和redis端口暴露给外面而不使用networks时,是可以正常访问127.0.0.1:6379和127.0.0.1:27017的 127.0.0.1改成0.0.0.0呢
—— 来自 Xiaomi Redmi 4, Android 9上的 S1Next-鹅版 v2.1.2 或者试试填本机ip? 127回环不产生正常流量 本帖最后由 magi 于 2019-7-3 02:21 编辑
web项目里连别的写域名 比如mongo_db:27017,compose文件维持原样就好。
你需要意识到每个容器自己是一个虚拟机,port里第一个的127.0.0.1相对的是物理机本机,web容器内写的127.0.0.1相对的是web这台虚拟机本机。每次启动容器动态分配各个虚拟机的ip,直接用域名可以获得这个ip走你定义的network内部从一台虚拟机到另一台虚拟机。(也就是如果数据库只给web用不需要自己随便从外部连上去看的话,可以不用port映射给物理机,只要expose端口就两个容器之间就能从network里互相了)
当然还有一种方式web容器里数据库地址、compose文件port全都写物理机的ip,这样都通过绕到本机在绕回去,但是都和本机地址有关了,失去通用性还多经过一层转发,所以不建议。
如果你的container都在自定义的network上的话container之间访问可以直接用service name加端口号访问,有类似dns的解析机制可以不用写ip。
如果不需要外部访问的话(比如物理机)mongodb和redis的port部分都可以删掉不要。
其实我把楼上的话又复述了一遍 流石S1😤上班就去试 太给力了,成功UP
页:
[1]