gpt4 book ai didi

python - 获取 python docker 容器以与 redis docker 容器交互

转载 作者:IT王子 更新时间:2023-10-29 06:08:27 25 4
gpt4 key购买 nike

我是 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 实例交互并生成键值对:

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 ...

然后从 python 连接到 redis 只需使用 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 参数。在用户定义的桥接网络中,容器通过它们的名称相互联系。

关于python - 获取 python docker 容器以与 redis docker 容器交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54150125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com