use*_*260 8 python containers redis docker
我对 docker、redis 和任何类型的网络都很陌生(至少我知道 python!)。首先,我已经弄清楚如何获取 redis docker 映像并在 docker 容器中运行它:
docker run --name some-redis -d redis
Run Code Online (Sandbox Code Playgroud)
据我了解,这个 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": ""
}
Run Code Online (Sandbox Code Playgroud)
如果我运行以下命令,我可以与 redis 实例交互并生成键:值对:
docker run -it --link some-redis:redis --rm redis redis-cli -h redis -p 6379
set 'a' 'abc'
>OK
get 'a'
>"abc"
quit
Run Code Online (Sandbox Code Playgroud)
我已经弄清楚如何制作和运行安装了 redis 库的 docker 容器,该容器将运行 python 脚本,如下所示:
这是我的 Dockerfile:
FROM python:3
ADD redis_test_script.py /
RUN pip install redis
CMD [ "python", "./redis_test_script.py" ]
Run Code Online (Sandbox Code Playgroud)
这是redis_test_script.py:
import redis
print("hello redis-py")
Run Code Online (Sandbox Code Playgroud)
构建 Docker 镜像:
docker build -t python-redis-py .
Run Code Online (Sandbox Code Playgroud)
如果我运行以下命令,脚本将在其容器中运行:
docker run -it --rm --name pyRed python-redis-py
Run Code Online (Sandbox Code Playgroud)
并返回预期的结果:
>hello redis-py
Run Code Online (Sandbox Code Playgroud)
看起来两个容器都工作正常,问题是将它们连接在一起,我想最终使用 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')
Run Code Online (Sandbox Code Playgroud)
我收到几个错误:
...
OSError: [Errno 99] Cannot assign requested address
...
redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.
.....
Run Code Online (Sandbox Code Playgroud)
看起来它们没有连接,我再次尝试在 python 脚本中使用桥接 IP:
r = redis.Redis(host="172.17.0.0/16", port=6379, db=0)
Run Code Online (Sandbox Code Playgroud)
并得到这个错误:
redis.exceptions.ConnectionError: Error -2 connecting to 172.17.0.0/16:6379. Name or service not known.
Run Code Online (Sandbox Code Playgroud)
我尝试了redis子IP:
r = redis.Redis(host="172.17.0.2/16", port=6379, db=0)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
redis.exceptions.ConnectionError: Error -2 connecting to 172.17.0.2/16:6379. Name or service not known.
Run Code Online (Sandbox Code Playgroud)
感觉就像我从根本上误解了如何让容器相互交谈。我读过很多文档和教程,但正如我所说,没有网络经验,也没有使用过 docker,所以任何有用的解释和/或解决方案都会很棒。
非常感谢
这就是 Docker 网络的全部内容。快速解决方案 -host对两个容器都使用网络模式。缺点是隔离度低,但你会让它快速工作:
docker run -d --network=host redis ...
docker run --network=host python-redis-py ...
Run Code Online (Sandbox Code Playgroud)
然后连接 frompython仅用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 ...
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下您不能使用localhost,而是用作my-db主机名。这就是为什么我--name my-db在启动第一个容器时使用参数。在用户定义的桥接网络中,容器通过名称相互访问。