Skip to content

记录一次容器之间通信遇到的问题

背景

笔者之前按照DOClever官方在github上提供的docker部署方式进行安装,根据官方提供的docker-compose修改后如下:

yml
version: "2"
services:
  DOClever:
    image: lw96/doclever
    restart: always
    container_name: DOClever
    ports:
    - 10040:10000
    volumes:
      - /本地路径/file:/root/DOClever/data/file
      - /本地路径/img:/root/DOClever/data/img
      - /本地路径/tmp:/root/DOClever/data/tmp
    environment:
    - DB_HOST=mongodb://mongo:27017/DOClever
    - PORT=10000
    links:
    - mongo:mongo

  mongo:
    image: mongo:latest
    restart: always
    container_name: doc/mongodb
    volumes:
    - /本地路径/db:/data/db

这么做有个缺点,就是mongo服务只能让doclever自己用,其他人使用不了,因为mongo没有对外暴露端口。

尝试分开部署方案

于是上网找了mongo的docker安装方案,先对mongo服务进行部署,相关docker-compose如下:

yml
version: '3.1'
services:

  mongo:
    image: mongo
    restart: always
    container_name: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: 密码
    ports:
      - 27017:27017
    volumes:
      - /本地路径/db:/data/db

并用gui工具连接测试了一下,连接正常。

接着笔者开始部署doclever,其docker-compose配置如下:

yml
version: "2"
services:
  DOClever:
    image: lw96/doclever
    restart: always
    container_name: DOClever
    ports:
    - 10040:10000
    volumes:
    - /本地路径/file:/root/DOClever/data/file
    - /本地路径/img:/root/DOClever/data/img
    - /本地路径/tmp:/root/DOClever/data/tmp
    environment:
    - DB_HOST=mongodb://root:密码@47.xx.xx.xx:27017/DOClever
    - PORT=10000
    - DB_FILE=/root/DOClever/data/file
    - DB_IMG=/root/DOClever/data/img
    - DB_TEMP=/root/DOClever/data/tmp

docker安装完后执行docker ps查看容器确认服务已经在运行,一切看似很顺利。但是用浏览器访问10040发现访问不了页面。于是去查看防火墙,也没发现问题。 通过与之前的配置方案对比,我分析问题应该出在- DB_HOST=mongodb://root:密码@47.xx.xx.xx:27017/DOClever这一行上,因为其他配置基本没变,只是连接数据库多个密码权限。

为什么数据库加了密码反而访问不了页面

其实是笔者对mongo的使用方式理解有误。 我们先来解释一下mongodb://root:密码@47.xx.xx.xx:27017/DOClever这句话的意思,它是指连接47.xx.xx.xx:27017地址上的DOClever数据库,用户名为root。而我之前理解的是使用root用户可以访问任何数据库,但是初始的mongo只提供了一个名为admin数据库给root用户使用(我猜正确的理解是,root并非是所有数据库的超级管理员)。 我查了下mongo的使用文档,发现正确的使用姿势是先创建数据库并绑定一个角色才能用。也就是说我们要先有个叫DOClever的数据库,然后绑定一个角色。于是我去创建好这个数据库,给了它一个名叫doclever的角色,role值设为dbOwner。 然后把docker-compose配置修改成- DB_HOST=mongodb://doclever:密码@47.xx.xx.xx:27017/DOClever,重新部署容器,再次访问页面,成功解决!

苏ICP备20040768号