首页 > 解决方案 > 无法在 Docker 中连接 NoSQLClient

问题描述

我在我的 Macbook 中运行 mongo 以及 mongoclient/mongoclient docker 服务。

➜  ~ docker ps 
CONTAINER ID        IMAGE                     COMMAND                  CREATED              STATUS              PORTS                      NAMES
40b69cb63c1d        mongoclient/mongoclient   "./entrypoint.sh nod…"   About a minute ago   Up About a minute   0.0.0.0:3000->3000/tcp     clever_golick
57ba76f4340f        mongo                     "docker-entrypoint.s…"   14 minutes ago       Up 14 minutes       0.0.0.0:27017->27017/tcp   cranky_villani

启动命令是:

docker run -p 3000:3000 -e MONGO_URL="mongodb://127.0.0.1:27017/pymongo_test" mongoclient/mongoclient

docker run -p 27017:27017 mongo

我访问 mongo 服务器,并可以在 Python 中使用 pymongo 添加一个集合

from pymongo import MongoClient   
mongo_client = MongoClient('mongodb://localhost:27017')
mongodb = mongo_client.pymongo_test
channel_table = mongodb.channel_table
data = {"col1":"something","col2":"something2"}
channel_table.insert_one(data)

我可以成功执行此 python,而不会出现任何 Mongo Connection 问题。我验证了数据是使用 Robo 3T ( https://robomongo.org/ ) 添加到 pymongotest DB 中的。

但是当我在 localhost:3000 上运行 mongoclient 时,我看不到任何正在添加的数据。mongo Image 里面的一些细节

➜  ~ docker exec -it eb265221846d bash
root@eb265221846d:/# printenv
HOSTNAME=eb265221846d
GPG_KEYS=E162F504A20CDF15827F718D4B7C549A058F8B6B
PWD=/
HOME=/root
GOSU_VERSION=1.11
MONGO_VERSION=4.2.2
MONGO_REPO=repo.mongodb.org
TERM=xterm
MONGO_PACKAGE=mongodb-org
SHLVL=1
MONGO_MAJOR=4.2
JSYAML_VERSION=3.13.0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/printenv

内部mongoclient/mongoclient图片:

➜  ~ docker exec -it 6674c0109b7b bash 
node@6674c0109b7b:/opt/meteor/dist/bundle$ printenv
NODE_VERSION=8.4.0
HOSTNAME=6674c0109b7b
TERM=xterm
INSTALL_MONGO=true
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/opt/meteor/dist/bundle
MONGO_URL=mongodb://127.0.0.1:27017/pymongo_test
APP_BUNDLE_DIR=/opt/meteor/dist
BUILD_SCRIPTS_DIR=/opt/build_scripts
ROOT_URL=http://localhost
SHLVL=1
HOME=/home/node
MONGOCLIENT_DEFAULT_CONNECTION_URL=
APP_SOURCE_DIR=/opt/meteor/src
MONGOCLIENT_CONNECTIONS_FILE_PATH=/opt/meteor/dist/predefined_connections.json
GOSU_VERSION=1.10
PORT=3000
_=/usr/bin/printenv

标签: pythonmongodbdockerterminalpymongo

解决方案


当您在 mongo 客户端中引用时,MONGO_URL="mongodb://127.0.0.1:27017/pymongo_test"它表示 mongo 客户端的本地主机,而不是 mongo 容器。

您需要 docker 网络,您可以使用 legacy 运行linking,但最好使用 docker-compose 来处理所有这些事情。

你可以试试这个

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

docker 为 mongo 撰写

并且在您的 python 应用程序中似乎它在容器之外运行,因此您可以使用 mongo 连接mongo_client = MongoClient('mongodb://localhost:27017'),但在容器中 localhost 表示这个容器。

您也可以尝试使用月光客户端。

services:
    mongodb:
      image: mongo:latest
      container_name: mongodb
      hostname: mongodb
      ports:
        - 27017:27017
    mongoclient:
      image: mongoclient/mongoclient:latest
      container_name: mongoclient
      hostname: mongoclient
      depends_on:
        - mongodb
      ports:
        - 3300:3000

推荐阅读