通过 docker-compose 快速部署 Redis 保姆级教程

Posted 技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过 docker-compose 快速部署 Redis 保姆级教程相关的知识,希望对你有一定的参考价值。


一、概述

Redis(全称:Remote Dictionary Server,即远程字典服务器)是一个开源的高性能键值数据库和缓存系统。Redis 的数据结构支持字符串、哈希表、列表、集合和有序集合等类型。同时,Redis 还提供了丰富的操作指令,例如 GET/SET、INCR/DECR、HGET/HSET、LPUSH/RPUSH、SADD/SMEMBERS、ZADD/ZRANGE 等。除此之外,Redis 还支持事务、过期时间、发布/订阅等特性,能够方便地实现各种高效的数据存储和读取方案。

想了解更多redis知识点可以参考我这篇文章:Redis原理介绍与环境部署(主从模式、哨兵模式、集群模式)

二、前期准备

1)部署 docker

# 安装yum-config-manager配置工具
yum -y install yum-utils

# 建议使用阿里云yum源:(推荐)
#yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装docker-ce版本
yum install -y docker-ce
# 启动并开机启动
systemctl enable --now docker
docker --version

2)部署 docker-compose

curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose --version

三、创建网络

# 创建,注意不能使用hadoop_network,要不然启动hs2服务的时候会有问题!!!
docker network create hadoop-network

# 查看
docker network ls

四、Redis 编排部署

1)下载 Redis

下载地址:http://download.redis.io/releases/

wget http://download.redis.io/releases/redis-7.0.3.tar.gz

2)配置

  • config/master/redis.conf
bind 0.0.0.0
daemonize yes
logfile "/usr/local/redis/redis.log"
dir /opt/apache/redis/data
masterauth 123456
requirepass 123456
appendonly yes

参数解释:

bind            # 监听ip,多个ip用空格分隔,监听所有的IP地址
daemonize yes   # 允许后台启动
logfile         # 日志路径
dir             # 数据库备份文件存放目录
masterauth      # slave连接master密码,master可省略
requirepass     # 设置master连接密码,slave可省略
appendonly       # 在/opt/apache/redis/data目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中
  • config/slave/redis.conf
bind 0.0.0.0
daemonize yes
logfile "/usr/local/redis/redis.log"
dir /opt/apache/redis/data
replicaof redis-master 6379
masterauth 123456
requirepass 123456
appendonly yes

参数解释:

bind            # 监听ip,多个ip用空格分隔,监听所有的IP地址
daemonize yes   # 允许后台启动
logfile         # 日志路径
dir             # 数据库备份文件存放目录
replicaof       #  replicaof用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点。就是设置master节点
masterauth      # slave连接master密码,master可省略
requirepass     # 设置master连接密码,slave可省略
appendonly       # 在/opt/apache/redis/data目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中

3)启动脚本 bootstrap.sh

#!/usr/bin/env sh

wait_for() 
    echo Waiting for $1 to listen on $2...
    sleep 1
    while ! nc -z $1 $2; do echo waiting...; sleep 1s; done


node_type=$1

if [ $node_type = "slave" ];then
        wait_for redis-master 6379
fi

/usr/local/bin/redis-server /usr/local/redis/redis.conf

tail -f /usr/local/redis/redis.log

4)构建镜像 Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/centos:7.7.1908

RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

RUN export LANG=zh_CN.UTF-8

RUN yum -y install install net-tools telnet wget nc less gcc gcc++ make

RUN mkdir /opt/apache/

# 编译安装 redis
ENV REDIS_VERSION 7.0.3
ADD redis-$REDIS_VERSION.tar.gz /opt/apache/
ENV REDIS_HOME /opt/apache/redis
RUN ln -s /opt/apache/redis-$REDIS_VERSION $REDIS_HOME

# 开始编译
RUN cd $REDIS_HOME && make && make install

# 创建数据目录
RUN mkdir $REDIS_HOME/data

# copy bootstrap.sh
COPY bootstrap.sh /opt/apache/
RUN chmod +x /opt/apache/bootstrap.sh

WORKDIR $KAFKA_HOME

开始构建镜像

# 需要查看构建镜像详细过程则需要加上 --progress=plain 选项
docker build -t registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/redis:7.0.3 . --no-cache --progress=plain

# 为了方便小伙伴下载即可使用,我这里将镜像文件推送到阿里云的镜像仓库
docker push registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/redis:7.0.3

### 参数解释
# -t:指定镜像名称
# . :当前目录Dockerfile
# -f:指定Dockerfile路径
#  --no-cache:不缓存

5)编排 docker-compose.yaml

version: \'3\'
services:
  redis-master:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/redis:7.0.3
    container_name: redis-master
    hostname: redis-master
    restart: always
    volumes:
      - ./config/master/redis.conf:/usr/local/redis/redis.conf
    ports:
      - "36379:6379"
    #command: ["sh","-c","/opt/apache/bootstrap.sh master"]
    command: ["sh","-c","/usr/local/bin/redis-server /usr/local/redis/redis.conf ; tail -f /usr/local/redis/redis.log"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep 6379 || exit 1"]
      interval: 10s
      timeout: 20s
      retries: 3
  redis-slave:
    image: registry.cn-hangzhou.aliyuncs.com/bigdata_cloudnative/redis:7.0.3
    restart: always
    deploy:
      replicas: 2
    volumes:
      - ./config/slave/redis.conf:/usr/local/redis/redis.conf
    ports:
      - "6379"
    command: ["sh","-c","/opt/apache/bootstrap.sh slave"]
    networks:
      - hadoop-network
    healthcheck:
      test: ["CMD-SHELL", "netstat -tnlp|grep 6379  || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3

# 连接外部网络
networks:
  hadoop-network:
    external: true

6)开始部署

docker-compose -f docker-compose.yaml up -d

# 查看
docker-compose -f docker-compose.yaml ps

五、简单测试验证

docker exec -it redis-master bash

# 登录
redis-cli -h redis-master
# 输入密码,配置文件里配置的密码
redis-master:6379> auth 123456
# 查看集群信息
redis-master:6379> info replication

# 非交互式,但是不建议,因为密码直接在history可以查到,安全问题
redis-cli -h redis-master -a 123456 info replication

【温馨提示】master节点可读可写,slave是只读的。

六、常用的 redis 客户端命令

下面是 Redis 常用的客户端命令:

  • SET key value: 设置字符串类型的键值对。
  • GET key: 获取指定 key 的值。
  • DEL key: 删除指定的 key 。
  • INCR key: 将指定 key 的值加 1。
  • DECR key: 将指定 key 的值减 1。
  • EXISTS key: 判断 key 是否存在。
  • EXPIRE key seconds: 设置 key 的过期时间,以秒为单位。
  • TTL key: 获取 key 的剩余生存时间,以秒为单位。
  • KEYS pattern: 查找所有符合给定模式的 key。
  • FLUSHALL: 删除所有 key。

还有一些高级命令,可以用于处理 Redis 的复杂数据结构和实现事务等功能:

  • LPUSH key value: 将一个元素添加到列表的头部。
  • RPUSH key value: 将一个元素添加到列表的尾部。
  • LPOP key: 弹出并返回列表的头部元素。
  • RPOP key: 弹出并返回列表的尾部元素。
  • SADD key members: 将一个或多个元素添加到集合中。
  • SMEMBERS key: 返回集合中的所有成员。
  • ZADD key score member: 将元素和分值添加到有序集合中。
  • ZREVRANGE key start stop: 反向获取有序集合中指定分值范围内的所有成员。
  • MULTI: 开始事务。
  • EXEC: 执行事务中所有命令。
  • WATCH key: 监视指定 key 。如果在执行事务期间该 key 发生了变化,事务将被取消。

以上是 Redis 中的常用客户端命令,掌握这些命令的使用可以更好地利用 Redis 进行数据存储和处理。


通过 docker-compose 快速部署 Redis 教程就先到这里了,有任何疑问欢迎给我留言或私信,可关注我公众号【大数据与云原生技术分享】加群交流或私信沟通~

docker-compose概述与编排部署

docker-compose概述与编排部署

一、compose概述

  • compose是一个用于定义及允许多个Docker容器的工具,主要是通过一个YAML文件进行服务配置

  • 使用Docker Compose不再需要使用Shell脚本来启动容器

  • Docker Compose非常适合组合使用多个容器进行开发的场景
• Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。

• Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。

• Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

• 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

• Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

• Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。

二.YAML 文件格式及编写注意事项

三.Docker Compose配置常用字段

字段 描述
build 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile 构建镜像上下文路径
context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image 指定镜像
command 执行命令,覆盖默认命令
container name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法 scale
deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment 添加环境变量
networks 加入网络
ports 暴露容器端口,与 -p 相同,但端口不能低于 60
volumes 挂载宿主机路径或命令卷
hostname 容器主机名
restart 重启策略,默认 no,always,no-failure,unless-stoped

no,默认策略,在容器退出时不重启容器。<br/>on-failure,在容器非正常退出时(退出状态非0),才会重启容器。<br/>on-failure:3,在容器非正常退出时重启容器,最多重启3次。<br/>always,在容器退出时总是重启容器。<br/>unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。

四.Docker Compose 常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

五.Docker Compose 文件结构

yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml              #创建模板脚本
├── nginx
│?? ├── Dockerfile                  #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz         #复制源码包
│?? └── run.sh                      #启动服务脚本
└── wwwroot
    └── index.html                  #站点网页

六.compose 部署 Nginx mysql php

安装compose

1.Docker Compose 环境安装
Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose

#下载
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

#或者已下载过直接从宿主机传入到/opt目录下
rz -E
mv docker-compose/usr/local/bin/

#安装
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version

compose部署lnmp

创建工作目录并移动相应安装包、配置文件

cd /opt
mkdir docker-compose
----------------------nginx-----------------------------
1.mkdir -p /opt/compose-lnmp/nginx
2.cd  /opt/compose-lnmp/nginx
3.把nginx-1.12.0.tar.gz和wordpress-4.9.4-zh_CN.tar.gz和nginx的配置文件nginx.conf移进来(配置文件都已经修改好)
----------------------mysql-----------------------------
1.mkdir -p /opt/compose-lnmp/mysql
2.cd  /opt/compose-lnmp/mysql
3.把boost_1_59_0.tar.gz和mysql-5.7.17.tar.gz和mysql配置文件my.cnf移动到本目录(配置文件都已经修改好)
----------------------php--------------------------------
1.mkdir -p /opt/compose-lnmp/php
2.cd  /opt/compose-lnmp/php
3.把php-7.1.10.tar.bz2、php-fpm.conf、php.ini、www.conf移动到本目录(配置文件都已经修改好)

编写dockerfile

docker images | awk NR>=2print "docker rmi "$3 | bash (一键删除镜像文件)
docker stop &(docker ps -a -q)
docker rm &(docker ps -a -q)

在3个服务的工作目录下编写dockerfile.

nginx

vim Dockerfile

FROM centos:7
MAINTAINER this is nginx image <wl>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \\
--prefix=/usr/local/nginx \\
--user=nginx \\
--group=nginx \\
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/
#ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html/
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

mysql

vim Dockerfile

FROM centos:7

MAINTAINER this is mysql image <jzm 2022-03-09>
RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
RUN useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \\
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \\
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \\
-DSYSCONFDIR=/etc \\
-DSYSTEMD_PID_DIR=/usr/local/mysql \\
-DDEFAULT_CHARSET=utf8 \\
-DDEFAULT_COLLATION=utf8_general_ci \\
-DWITH_INNOBASE_STORAGE_ENGINE=1 \\
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \\
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \\
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \\
-DMYSQL_DATADIR=/usr/local/mysql/data \\
-DWITH_BOOST=boost \\
-DWITH_SYSTEMD=1 && make -j4 && make install
RUN chown -R mysql:mysql /usr/local/mysql/
ADD my.cnf /etc/my.cnf
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN bin/mysqld \\
--initialize-insecure \\
--user=mysql \\
--basedir=/usr/local/mysql \\
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
RUN systemctl enable mysqld
VOLUME [ "/usr/local/mysql" ]
CMD /usr/sbin/init

vim my.cnf
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

vim run.sh
#!/bin/bash
/usr/local/mysql/bin/mysqld 
systemctl enable mysqld

php

vim Dockerfile

FROM centos:7
MAINTAINER this is php image <wl>
RUN yum -y install gd \\
libjpeg libjpeg-devel \\
libpng libpng-devel \\
freetype freetype-devel \\
libxml2 libxml2-devel \\
zlib zlib-devel \\
curl curl-devel \\
openssl openssl-devel \\
gcc gcc-c++ make pcre-devel 
RUN useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src/
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \\
--prefix=/usr/local/php \\
--with-mysql-sock=/usr/local/mysql/mysql.sock \\
--with-mysqli \\
--with-zlib \\
--with-curl \\
--with-gd \\
--with-jpeg-dir \\
--with-png-dir \\
--with-freetype-dir \\
--with-openssl \\
--enable-fpm \\
--enable-mbstring \\
--enable-xml \\
--enable-session \\
--enable-ftp \\
--enable-pdo \\
--enable-tokenizer \\
--enable-zip && make && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
ADD php.ini /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

构建lnmp的compose文件

cd /opt/compose-lnmp #compose的工作目录
vim docker-compose.yml   #构建compose的yml文件
version: 2   #版本2能使用volumes_from
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: nginx
    ports:

   - 1111:80
     2222:443
         volumes:
        - ./nginx/html/:/usr/local/nginx/html
          tworks:
                lnmp:
          ipv4_address: 172.20.0.10
            mysql:
              hostname: mysql
              build:
                context: ./mysql
                dockerfile: Dockerfile
              container_name: mysql
              networks:
                lnmp:
          ipv4_address: 172.20.0.20
              ports:
             - 3306:3306
               php:
                   hostname: php
                   build:
                     context: ./php
                     dockerfile: Dockerfile
                   container_name: php
                   networks:
                     lnmp:
               ipv4_address: 172.20.0.30
                   ports:
                  - 9000:9000
                    lumes_from:
                       - nginx
                         mysql
                         networks:
                           lnmp:
                             driver: bridge
                             ipam:
                               config:
     - subnet: 172.20.0.0/16

修改完成后  删除原有的docker mynetwork

docker network ls 查看mynetwork网段然后删除
docker network rm 网段id号
systemctl restart docker 

cd /opt/compose-lnmp/

docker-compose -f docker-compose.yml up -d
----------------------------------------------------------

-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称

-d :在后台运行
----------------------------------------------------------

docker ps -a

docker exec -it mysql /bin/bash

进入数据库时 如果遇见“ERROR 2002 (HY000): Cant connect to local MySQL server through socket /usr/local/mysql/mysql.sock (2)
” 
这个问题的话  首先退出容器 在宿主机使用docker ps -a查看容器的id号 删除mysql容器
然后 docker images 查看 php的id号 重新构建容器
docker run -d -P --privileged 镜像id号 init
docker exec -it 重构后的mysql id号 /bin/bash就可以进入mysql了

mysql  #进入数据库
create database wordpress;
grant all privileges on wordpress.* to wordpress@% identified by 264196;
grant all privileges on *.* to root@% identified by 264196;
flush privileges;

 浏览器访问
http://192.168.19.:1111/wordpress/index.php

以上是关于通过 docker-compose 快速部署 Redis 保姆级教程的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose概述与编排部署

利用docker-compose快速部署测试用数据库服务器

采用docker-compose快速部署alibaba sentinel流量卫士镜像

docker-compose快速部署elasticsearch-8.x集群+kibana

docker-compose快速部署elasticsearch-8.x集群+kibana

halo搭建炫酷个人博客快速部署:docker+docker-compose+nginx