我对docker,redis和任何类型的网络都是陌生的(至少我了解python!)。首先,我想出了如何获取redis docker映像并将其在docker容器中运行:
I'm new to docker, redis and any kind of networking, (I know python at least!). Firstly I have figured out how to get a redis docker image and run it in a docker container:
docker run --name some-redis -d redis据我了解,此redis实例具有可用于连接其他容器的端口6379。
As I understand this redis instance has port 6379 available to connect to other containers.
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对:
If I run the following command I can interact with the redis instance and generate key:value pairs:
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脚本,如下所示:
I have figured out how to make and run a docker container with the redis library installed that will run a python script as follows:
此处是我的Dockerfile:
Here is my Dockerfile:
FROM python:3 ADD redis_test_script.py / RUN pip install redis CMD [ "python", "./redis_test_script.py" ]这里是redis_test_script。 py:
Here is redis_test_script.py:
import redis print("hello redis-py")构建docker镜像:
Build the docker image:
docker build -t python-redis-py .如果我运行以下命令,脚本将在其容器中运行:
If I run the following command the script runs in its container:
docker run -it --rm --name pyRed python-redis-py并返回预期值:
>hello redis-py似乎两个容器都可以正常工作,问题是将两个容器连接在一起,我想最终使用python在redis容器上执行操作。如果我按如下所示修改脚本并为python容器重建图像,则会失败:
It seems like both containers are working ok, the problem is connecting them both together, I would like to ultimately use python to perform operation on the redis container. If I modify the script as follows and rebuild the image for the python container it fails:
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:
It looks like they're not connecting, I tried again using the bridge IP in the python script:
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:
and I tried the redis sub 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,所以任何有用的解释和/或解决方案都非常不错。
It feels like I'm fundamentally misunderstanding something about how to get the containers to talk to each other. I've read quite a lot of documentation and tutorials but as I say have no networking experience and have not previously used docker so any helpful explanations and/or solutions would be really great.
非常感谢
推荐答案与Docker网络有关。快速解决方案-两个容器都使用 host 网络模式。缺点是隔离度低,但是您可以使它快速运行:
That's all about Docker networking. Fast solution - use host network mode for both containers. Drawback is low isolation, but you will get it working fast:
docker run -d --network=host redis ... docker run --network=host python-redis-py ...然后从 python 连接到 redis 只需使用 localhost 作为主机名
Then to connect from python to redis just use localhost as a hostname.
更好的解决方案是使用docker用户定义的桥接网络
Better solution is to use docker user-defined bridge network
# 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 参数的原因。在用户定义的桥网络中,容器通过其名称相互访问。
Note that in this case you cannot use localhost but instead use my-db as a hostname. That's why I've used --name my-db parameter when starting first container. In user-defined bridge networks containers reach each other by theirs names.
更多推荐
获取python docker容器与redis docker容器进行交互
发布评论