Angular 4应用Docker环境下访问CouchDB连接失败解决咨询
解决Angular 4应用访问Docker容器中CouchDB的连接拒绝问题
首先我注意到你的docker-compose.yml里有个明显的问题:重复定义了couchdb服务,这会导致Docker Compose运行逻辑冲突,先把这个问题修复,合并成一个完整的couchdb服务:
version: '2' volumes: couchdb_data: {} services: client: build: ./client ports: - "80:80" links: - superlogin:superlogin - couchdb:couchdb couchdb: environment: - COUCHDB_USER=somename - COUCHDB_PASSWORD=somepassword image: klaemo/couchdb:1.6-couchperuser ports: - "5984:5984" volumes: - "couchdb_data:/usr/local/var/lib/couchdb" superlogin: build: ./superlogin ports: - "3000:3000" links: - couchdb:couchdb
接下来是核心问题:你的Angular应用是在用户浏览器中运行的,并非在client容器内部执行。所以你用的couchdb:5984这个别名只有Docker内部的容器能识别(依赖Docker内置DNS服务),浏览器完全不知道这个地址,自然会出现ERR_CONNECTION_REFUSED错误。
下面提供两种可行的解决方案:
方案一:用Nginx反向代理(推荐生产环境使用)
因为你的client容器是用Nginx部署前端的,我们可以让Nginx作为中间层,把前端的CouchDB请求转发到CouchDB容器:
- 修改
client容器中的Nginx配置文件(比如nginx.conf或者default.conf),添加反向代理规则:location /api/couchdb/ { proxy_pass http://couchdb:5984/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } - 在你的Angular应用中,把请求CouchDB的URL改成
/api/couchdb(比如http://localhost/api/couchdb,因为Nginx已映射到主机的80端口)。这样浏览器会把请求发送到Nginx,Nginx再转发到Docker内部的couchdb:5984,而Nginx在容器里能正常解析这个服务名。
方案二:直接访问主机映射的端口(适合开发环境)
如果你只是在本地开发测试,可以直接让前端请求主机上的CouchDB端口:
- 确保
docker-compose.yml中couchdb的端口映射已经生效(你已经配置了ports: -"5984:5984"),这会把容器的5984端口映射到主机的5984端口。 - 在Angular应用中,把请求URL改成
http://localhost:5984(如果是远程开发,就用主机的IP地址,比如http://192.168.x.x:5984)。 - 解决CORS跨域问题:因为浏览器的同源策略,CouchDB默认不允许跨域请求,你需要配置CouchDB允许你的前端域名:
- 可以通过CouchDB的Futon管理界面(
http://localhost:5984/_utils)进入设置,找到CORS选项,添加你的前端域名(比如http://localhost)。 - 或者用命令行工具配置(需要先安装
couchdb-cors):couchdb-cors enable --host http://localhost
- 可以通过CouchDB的Futon管理界面(
另外,你的Superlogin服务配置是没问题的,因为Superlogin在容器内部,它用couchdb:5984能正常连接到CouchDB容器。
内容的提问来源于stack exchange,提问作者Jabiulla Mulla
相关产品推荐
相关产品推荐

