当前位置:   article > 正文

docker容器间的通信【连接MongoDB数据库】_docker 连接mongodb没有数据

docker 连接mongodb没有数据

docker容器间的通信【连接MongoDB数据库

本文出自于个人博客Potato Blog,欢迎访问!本文原地址参考docker容器间的通信【连接MongoDB数据库】
官方文档参考地址1、docker官方文档 2、hub.docker中mongo镜像

最近全面转型在docker容器中进行开发,但开发时遇见以下问题——“数据库 将在哪里运行?安装在同一个容器中还是单独运行?” 一般来说,每个容器都应该做一件事,并且做好。针对上面遇到的问题,来解决docker多容器连接。【官方解释】

默认情况下,容器是独立运行的,并且对同一台机器上的其他进程或容器一无所知。那么,我们如何让一个容器与另一个容器通信呢?答案是网络(network)

接下来我们便准备容器之间需要的条件。

1、创建network

docker network create todo-mongo    
  • 1

2、准备MongoDB数据库容器

如果想要本地连接docker下的mongodb数据库。可参考Docker连接MongoDB数据库。但现在是容器之间的通信,故需要以下配置。

创建容器

docker run -d --network toto-mongo -p 27066:27017 --name some-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret mongo
  • 1
-i 交互式操作。
-t 终端。
-d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
--network toto-mongo  网络(network)的名称
-p 27066:27017  #端口映射  27066:如果希望本地能访问数据数据时的端口号 27017:mongodb内部端口默认都是27017
--name some-mongo 容器的名称
-v C:\Users\12241\OneDrive\mogodata\data  #mongodb数据持久化存放的位置
/data/db #mongodb容器内部的数据目录 不用修改
-e 设置环境变量
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin 连接mongodb的用户名
-e MONGO_INITDB_ROOT_PASSWORD=secret   连接mongodb的密码
mongo:镜像名称
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果没有拉取mongo镜像,会自动拉取mongo镜像。

3、准备另一个容器用于连接MongoDB

本例中以python程序测试连接另一个容器的数据库。

创建一个容器

docker run -itd --network todo-mongo --name testmongo python:3.9.12 /bin/bash 
  • 1
-i 交互式操作。
-t 终端。
-d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
--network toto-mongo  网络(network)的名称
--name 容器的名称
python:3.9.12: python镜像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

当然也可以使用 -v 将容器挂载到本地

设置容器自动启动,每次就不用手动启动数据库容器啦 (可选设置,看自己需求)

docker update --restart=always <CONTAINER ID>
  • 1

4、 测试

经过前3步两个容器之间已经能通信了。为了确保通信是否成功,我们需要验证一下。

使用vscode进入第三步创建的容器,新建一个test.py文件用来测试能否连接mongodb数据库。代码如下:

#test.py
import pymongo
 
myclient = pymongo.MongoClient("mongodb://mongoadmin:secret@172.24.0.1:27066/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
 
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }
 
x = mycol.insert_one(mydict) 
print(x)
print(x)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出:
在这里插入图片描述

进入本地的客户端,可以看到数据以存到了数据库。如何连接本地数据库查看[docker连接本地数据库]
在这里插入图片描述

为什么test.py文件连接的容器的地址是172.24.0.1:27066,而本地连接docker中的数据库是localhost:27066呢?
其实在本节开始时就说了,容器之间是相互独立,想要容器之间相互通信,要建立网络(network),使两个容器可以相互通信。而此时网络的作用就相当于一个网关,起到两个容器之间通信。(网关可以自行百度,不做过多的介绍
)。那如何查看网络(network)的网关呢?输入如下代码:

docker network inspect todo-mongo 
  • 1

todo-mongo的详细信息,我们便可以查看网关的信息
在这里插入图片描述
而本地连接为什么又可以是localhost:27066呢?其实在我们第2步创建mongo容器时,对外的ip和端口是 0.0.0.0:27066,查看容器信息:

docker ps -a
  • 1

在这里插入图片描述
此时便可查看。当然,你不输localhost:27066也可以,你也可以输入127.0.0.2:27066也能本地连接docker容器,前提是端口号不能输错!!!!

5、结论

经过上面的步骤,即可实现容器之间的相互通信。当然也可使用docker-compose实现容器之间的通信,该方法本节中不做介绍,具体可参考本人写的另一篇文章docker容器间的通信【使用docker-compose】,此外也可以参考docker的官方文档docker-compose

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/388853
推荐阅读
相关标签
  

闽ICP备14008679号