Docker 环境创建redis集群服务
编写者:kenny
1. 在 docker 中创建 redis 服务
docker run --name redis-7000 -p 7000:6379 -d redis:3.2
docker run --name redis-7001 -p 7001:6379 -d redis:3.2
docker run --name redis-7002 -p 7002:6379 -d redis:3.2
–name:容器名字
-p:本地指向端口:容器中的端口
-d:使用的镜像版本
2. 查询容器是否创建成功
docker ps -a
bogon:~ XXXXXX$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe5e6f3524db redis:3.2 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:7002->6379/tcp redis-7002
10e939e06976 redis:3.2 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:7001->6379/tcp redis-7001
65afc2b3da86 redis:3.2 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:7000->6379/tcp redis-7000
3. 启动容器
docker start redis-7000
docker start redis-7001
docker start redis-7002
4. 查看启动容器
docker ps
bogon:~ XXXXXX$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fe5e6f3524db redis:3.2 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:7002->6379/tcp redis-7002
10e939e06976 redis:3.2 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:7001->6379/tcp redis-7001
65afc2b3da86 redis:3.2 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 0.0.0.0:7000->6379/tcp redis-7000
5. 查看该容器的Docker内网IP地址
docker inspect redis-7000
或
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-7000
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-7001
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-7002
[
{
"Id": "65afc2b3da86dec53817196f5f3cab0a7efef942755eab9f16d9eeef2127b81b",
"Created": "2018-12-19T07:55:00.771925137Z",
"Path": "docker-entrypoint.sh",
"Args": [
"redis-server"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 5823,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-12-19T07:55:01.361636295Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:87856cc39862cec77541d68382e4867d7ccb29a85a17221446c857ddaebca916",
"ResolvConfPath": "/var/lib/docker/containers/65afc2b3da86dec53817196f5f3cab0a7efef942755eab9f16d9eeef2127b81b/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/65afc2b3da86dec53817196f5f3cab0a7efef942755eab9f16d9eeef2127b81b/hostname",
"HostsPath": "/var/lib/docker/containers/65afc2b3da86dec53817196f5f3cab0a7efef942755eab9f16d9eeef2127b81b/hosts",
"LogPath": "/var/lib/docker/containers/65afc2b3da86dec53817196f5f3cab0a7efef942755eab9f16d9eeef2127b81b/65afc2b3da86dec53817196f5f3cab0a7efef942755eab9f16d9eeef2127b81b-json.log",
"Name": "/redis-7000",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"6379/tcp": [
{
"HostIp": "",
"HostPort": "7000"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "shareable",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/asound",
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/14d581d02749344b07830f73df27fa832dcb1cc1b8a07b20374d807b341c156c-init/diff:/var/lib/docker/overlay2/478707f750504089cad0c4aa1c23dd91feb0b48265083c821ffade0a810f0a93/diff:/var/lib/docker/overlay2/1cb3dd588256b5282494f84e5a2c7d5de952ea9bff4d4995ebed52160e7ead18/diff:/var/lib/docker/overlay2/7775457fbc8108d4118140d85cff385b76adc26d506476c7f931a6baa43b84f2/diff:/var/lib/docker/overlay2/900064e8f90cbadf1c70e865ba829955a8e833420feef31e8cf5710bf1c2b5aa/diff:/var/lib/docker/overlay2/0da15a62c4fff109d8179dfbba69955d6777112b5ace2b81013710cef1392ccb/diff:/var/lib/docker/overlay2/668c5c41718cad5fd59df21556f1ae79627c778ce4589d24fb396e3657fca702/diff",
"MergedDir": "/var/lib/docker/overlay2/14d581d02749344b07830f73df27fa832dcb1cc1b8a07b20374d807b341c156c/merged",
"UpperDir": "/var/lib/docker/overlay2/14d581d02749344b07830f73df27fa832dcb1cc1b8a07b20374d807b341c156c/diff",
"WorkDir": "/var/lib/docker/overlay2/14d581d02749344b07830f73df27fa832dcb1cc1b8a07b20374d807b341c156c/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "volume",
"Name": "69dd8ed97569a6a0189da33bbcce3739e6fc9ab9bb3cd312c1b5d3fc4000c6d1",
"Source": "/var/lib/docker/volumes/69dd8ed97569a6a0189da33bbcce3739e6fc9ab9bb3cd312c1b5d3fc4000c6d1/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "65afc2b3da86",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.10",
"REDIS_VERSION=3.2.12",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.12.tar.gz",
"REDIS_DOWNLOAD_SHA=98c4254ae1be4e452aa7884245471501c9aa657993e0318d88f048093e7f88fd"
],
"Cmd": [
"redis-server"
],
"ArgsEscaped": true,
"Image": "redis:3.2",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "e0ae8f8b75b0f445d0233d606f5a57706ec4aba69c246211191c18b869509390",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"6379/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "7000"
}
]
},
"SandboxKey": "/var/run/docker/netns/e0ae8f8b75b0",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "4b0c7b11b3f3c17c9bccf83e0143fc34d4c82e139c42bc359c75e8e3f574986b",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "d516974be4b49a3267f6c7caf577a840e45606335dbdf95c995e4374b5dca558",
"EndpointID": "4b0c7b11b3f3c17c9bccf83e0143fc34d4c82e139c42bc359c75e8e3f574986b",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
主要看这一段信息
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "d516974be4b49a3267f6c7caf577a840e45606335dbdf95c995e4374b5dca558",
"EndpointID": "4b0c7b11b3f3c17c9bccf83e0143fc34d4c82e139c42bc359c75e8e3f574986b",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
可以查看到
redis-7000 容器的地址为:172.17.0.2
redis-7000 容器的地址为:172.17.0.3
redis-7000 容器的地址为:172.17.0.4
6. 进入容器中
docker exec -i -t --privileged=true redis-7000 /bin/bash
docker exec -i -t --privileged=true redis-7001 /bin/bash
docker exec -i -t --privileged=true redis-7002 /bin/bash
进入容器的时候拥有所有权限:–privileged=true
7. 进入 redis 客户端
使用 redis-cli 命令,连接redis服务端
redis-cli
8. 查看当前机器的角色
info replication
root@65afc2b3da86:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
未配置前,三台redis均为 master主机
9. 配置集群
配置容器 redis-7000 为master主机,redis-7001 和 redis-7002 为 slave;
1. 按照以上方法分别进入 redis-7001 和 redis-7002 容器中;
2. 配置 redis-7000 容器为master主机:
SLAVEOF 172.17.0.2 6379
bogon:~ XXXXXX$ docker exec -i -t --privileged=true redis-7001 /bin/bash
root@10e939e06976:/data# redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.2
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:29
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> exit
root@10e939e06976:/data# exit
3. 进入容器 redis-7000 master中查看
bogon:~ XXXXXX$ docker exec -i -t --privileged=true redis-7000 /bin/bash
root@65afc2b3da86:/data# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=351,lag=1
slave1:ip=172.17.0.4,port=6379,state=online,offset=351,lag=1
master_repl_offset:351
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:350