python - 无法在 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
解决方案
当您在 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
并且在您的 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
推荐阅读
- html - 粗体标签导致行跳出 div
- python - 我应该如何使用 Scapy 将魔术包发送到我的无人机?
- sql-server - 访问被拒绝 CREATE DATABASE LocalDB
- grafana - 将度量值从数字转换为字符串
- django - 如何根据按钮对对象列表进行排序
- python - 如何使用键盘模块输入特殊字符?
- tensorflow - 安装了多个版本的 CUDA 后,如何让 Tensorflow-GPU 在 Windows 上使用特定版本的 CUDA
- java - 在 Java 中使用 Gson 解析来自 HTTP 请求的 JSON 响应
- asp.net - 事件不会触发动态添加的控制
- ruby-on-rails - 我的 Rails 应用程序开始在一些随机查询中引发 ActiveRecord::ImmutableRelation