记录一次容器之间通信遇到的问题
背景
笔者之前按照DOClever官方在github上提供的docker部署方式进行安装,根据官方提供的docker-compose修改后如下:
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如下:
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配置如下:
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
,重新部署容器,再次访问页面,成功解决!