【问题标题】:Connect to Redis Docker container from Vagrant machine从 Vagrant 机器连接到 Redis Docker 容器
【发布时间】:2018-07-27 15:04:33
【问题描述】:

我们正在从 Vagrant 迁移到 Docker。

我们的首要目标是先将一些服务移出。在这种情况下,我试图在 docker 容器上托管一个 redis 服务器并从我的 vagrant 机器连接到它。

在 vagrant 机器上有一个托管 Laravel 应用程序的 apache2 网络服务器

这是我正在努力解决的连接部分,目前我有

Dockerfile.redis

FROM redis:3.2.12

RUN redis-server

docker-compose.yml(串联)

version: '3'
services:
   redis:
     build:
       context: .
          dockerfile: Dockerfile.redis
       working_dir: /opt
       ports:
         - "6379:6379"

我尝试了各种方式来连接这个:

尝试 1

在 Laravel 的配置中使用主机 ip 10.0.2.2。导致“连接被拒绝”

尝试 2

在 docker compose 中设置网络

redis:
  build:
    context: .
    dockerfile: Dockerfile.redis
  working_dir: /opt
  network:
    - app_net:
        ipv4_address: 172.16.238.10
  ports:
    - "6379:6379"

networks:
  app_net:
    driver: bridge
  ipam:
    driver: default
      - subnet: 172.16.238.0/24

这反而会导致超时。大多数解决方案似乎都需要在网络上配置网关,但这在 docker compose 3 中是不可配置的。有没有办法解决这个问题?

如果有人可以提供任何很棒的指导,那么大多数指南都会谈论以 vagrant 而非一个人的身份连接到 docker。

仅供参考 - 这是使用 Docker for Mac 和 docker compose 版本 3

【问题讨论】:

    标签: docker redis docker-compose vagrant


    【解决方案1】:

    我们能够完全使用 docker compose 来实现这一点,而根本没有用于 redis 的 dockerfile:

    redis:
      image: redis
      container_name: redis
      working_dir: /opt
      ports:
        - "6379:6379"
    

    一旦这样做,就可以使用 vagrant 文件从 vagrant 文件中连接到 redis

    redis-cli -h 10.0.2.2
    

    或者在 laravel 中如下,虽然我们使用环境变量来设置这些)

    'redis' => [
      'client' => 'phpredis',
      'default' => [
        'host'     => '10.0.2.2',
        'password' => null,
        'port'     => 6379,
        'database' => 0,
      ]
    ]
    

    【讨论】:

      【解决方案2】:

      您的 尝试 1 应该确实有效。当您创建服务而不定义网络时,docker-compose 会自动创建一个桥接网络。例如:

      当您对此运行 docker-compose up 时:

      version: '3'
      services:
        redis:
          build:
            context: .
            dockerfile: Dockerfile.redis
          working_dir: /opt
          ports:
            - "6379:6379"
      

      docker-compose 创建一个名为<project name>_default 的桥接网络,在我的例子中是docker_compose_test_default,如下所示:

      me@myshell:~/docker_compose_test $ docker network ls
      NETWORK ID          NAME                          DRIVER              SCOPE
      6748b1ea4b85        bridge                        bridge              local
      4601c6ea30c3        docker_compose_test_default   bridge              local
      80033acaa6e4        host                          host                local
      

      当您检查您的容器时,您可以看到已经为其分配了一个 IP:

      docker inspect e6b196f952af
      ...
              "Networks": {
                  "bridge": {
                      ...
                      "Gateway": "172.18.0.1",
                      "IPAddress": "172.18.0.2",
      

      然后您可以使用此 IP 从主机或您的 vagrant box 进行连接:

      me@myshell:~/docker_compose_test $ redis-cli -h 172.18.0.2 -p 6379
      172.18.0.2:6379> ping
      PONG
      

      【讨论】:

      • 您好,感谢您的建议。不幸的是,这只是在我的主机或流浪者的Connection Timeout 中解决,这可能是我的 redis 而不是 docker 的问题吗?
      • 容器中的 docker 日志是否显示 redis 正在运行并正在侦听所需的端口?
      • 在终端窗口中执行,我假设这显示的详细信息与日志相同
      • 你可能会遇到这个问题:*.com/questions/39216830/…
      • CTO 返回并在 5 分钟内解决此问题的乐趣哈哈。得到这个工作我会在下面发布解决方案