2019独角兽企业重金招聘Python工程师标准>>>
1,宿主机器上创建目录 (前两个目录主、从机器都需要)
mkdir -p /storage/docker/redis/datafile mkdir -p /storage/docker/redis/log mkdir /root/build_redis |
---|
2,编写Dockerfile
cd /root/build_redis vi Dockerfile |
---|
如下内容:
FROM ubuntu:latest # add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r redis && useradd -r -g redis redis RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates \ wget \ && rm -rf /var/lib/apt/lists/* # grab gosu for easy step-down from root ENV GOSU_VERSION 1.7 RUN set -x \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \ && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \ && export GNUPGHOME="$(mktemp -d)" \ && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \ && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \ && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \ && chmod +x /usr/local/bin/gosu \ && gosu nobody true ENV REDIS_VERSION 3.2.8 ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.2.8.tar.gz ENV REDIS_DOWNLOAD_SHA1 6780d1abb66f33a97aad0edbe020403d0a15b67f # for redis-sentinel see: http://redis.io/topics/sentinel RUN set -ex \ \ && buildDeps=' \ gcc \ libc6-dev \ make \ ' \ && apt-get update \ && apt-get install -y $buildDeps --no-install-recommends \ && rm -rf /var/lib/apt/lists/* \ \ && wget -O redis.tar.gz "$REDIS_DOWNLOAD_URL" \ && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - \ && mkdir -p /usr/src/redis \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ && rm redis.tar.gz \ \ # Disable Redis protected mode [1] as it is unnecessary in context # of Docker. Ports are not automatically exposed when running inside # Docker, but rather explicitely by specifying -p / -P. # [1] https://github.com/antirez/redis/commit/edd4d555df57dc84265fdfb4ef59a4678832f6da && grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 1$' /usr/src/redis/src/server.h \ && sed -ri 's!^(#define CONFIG_DEFAULT_PROTECTED_MODE) 1$!\1 0!' /usr/src/redis/src/server.h \ && grep -q '^#define CONFIG_DEFAULT_PROTECTED_MODE 0$' /usr/src/redis/src/server.h \ # for future reference, we modify this directly in the source instead of just supplying a default configuration flag because apparently "if you specify any argument to redis-server, [it assumes] you are going to specify everything" # see also https://github.com/docker-library/redis/issues/4#issuecomment-50780840 # (more exactly, this makes sure the default behavior of "save on SIGTERM" stays functional by default) \ && make -C /usr/src/redis \ && make -C /usr/src/redis install \ \ && rm -r /usr/src/redis \ \ && apt-get purge -y --auto-remove $buildDeps RUN mkdir /data && chown redis:redis /data VOLUME /data WORKDIR /data COPY docker-entrypoint.sh /usr/local/bin/ RUN chmod 755 /usr/local/bin/docker-entrypoint.sh ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] EXPOSE 6379 CMD [ "redis-server" ] |
---|
3,编写docker-entrypoint.sh:
#!/bin/sh set -e # first arg is `-f` or `--some-option` # or first arg is `something.conf` if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then set -- redis-server "$@" fi # allow the container to be started with `--user` if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then chown -R redis . exec gosu redis "$0" "$@" fi exec "$@" |
---|
4,创建redis镜像
将上述Dockerfile和docker-entrypoint.sh放到同样路径下,执行 docker build -t redis . |
---|
5,编辑redis master端的配置参数文件(说明:这里设置的默认密码是redis1234,按需修改。 从库的设置也一样。)
vi /storage/docker/redis/redis_master.conf daemonize no pidfile /var/run/redis.6379.pid port 6379 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 # unixsocket /data/datafile/redis.sock # unixsocketperm 755 timeout 300 tcp-keepalive 60 loglevel notice logfile /data/log/redis.log # syslog-enabled no # syslog-ident redis # syslog-facility local0 databases 16 # save "" # save 900 1 # save 300 10 # save 60 10000 stop-writes-on-bgsave-error no rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data/datafile # slaveof <masterip> <masterport> # masterauth <master-password> masterauth redis1234 slave-serve-stale-data yes slave-read-only yes # repl-ping-slave-period 10 repl-timeout 600 repl-disable-tcp-nodelay no repl-backlog-size 64mb # repl-backlog-ttl 3600 slave-priority 100 # min-slaves-to-write 3 # min-slaves-max-lag 10 requirepass redis1234 # rename-command CONFIG "" maxclients 10000 maxmemory 4G maxmemory-policy noeviction # maxmemory-samples 3 appendonly no # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 1024mb lua-time-limit 5000 slowlog-log-slower-than 20000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 8192mb 4096mb 600 client-output-buffer-limit pubsub 32mb 8mb 60 aof-rewrite-incremental-fsync yes # include /path/to/local.conf # include /path/to/other.conf |
---|
6,启动redis主实例(说明:我们应用端连接的是宿主机器ip+6401端口,安全起见,不建议使用默认端口6379)
docker run --name m_redis -v /storage/docker/redis:/data -p 6401:6379 -d redis redis-server /data/redis_master.conf |
---|
7,在主库宿主机将redis镜像save,传输到从库宿主机器然后load进去
主库宿主机器: docker save -o redis.image redis scp redis.image core@192.168.17.62:/tmp/. ssh登录从库宿主机器: docker load -i /tmp/redis.image |
---|
8,编辑redis slave端的配置参数文件(说明:从库开启bgsave和aof,主库不开。)
vi /storage/docker/redis/redis_slave.conf daemonize no pidfile /var/run/redis.6379.pid port 6379 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 # unixsocket /data/datafile/redis.sock # unixsocketperm 755 timeout 300 tcp-keepalive 60 loglevel notice logfile /data/log/redis.log # syslog-enabled no # syslog-ident redis # syslog-facility local0 databases 16 # save "" save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error no rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data/datafile slaveof MASTERIP 6379 masterauth redis1234 slave-serve-stale-data yes slave-read-only yes repl-ping-slave-period 10 repl-timeout 600 repl-disable-tcp-nodelay no repl-backlog-size 64mb repl-backlog-ttl 3600 slave-priority 100 # min-slaves-to-write 3 # min-slaves-max-lag 10 requirepass redis1234 # rename-command CONFIG "" # maxclients 10000 maxmemory 4G maxmemory-policy noeviction # maxmemory-samples 3 appendonly yes # appendfsync always appendfsync everysec # appendfsync no no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 0 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 20000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 8192mb 4096mb 600 client-output-buffer-limit pubsub 32mb 8mb 60 aof-rewrite-incremental-fsync yes # include /path/to/local.conf # include /path/to/other.conf |
---|
9,启动从库容器
docker run --name s_redis -v /storage/docker/redis:/data -p 6401:6379 -d redis redis-server /data/redis_slave.conf |
---|
10,连接到从库容器内部执行主从复制
docker exec -it s_redis /bin/bash redis-cli auth redis1234 slaveof 192.168.17.61 6401 |
---|
11,在主库新增一个key,观察是否正常同步到从库。
<end>