当前位置: 首页 > 面试题库 >

获取python docker容器与redis docker容器进行交互

姬向明
2023-03-14
问题内容

我对docker,redis和任何类型的网络都是陌生的(至少我了解python!)。首先,我想出了如何获取redis
docker映像并在docker容器中运行它:

docker run --name some-redis -d redis

据我了解,此Redis实例具有可用于连接其他容器的端口6379。

docker network inspect bridge

   "Containers": {
        "2ecceba2756abf20d5396078fd9b2ecf0d60ab04ca6b8df5e1b631b6fb5e9a85": {
            "Name": "some-redis",
            "EndpointID": "09f0069dae3632a2456cb4d82ad5e7c9782a2b58cb7a4ee655f57b5c410c3e87",
            "MacAddress": "02:42:ac:11:00:02",
            "IPv4Address": "172.17.0.2/16",
            "IPv6Address": ""
        }

如果运行以下命令,则可以与redis实例进行交互并生成key:value对:

docker run -it --link some-redis:redis --rm redis redis-cli -h redis -p 6379
set 'a' 'abc'
>OK
get 'a'
>"abc"
quit

我已经弄清楚如何制作并运行安装了redis库的docker容器,该容器将运行python脚本,如下所示:

这是我的Dockerfile:

FROM python:3
ADD redis_test_script.py /
RUN pip install redis 
CMD [ "python", "./redis_test_script.py" ]

这是redis_test_script.py:

import redis
print("hello redis-py")

构建docker映像:

docker build -t python-redis-py .

如果我运行以下命令,脚本将在其容器中运行:

docker run -it --rm --name pyRed python-redis-py

并返回预期的:

>hello redis-py

似乎两个容器都可以正常工作,问题是将它们都连接在一起,我想最终使用python对redis容器执行操作。如果我按以下方式修改脚本并为python容器重建图像,它将失败:

import redis
print("hello redis-py")
r = redis.Redis(host="localhost", port=6379, db=0)
r.set('z', 'xyz')
r.get('z')

我收到几个错误:

...
OSError: [Errno 99] Cannot assign requested address
...
redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.
.....

似乎他们没有连接,我在python脚本中使用网桥IP再次尝试:

r = redis.Redis(host="172.17.0.0/16", port=6379, db=0)

并得到这个错误:

redis.exceptions.ConnectionError: Error -2 connecting to 172.17.0.0/16:6379. Name or service not known.

我尝试了redis子IP:

r = redis.Redis(host="172.17.0.2/16", port=6379, db=0)

我得到这个错误:

redis.exceptions.ConnectionError: Error -2 connecting to 172.17.0.2/16:6379. Name or service not known.

感觉上我在根本上误解了如何使容器相互通信。我已经阅读了很多文档和教程,但是正如我所说,他们没有网络经验,并且以前没有使用过docker,因此任何有用的解释和/或解决方案都非常不错。

非常感谢


问题答案:

这就是有关Docker网络的全部内容。快速解决方案- host对两个容器都使用网络模式。缺点是隔离度低,但是您可以使其快速运行:

docker run -d --network=host redis ...
docker run --network=host python-redis-py ...

然后从连接pythonredis只使用localhost一个主机名。

更好的解决方案是使用docker用户定义的网桥网络

# create network
docker network create foo
docker run -d --network=foo --name my-db redis ...
docker run    --network=foo python-redis-py ...

请注意,在这种情况下,您 不能 使用主机名,localhost只能 使用my-db主机名。这就是为什么我--name my- db在启动第一个容器时使用参数的原因。在用户定义的网桥网络中,容器通过其名称相互访问。



 类似资料:
  • 问题内容: 我建立了一个kafka docker容器并使用docker-compose对其进行编排。 打电话给我下面的putput: 我可以从docker容器内部运行生产者和使用者,但是不能在docker网络外部运行。 例如 : 我在本地主机上运行kafka生产者,出现以下错误: 这是我在github上的kafka docker示例,其中包含上述问题。 那么,有人遇到同样的问题并且可以以任何方式帮

  • 问题内容: 从容器名称获取docker容器ID的命令是什么? 问题答案: 在Linux中: 或在OS X,Windows中: 您的容器名称在哪里。 如@llia Sidorenko所述,为避免产生误报,您可以使用正则表达式锚点,如下所示: 说明: 为了安静。仅输出ID 对所有人。即使您的容器未运行也能正常工作 用于过滤器。 容器名称必须以该字符串 开头 容器名称必须 结束 这个字符串

  • 如何使用PHP在容器本身中获取Docker容器ID? 我刚刚发现linux命令如下:

  • 从容器名称中获取Docker容器id的命令是什么?

  • 我对javaee/EJB比较陌生,我已经读了很多关于javaee容器的书。我有使用web容器(JBoss中的WAR文件)的经验。我还知道JBoss也可以用作JavaEE容器。 JavaEE容器和Web容器之间的区别是什么? 我知道JavaEE也能够包含一个。战争档案。它们不同吗?它们的区别是什么?是否有特定于供应商的偏好,哪一个更好?

  • > 我正试图弄清楚Kubernetes中的网络,尤其是多集装箱吊舱的处理。在我的简单场景中,我总共有3个豆荚。其中一个有两个容器,另一个只有一个容器,它希望与多容器吊舱中的特定容器通信。我想弄清楚kubernetes如何处理此类容器之间的通信。 为此,我在一个“sidecar体系结构”中有一个简单的多容器吊舱,YAML文件如下所示: > 我想用这个YAML文件实现的是,在pod“nginx”中,有