docker redis:打开 Unix 套接字失败:绑定:地址正在使用

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

我正在尝试为

redis
创建一个 Docker 容器。我希望其他服务使用 Unix 套接字而不是 TCP/IP 套接字连接到此容器。

这是我的

docker-compose.yml
文件:

services:
  redis:
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    container_name: redis
    image: redis:alpine
    restart: unless-stopped
    volumes:
      - ./conf:/usr/local/etc/redis
      - /var/run/redis.sock:/var/run/redis.sock

redis.conf
文件中我启用了 Unix 套接字:

unixsocket /var/run/redis.sock
unixsocketperm 700

当我尝试启动容器时,出现此错误:

打开 Unix 套接字失败:绑定:地址正在使用

我的机器上还没有运行任何 Redis 实例。

我见过一些解决方案,它们使用第二个容器来保存 Unix 套接字,然后使用 docker 卷共享它,例如 这个

services:
    tmp:
        image: busybox
        command: chmod -R 777 /tmp/docker
        volumes:
            - /tmp/docker/    
    redis:
        image: redis
        command: redis-server /etc/redis.conf
        volumes:
            - /redis/redis.conf:/etc/redis.conf
        volumes_from:
            - tmp

我还没有尝试过这个解决方案,但无论如何我想避免这个额外的容器并简单地在 Docker 主机上公开 Unix 套接字。

docker redis
1个回答
0
投票

经过一番挖掘,我能够解决这个问题。

docker-compose.yml
对于 Redis 容器:

services:
  redis:
    # create a directory for the UDS and start Redis using the config file
    command: [
      "/bin/sh", "-c",
      "mkdir -p /var/run/redis && chown -R redis /var/run/redis && redis-server /usr/local/etc/redis/redis.conf"
    ]
    container_name: redis
    image: redis:${REDIS_VERSION}-alpine
    volumes:
      - ./conf:/usr/local/etc/redis
      - redis_socket:/var/run/redis

# create a Docker volume for the Redis UDS
volumes:
  redis_socket:
    name: redis_socket

这是相关的 Docker compose 配置,使另一个容器(例如 Nextcloud)能够使用其 UDS 与 Redis 通信:

services:
 nextcloud:
    container_name: nextcloud
    environment:
      - REDIS_HOST=/var/run/redis/redis.sock
      - REDIS_HOST_PORT=0
    image: nextcloud:${NEXTCLOUD_VERSION}-fpm-alpine
    volumes:
      - redis_socket:/var/run/redis

volumes:
  redis_socket:
    external: true
© www.soinside.com 2019 - 2024. All rights reserved.