我正在使用 docker-compose 来处理 mongodb 副本集。docker 正在运行的主机上一切正常。当我尝试从同一网络中的另一个客户端进行连接时,遇到了问题。我的 docker 中暴露了端口。
version: '3.2'
networks:
netBackEnd:
ipam:
driver: default
config:
- subnet: 192.168.0.0/24
services:
mongo1:
hostname: mongo1
container_name: mongo1
image: mongo:4.2-bionic
expose:
- 27017
ports:
- 27017:27017
restart: always
volumes:
- "/etc/mongodb/ssl/mongo1.pem:/data/mongo1.pem:ro"
- "/etc/mongodb/ssl/testing.ca.crt:/data/testing.ca.crt:ro"
- "/usr/local/mongo-volume1:/data/db"
command: --replSet rs0 --sslMode requireSSL --clusterAuthMode x509 --sslClusterFile /data/mongo1.pem --sslPEMKeyFile /data/mongo1.pem --sslCAFile /data/testing.ca.crt --bind_ip 0.0.0.0 --port 27017
networks:
netBackEnd:
ipv4_address: 192.168.0.2
mongo2:
hostname: mongo2
container_name: mongo2
image: mongo:4.2-bionic
expose:
- 27018
ports:
- 27018:27018
restart: always
volumes:
- "/etc/mongodb/ssl/mongo2.pem:/data/mongo2.pem:ro"
- "/etc/mongodb/ssl/testing.ca.crt:/data/testing.ca.crt:ro"
- "/usr/local/mongo-volume2:/data/db"
command: --replSet rs0 --sslMode requireSSL --clusterAuthMode x509 --sslClusterFile /data/mongo2.pem --sslPEMKeyFile /data/mongo2.pem --sslCAFile /data/testing.ca.crt --bind_ip 0.0.0.0 --port 27018
networks:
netBackEnd:
ipv4_address: 192.168.0.3
mongo3:
hostname: mongo3
container_name: mongo3
image: mongo:4.2-bionic
expose:
- 27019
ports:
- 27019:27019
restart: always
volumes:
- "/etc/mongodb/ssl/mongo3.pem:/data/mongo3.pem:ro"
- "/etc/mongodb/ssl/testing.ca.crt:/data/testing.ca.crt:ro"
- "/usr/local/mongo-volume3:/data/db"
command: --replSet rs0 --sslMode requireSSL --clusterAuthMode x509 --sslClusterFile /data/mongo3.pem --sslPEMKeyFile /data/mongo3.pem --sslCAFile /data/testing.ca.crt --bind_ip 0.0.0.0 --port 27019
networks:
netBackEnd:
ipv4_address: 192.168.0.4
docker 运行所在的 /etc/hosts 文件
127.0.0.1 localhost
127.0.1.1 xxxx-ThinkPad-X270
192.168.0.1 mongo1
192.168.0.2 mongo2
192.168.0.3 mongo3
我可以使用运行 docker 的主机的 ip_address 连接到单个主机,但不能连接到完整的副本集,因为副本集仅在使用与副本集初始化相同的主机名时才有效。
mongo --ssl --sslCAFile /etc/mongodb/ssl/testing.ca.crt --host host_ip_address:27017 --sslPEMKeyFile /etc/mongodb/ssl/remote_client.pem --authenticationDatabase '$external' --authenticationMechanism 'MONGODB-X509'
但不要使用下面的连接字符串
mongo --ssl --sslCAFile /etc/mongodb/ssl/testing.ca.crt --host rs0/host_ip_address:27017,host_ip_address:27018,host_ip_address:27019 --sslPEMKeyFile /etc/mongodb/ssl/client.pem --authenticationDatabase '$external' --authenticationMechanism 'MONGODB-X509'
因此我想到使用 nginx 服务器作为我的副本集的反向代理。但同样的问题仍然存在,我只能连接到单个主机。
nginx 配置文件
stream {
server {
listen 27020 so_keepalive=on;
proxy_connect_timeout 20s;
proxy_pass stream_mongo_backend;
proxy_timeout 10m;
}
upstream stream_mongo_backend {
server mongo1:27017;
server mongo1:27018;
server mongo1:27019;
}
}
连接字符串
mongo --ssl --sslCAFile /etc/mongodb/ssl/testing.ca.crt --host rs0/host_ip_address:27020 --sslPEMKeyFile /etc/mongodb/ssl/remote_client.pem --authenticationDatabase '$external' --authenticationMechanism 'MONGODB-X509
我发现下面邮政关于代理后面的副本集配置。我还没有完全理解解决方案,我正在寻找适合 docker 和使用 nginx 的东西。
知道哪里出了问题吗?