Docker-compose ,无论如何要指定一个 redis.conf 文件?

Docker-compose , anyway to specify a redis.conf file?

我的 redis 容器被定义为我 docker_compose.yml

中的标准图像
redis:  
  image: redis
  ports:
    - "6379"

我猜它正在使用标准设置,例如在本地主机上绑定到 Redis 我需要将它绑定到 0.0.0.0,是否可以添加本地 redis.conf 文件来更改绑定并让 docker-compose 知道?

感谢任何技巧...

是的。只需将您的 redis.conf 挂载到默认卷上:

redis:  
  image: redis
  volumes:
    - ./redis.conf:/usr/local/etc/redis/redis.conf
  ports:
    - "6379"

或者,根据复制了您的 conf 文件的 redis 映像创建一个新映像。完整说明位于:https://registry.hub.docker.com/_/redis/

但是,默认情况下,redis 图像确实绑定到 0.0.0.0。要从主机访问它,您需要使用 Docker 映射到您使用 docker psdocker port 命令找到的主机的端口,然后您可以访问它在 localhost:32678,其中 32678 是映射端口。或者,您可以在 docker-compose.yml.

中指定要映射到的特定端口

由于您似乎是 Docker 的新手,所以如果您从使用原始 Docker 命令开始而不是从 Compose 开始,这可能会更有意义。

老问题,但如果有人仍然想这样做,可以使用卷和命令:

command: redis-server /usr/local/etc/redis/redis.conf
volumes:
 - ./redis/redis.conf:/usr/local/etc/redis/redis.conf

不幸的是 Docker,当涉及到 Redis 配置文件时,事情变得有点棘手,并且答案被评为最佳(我确信来自没有实际测试它的人)它不起作用。

但真正有效、快速、轻松的是:

 command: redis-server --bind redis-container-name --requirepass some-long-password --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes

你可以在yaml docker文件的命令部分传递你想要的所有变量选项,方法是在它的前面添加“--”,然后是变量值。

永远不要忘记设置密码,如果可能的话关闭端口 6379。

稍后谢谢我。

PS:如果您在命令中注意到,我没有使用典型的 127.0.0.1,而是使用了 redis 容器名称。这样做是因为 docker 通过它的嵌入式 dns 服务器在内部分配 ip 地址。换句话说,这个绑定地址变成了动态的,因此增加了一层额外的安全性。

如果你的redis容器叫"redis",你执行命令docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis(验证运行容器的内部ip地址),只要docker是关心的是,在 docker 文件中给出的命令将在内部被翻译成类似这样的东西:redis-server --bind 172.19.0.5 --requirepass some-long-password --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes

这是一个老问题,但我有一个看起来很优雅的解决方案,而且我不必每次都执行命令 ;)。

1 像这样创建您的 docker 文件

#/bin/redis/Dockerfile
FROM redis
CMD ["redis-server", "--include /usr/local/etc/redis/redis.conf"]

我们正在做的是告诉服务器将该文件包含在 Redis 配置中。您在此处键入的设置将覆盖 Redis 的默认设置。

2 创建您的 docker-compose

redisall:
      build:
        context: ./bin/redis
      container_name: 'redisAll'
      restart: unless-stopped
      ports:
        - "6379:6379"
      volumes:
        - ./config/redis:/usr/local/etc/redis

3 创建配置文件,其名称必须与 Dockerfile 相同

//config/redis/redis.conf
requirepass some-long-password
appendonly yes

################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 loopback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.*
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1

 // and all configurations that can be specified
 // what you put here overwrites the default settings that have the
 container

我在docker环境下使用Redis时遇到同样的问题,Redis无法将数据保存到dump.rdb上的磁盘。 问题是 Redis 无法读取配置 redis.conf ,我通过使用 docker 中的命令发送所需的配置来解决它 compose 如下:

redis19:
   image: redis:5.0
   restart: always
   container_name: redis19
   hostname: redis19
   command: redis-server --requirepass some-secret  --stop-writes-on-bgsave-error no --save 900 1 --save 300 10 --save 60 10000


volumes:
  - $PWD/redis/redis_data:/data
  - $PWD/redis/redis.conf:/usr/local/etc/redis/redis.conf
  - /etc/localtime:/etc/localtime:ro

而且效果很好。

基于 David awnser 但更“Docker Compose”的方式是:

redis:
  image: redis:alpine
    command: redis-server --include /usr/local/etc/redis/redis.conf
    volumes:
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf

这样,您通过 docker-compose.yml 文件包含 .conf 文件,不需要自定义图像。