我对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,因此任何有用的解释和/或解决方案都非常不错。
非常感谢