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 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
不幸的是 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 文件,不需要自定义图像。
我的 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 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
不幸的是 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 文件,不需要自定义图像。