docker容器间的通信【连接MongoDB数据库】
官方文档参考地址1、docker官方文档 2、hub.docker中mongo镜像
最近全面转型在docker容器中进行开发,但开发时遇见以下问题——“数据库 将在哪里运行?安装在同一个容器中还是单独运行?” 一般来说,每个容器都应该做一件事,并且做好。针对上面遇到的问题,来解决docker多容器连接。【官方解释】
默认情况下,容器是独立运行的,并且对同一台机器上的其他进程或容器一无所知。那么,我们如何让一个容器与另一个容器通信呢?答案是网络(network)
接下来我们便准备容器之间需要的条件。
1、创建network
docker network create todo-mongo
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
-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:镜像名称
如果没有拉取mongo镜像,会自动拉取mongo镜像。
3、准备另一个容器用于连接MongoDB
本例中以python程序测试连接另一个容器的数据库。
创建一个容器
docker run -itd --network todo-mongo --name testmongo python:3.9.12 /bin/bash
-i 交互式操作。
-t 终端。
-d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec
--network toto-mongo 网络(network)的名称
--name 容器的名称
python:3.9.12: python镜像
当然也可以使用 -v 将容器挂载到本地
设置容器自动启动,每次就不用手动启动数据库容器啦 (可选设置,看自己需求)
docker update --restart=always <CONTAINER ID>
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)
输出:
进入本地的客户端,可以看到数据以存到了数据库。如何连接本地数据库查看[docker连接本地数据库]
为什么test.py文件连接的容器的地址是172.24.0.1:27066,而本地连接docker中的数据库是localhost:27066呢?
其实在本节开始时就说了,容器之间是相互独立,想要容器之间相互通信,要建立网络(network),使两个容器可以相互通信。而此时网络的作用就相当于一个网关,起到两个容器之间通信。(网关可以自行百度,不做过多的介绍)。那如何查看网络(network)的网关呢?输入如下代码:
docker network inspect todo-mongo
todo-mongo的详细信息,我们便可以查看网关的信息
而本地连接为什么又可以是localhost:27066呢?其实在我们第2步创建mongo容器时,对外的ip和端口是 0.0.0.0:27066,查看容器信息:
docker ps -a
此时便可查看。当然,你不输localhost:27066也可以,你也可以输入127.0.0.2:27066也能本地连接docker容器,前提是端口号不能输错!!!!
5、结论
经过上面的步骤,即可实现容器之间的相互通信。当然也可使用docker-compose实现容器之间的通信,该方法本节中不做介绍,此外也可以参考docker的官方文档docker-compose。