安装
安装环境要求:
目前,CentOS 仅发行版本中的内核支持 Docker。
- Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
- Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
使用yum安装步骤:
➜ uname -r // 查看你当前的内核版本
3.10.0-123.9.3.el7.x86_64
➜ yum -y install docker // 安装 Docker
...
Complete!
➜ service docker start // 启动 Docker 后台服务
Redirecting to /bin/systemctl start docker.service
➜ docker version 或 docker info // 查看docker版本,验证是否安装成功
➜ sudo docker run hello-world // 验证docker是否安装成功并在容器中
redis主从复制
安装redis镜像
➜ docker search redis // docker中查看redis镜像
➜ docker pull redis:latest // 拉取最新版本redis
➜ docker images // 安装成功后,可以查看到 docker.io/redis
创建宿主机 redis 容器的数据和配置文件目录
# 这里我们在 /home/docker 下创建
➜ mkdir /home/docker/redis/{conf,data} -p
➜ cd /home/docker/redis
# 获取 redis 的默认配置模版
# 这里主要是想设置下 redis 的 log / password / appendonly
# redis 的 docker 运行参数提供了 --appendonly yes 但没 password
➜ wget https://raw.githubusercontent.com/antirez/redis/4.0/redis.conf -O conf/redis.conf
# 绑定IP修改为IP列表或全部IP,否则会导致主从同步失败
➜ sed -i 's/bind 127.0.0.1/bind 0.0.0.0/' conf/redis.conf
redis-master.conf配置
➜ cp conf/redis.conf conf/redis-master.conf
➜ sed -i 's/logfile ""/logfile "access.log"/' conf/redis-master.conf
➜ sed -i 's/# requirepass foobared/requirepass 123456/' conf/redis-master.conf
➜ sed -i 's/appendonly no/appendonly yes/' conf/redis-master.conf
创建redis-master容器
➜ docker run \
-p 6500:6379 \
-v $PWD/data:/data \
-v $PWD/conf/redis-master.conf:/etc/redis/redis.conf \
--privileged=true \
--name redis-master \
-d redis redis-server /etc/redis/redis.conf
/****************** 命令分解 ******************/
docker run \
-p 6500:6379 \ // 端口映射,`宿主机:容器`
-v $PWD/data:/data \ // 映射数据目录 rw 为读写,`宿主目录:容器目录`
-v $PWD/conf/redis-master.conf:/etc/redis/redis.conf \ // 映射配置文件
--privileged=true \ // 给与一些权限
--name redis-master \ // 给容器起个名字
-d redis redis-server /etc/redis/redis.conf // deamon 运行容器 并使用配置文件启动容器内的 redis-server
redis-slave.conf配置
/* 配置redis-slave.conf */
➜ cp conf/redis.conf conf/redis-slave.conf
➜ sed -i 's/logfile ""/logfile "access.log"/' conf/redis-slave.conf
➜ sed -i 's/# requirepass foobared/requirepass 123456/' conf/redis-slave.conf
➜ sed -i 's/appendonly no/appendonly yes/' conf/redis-slave.conf
/* 查看redis master 的内部 ip */
➜ docker inspect redis-master // 或redis-master的ContainerID
"NetworkSettings": {
...
"Ports": {
"6379/tcp": [ // 端口号
{
"HostIp": "0.0.0.0", // 允许全部外部IP访问
"HostPort": "6500" // 宿主机对应的端口号
}
]
},
...
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3", // IP
"IPv6Gateway": "",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3", // IP
...
}
}
}
/* 修改redis-slave.conf,增加下列配置 */
# 主地址
➜ vim conf/redis-slave.conf
➜ slaveof // slaveof mymaster 6379
# 主认证
➜ masterauth // masterauth 123456
创建redis-slave-1容器
➜ docker run \
-p 6501:6379 \
-v $PWD/data:/data \
-v $PWD/conf/redis-slave.conf:/etc/redis/redis.conf \
--privileged=true \
--name redis-slave-1 \
--link redis-master:mymaster \
-d redis redis-server /etc/redis/redis.conf
特别注意:
- 创建从容器时,增加
--link redis-master:mymaster
参数,其中redis-master
是主容器真实名称,mymaster
是主容器在从容器中的别名slaveof mymaster 6379
主容器的IP使用别名表示,防止docker重启IP变化导致错误。
shell登陆容器内测试redis
/* redis master 添加一个值 */
➜ docker exec -it redis-master redis-cli -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name "test master..."
OK
127.0.0.1:6379> get name
"test master..."
/* redis slave 查询已添加值是否同步 */
➜ docker exec -it redis-slave-1 redis-cli -p 6379
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get name
"test master..."
如果主从不同步,请检查 redis master 的 bind 和 protected-mode 的设置,看下有没有监听内网地址,否则 redis-slave 没办法通过 redis master 的地址做数据同步
--link 带来的容器启动顺序问题
- 如果数据要保持强一致性,读数据只能通过主服务器完成。
关于redis主从补充
单个Redis实例1秒只能处理100个命令,当读请求的重要性明显高于写请求且读请求数量远远超出一台redis服务器读处理范围时,需要添加更多从服务器来处理读请求。从服务器也可以拥有自己的从服务器(主从链);然而,主主不能复制。
随着负载不断上升,主服务器可能无法快速更新所有从服务器,或者因为重新连接和重新同步从服务器而导致系统超载。为了缓解这个问题,可以创建一个由Redis主从节点组成的中间层来分担主服务器的复制工作。
参考
Docker基本概念讲解 - 掘金
Docker 官网
Docker安装部署redis
Docker 常用命令