我的 Redis 容器在 docker_compose.yml 文件中被定义为标准镜像。
redis:
image: redis
ports:
- "6379"
我猜它正在使用标准设置,比如将Redis绑定到本地主机。 我需要将它绑定到0.0.0.0,有没有办法添加一个本地的redis.conf文件来改变绑定并让docker-compose使用它?
感谢任何技巧...
我的 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"
或者,基于redis镜像创建一个新的镜像,并将你的配置文件复制进去。完整的说明在:https://registry.hub.docker.com/_/redis/
然而,默认情况下,redis镜像绑定的是0.0.0.0
。要从主机访问它,你需要使用Docker为你映射到主机的端口,你可以使用docker ps
或者docker 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
Volumes
中指定绝对路径映射更加安全,像这样:`volumes:很不幸,使用Docker时,Redis配置文件变得有点棘手,而被投票选为最佳答案的回答(我敢肯定是来自那些实际上并没有测试过的人)是不起作用的。
但是这个方法确实有效,快速且不费力:
command: redis-server --bind redis-container-name --requirepass some-long-password --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes
你可以在yaml docker文件的命令部分传递所有变量选项,只需在其前面添加“--”,后跟变量值即可。docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis
(用于验证正在运行的容器的内部IP地址),那么就像Docker所说的那样,该命令将被内部转换为类似以下内容:redis-server --bind 172.19.0.5 --requirepass some-long-password --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes
requirepass some-long-password
是一个很大的安全问题。ps
命令会列出你的密码,而 redis-cli
甚至会有一个警告,指出密码已经暴露了 *"Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe."*。在生产环境中一定要使用 redis.conf
。 - Christos Lytras基于David的回答,但更符合"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
bind cache
或bind [your-container-name]
。 - bessa3301/usr/local/etc/redis/redis.conf
redis-server
redis:
image: redis:7.0.4-alpine
restart: unless-stopped
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
########################################
# or using command if mount not work
########################################
command: >
redis-server --bind 127.0.0.1
--appendonly no
--save ""
--protected-mode yes
这是一个老问题,但我有一个看起来很优雅的解决方案,我不需要每次执行命令 ;).
1. 创建 Dockerfile:
#/bin/redis/Dockerfile
FROM redis
CMD ["redis-server", "--include /usr/local/etc/redis/redis.conf"]
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
redis:
container_name: redis
hostname: redis
image: redis
command: >
--include /usr/local/etc/redis/redis.conf
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
在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
它运行良好。