连接到在 nginx 代理后面的 docker 上运行的 mongodb 副本集

连接到在 nginx 代理后面的 docker 上运行的 mongodb 副本集

我正在使用 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 的东西。

知道哪里出了问题吗?

相关内容