无法从Mac主机连接到Docker容器内自定义端口运行的Redis
首先明确回答你的第一个问题:完全可以将Docker容器的Redis映射到自定义端口(比如6380),你遇到的连接问题是因为端口映射的顺序搞反了。
Docker端口映射的核心规则
Docker的-p参数格式是 主机端口:容器端口,简单来说:
- 冒号左边是你本地主机要对外开放的端口
- 冒号右边是容器内部Redis服务实际监听的端口(Redis默认是6379)
你的错误分析
你用的启动命令是:
docker run --name redis -d -p 6379:6380 --network mynetwork redis:5.0.6-alpine
这个命令的意思是:把主机的6379端口映射到容器的6380端口。但容器里的Redis默认只会监听6379端口,容器的6380端口根本没有服务在运行;同时你想要连接的主机6380端口也没有被Docker做任何映射配置,所以执行redis-cli -p 6380时自然会出现连接拒绝的错误。
看你docker ps的输出也能印证这一点:
PORTS NAMES
6379/tcp, 0.0.0.0:6379->6380/tcp redis
这里显示的是主机6379映射到容器6380,完全不是你想要的“用主机6380访问容器Redis”的配置。
正确的解决方法
如果想通过主机的6380端口连接容器内的Redis,只需要调整端口映射的顺序,把6380放在冒号左边(主机端口),容器的默认6379放在右边:
docker run --name redis -d -p 6380:6379 --network mynetwork redis:5.0.6-alpine
启动后再用docker ps查看,PORTS列会显示:
0.0.0.0:6380->6379/tcp, 6379/tcp
这时候再执行redis-cli -p 6380,就能正常连接到容器内的Redis服务了。
另外补充:你之前停止本地Redis后映射到6379能成功,是因为那时候你应该是用了-p 6379:6379的配置(主机和容器端口一致),这时候redis-cli默认连接6379端口就能命中容器内的服务。
内容的提问来源于stack exchange,提问作者Linus

