spikedingo 发表于 2019-7-2 23:27

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

spikedingo 发表于 2019-7-2 23:31

PS: yml里去掉web那个容器,把mongodb和redis端口暴露给外面而不使用networks时,是可以正常访问127.0.0.1:6379和127.0.0.1:27017的

weakiwi 发表于 2019-7-2 23:39

127.0.0.1改成0.0.0.0呢

—— 来自 Xiaomi Redmi 4, Android 9上的 S1Next-鹅版 v2.1.2

电动犀牛 发表于 2019-7-3 00:19

或者试试填本机ip? 127回环不产生正常流量

magi 发表于 2019-7-3 02:00

本帖最后由 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,这样都通过绕到本机在绕回去,但是都和本机地址有关了,失去通用性还多经过一层转发,所以不建议。

seducer0719 发表于 2019-7-3 04:40

如果你的container都在自定义的network上的话container之间访问可以直接用service name加端口号访问,有类似dns的解析机制可以不用写ip。

如果不需要外部访问的话(比如物理机)mongodb和redis的port部分都可以删掉不要。
其实我把楼上的话又复述了一遍

spikedingo 发表于 2019-7-3 07:30

流石S1😤上班就去试

spikedingo 发表于 2019-7-3 10:58

太给力了,成功UP
页: [1]
查看完整版本: S1码农多,docker问题求助(已解决)