Mongodb 在docker中运行mongo DB命令时连接被拒绝

Mongodb 在docker中运行mongo DB命令时连接被拒绝,mongodb,docker,dockerfile,docker-machine,Mongodb,Docker,Dockerfile,Docker Machine,我是docker和mongoDB的新手,所以我想我错过了一些步骤。以下是我目前在Dockerfile中的内容: 来自python:2.7的 运行apt获取更新\ &&apt get安装-y mongodb\ &&rm-rf/var/lib/apt/lists/* 运行mkdir-p/data/db 运行服务mongodb启动 运行mongod--fork--logpath/var/log/mongodb.log 运行mongo db--eval'db.createUser({user:“dbus

我是docker和mongoDB的新手,所以我想我错过了一些步骤。以下是我目前在Dockerfile中的内容:

来自python:2.7的

运行apt获取更新\
&&apt get安装-y mongodb\
&&rm-rf/var/lib/apt/lists/*
运行mkdir-p/data/db
运行服务mongodb启动
运行mongod--fork--logpath/var/log/mongodb.log
运行mongo db--eval'db.createUser({user:“dbuser”,pwd:“dbpass”,角色:[“readWrite”,“dbAdmin”]})
在最后一个命令中连接失败:

错误:无法连接到src/mongo/shell/mongo.js:145上的服务器127.0.0.1:27017 异常:连接失败“”


如何才能成功连接?我是否应该更改主机/IP,以及更改为什么,在哪些命令中?

这里出现了一些问题。首先是您正在运行的命令:

RUN service mongodb start

RUN mongod --fork --logpath /var/log/mongodb.log
每一个都将运行以在docker中创建一个层。一旦运行的命令返回,启动的临时容器将停止,容器中更改的任何文件都将被捕获以创建新层。在这些命令之间没有持久的进程

这些命令还运行后台版本的启动命令。在docker中,您会发现这是一个问题,因为当您使用它作为容器的命令时,您会发现命令一完成,容器就死了。容器上的Pid 1与linux操作系统上的Pid 1具有相同的角色,一旦它消失,其他一切都会消失

我看到的第二个问题是将数据与容器混合在一起,即使用last RUN命令初始化数据库。这会失败,因为没有数据库在运行(请参见上文)。我建议您创建一个入口点来配置数据库(如果数据库尚不存在),然后在docker-compose.yml中或在
docker run
命令行中使用一个卷在容器之间持久化数据

如果必须将数据作为映像的一部分进行初始化,则可以尝试将各种命令合并到一次运行中:

RUN mongod --fork --logpath /var/log/mongodb.log \
 && mongo db --eval 'db.createUser({user:"dbuser",pwd:"dbpass",roles:["readWrite","dbAdmin"]})'

我想你误解了Dockerfiles的用途。 正如所指出的,一个

Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令

映像的整个概念是从映像中派生运行的容器,然后用数据填充并查询(对于数据库)或由外部容器/主机(对于web服务)或许多其他可能的用法调用

要回答您的问题,我假定:

  • 您希望使用mongo数据库来存储数据

  • 你有一些pyhton代码需要访问mongo

  • 您需要数据库中的一些初始数据

  • 为此:

  • 运行mongo数据库

    docker run——命名我的mongo-d mongo

    注意:不需要编写自定义图像。使用图像

  • 创建包含脚本的python图像

    a) 编写你的
    Dockerfile

    FROM python:3-alpine
    
    ADD my_script.py /
    
    RUN pip install any-dependency-you-might-need
    
    CMD [ "python", "./my_script.py" ]
    
    b) 编写您的
    my_script.py

  • 在这里插入您的应用程序内容。它将在python容器中执行。由于mongo将被链接,您可以使用s.th。像
    client=MongoClient('mongodb://mongo:27017/)
    开始

  • 运行python容器,并链接到mongo

    a) 构建它:

    docker build -t my-pyhthon-magic .
    
    b) 运行它:

    注意:此处的
    --link
    链接了一个名为my mongo的正在运行的容器,该容器将在
    my python magic
    -容器中作为
    mongo
    进行内部访问。这就是为什么您可以在python脚本中使用它


  • 我希望这对你有所帮助——如果我误解了你的意思,请毫不犹豫地提问或修改你的问题

    不要试图重新发明轮子。Mongo docker container在这里大家好,我是docker的新手,潜伏在论坛中解决我在容器链接和端口映射方面的问题。我上周读到--link不推荐使用/可能会过时。我听说过这种方法,另一种适用于docker新版本的方法是什么?资料来源:你完全正确。最好的方法是在版本2中使用
    docker compose
    。请查看此处的文档:。为了简化,我跳过了这里。
    docker run -d --name python-magic-container --link my-mongo:mongo my-python-magic