我正在尝试为
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-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