在docker上本地访问redis - docker compose

问题描述 投票:0回答:1

我有两个容器,redis和web。我正在尝试从web访问redis容器。什么都行不通。下面是我的docker撰写文件

version: '3.7'
services:
  redis:
    image: redis:alpine
    restart: always
    ports:
      - "6379"
    volumes:
      - /private/var/www/redis:/var/www/redis
    network_mode: host
  web:
    build:
      context: web
      dockerfile: Dockerfile
    depends_on:
      - redis
    ports:
      - "127.0.0.1:80:80"
      - "127.0.0.1:443:443"
      - "127.0.0.1:22:22"
    volumes:
      - /private/var/www/:/var/www/
    networks:
      - docker_web_network

networks:
  docker_web_network:
    driver: bridge
    ipam:
      driver: default
      config:
         - subnet: 162.18.1.0/16

当我在网络容器中运行redis-cli时,我得到了Could not connect to Redis at 127.0.0.1:6379: Connection refused

Docker容器

Vs-MacBook-Pro:docker vn$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
36ca1b626a68        docker_web          "/bin/sh -c '/usr/sb…"   2 hours ago         Up 2 hours          127.0.0.1:22->22/tcp, 127.0.0.1:80->80/tcp, 127.0.0.1:443->443/tcp   docker_web_1
d6191f39385a        redis:alpine        "docker-entrypoint.s…"   2 hours ago         Up 2 hours                                                                               docker_redis_1

redis cli

root@36ca1b626a68:/var/www# redis-cli -h docker_redis_1 ping
Could not connect to Redis at docker_redis_1:6379: Name or service not known
docker redis docker-compose
1个回答
1
投票

在docker容器中使用localhost是无效的,因为localhost意味着容器是他自己的容器所以如果你从web容器中运行redis-cli,redis-cli试图在web容器中找到redis而不是redis容器。

你需要指定redis服务名称 - docker(docker-compose的网络更具体)将为你的服务名称解析为redis的容器IP,所以你应该使用:

redis-cli -h redis ping

预期产量是:

PONG

编辑:

只有当两个服务使用相同的网络模式时,该答案才有效,因此有两种方式:

  1. 将network_mode:host添加到Web服务,然后redis的“localhost”就可以了
  2. 从redis中删除network_mode:host,然后“redis”域就可以了
© www.soinside.com 2019 - 2024. All rights reserved.