ITPub博客

首页 > 云计算 > Docker/K8 > 基于Docker环境构建redis单机容器

基于Docker环境构建redis单机容器

原创 Docker/K8 作者:jaymarco 时间:2020-06-29 15:50:57 0 删除 编辑

1    背景介绍


     用传统部署搭建一套redis环境,中间会消耗太多的重复的工作,导致部署效率非常低。例如:申请虚拟机,安装操作系统,软件包依赖安装和redis应用部署,这个过程中间需要花费不少时间,同时在安装的过程中出现问题也需要花费一些时间去处理。然后传统方式部署方式可移植性相当差。要想将现有redis迁移到新主机,可不是那么容易的事情,可能最简单的方式是tar包过去,但是新主机还是需要安装redis相关的依赖包上去,还需要花些时间去调试redis,中间反反复复的重复工作太浪费时间了。

      为了打破传统部署模式带来的效率低下问题,我们采用docker容器部署模式,将重复的工作精简化,也为了方便运维工程师更加快速搭建一套redis环境,redis容器化后能够解决安装过程中出现的重复性繁琐的工作。最终以镜像的存储在镜像仓库中。只要有需求用到redis服务,可以在任何安装有docker软件的主机上面运行redis容器,即可达到需求。Docker容器化后的镜像即可实现即开即用的效果。


2  镜像打包流程



Ø  Linux编译环境:准备一台能上外网的linux环境,并安装好docker运行环境。

Ø  基础镜像:在构建应用镜像前置条件,需要准备一套干净的centos基础镜像,然后在这个基础镜像上面去部署redis软件。

Ø  配置标准化:按dockerfile的命令格式来编写,将redis软件安装与redis配置步骤写入到dockerfile文件中。然后准备好运行环境需要的配置文件和对应的运行环境启动脚本,方便在构建应用镜像时将这些文件打包到镜像中。

Ø  构建应用镜像:通过编写dockerfile文件在基础操作系统镜像里面将所要运行的所依赖的软件包和redis软件部署到镜像中,最后通过docker命令将其打成一个新的完整镜像包,下次要用redis就直接下载镜像部署。

Ø启动容器:docker命令启动容器的过程中会将redis服务启动。

在Docker中,构建一个自定义镜像共有两种方法,一是通过commit指令构建,二是通过Dockerfile文件构建。这里我们推荐第二种方法用dockerfile文件构建redis镜像。


  Dockerfile基本框架

    Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

    Dockerfile 的内容分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令

操作系统

FROM

按需求选择不同类型的基础操作系统镜像

常用软件

ADD

选择运行所需要的常用软件,如PHP、NGINX,自动设置相应的运行变量

指定用户

USER

设置启动容器的用户,默认是root用户

执行安装

RUN

执行针对需求包编写安装脚本

切换目录

WORKDIR

可以多次切换(相当于cd命令)

环境变量

ENV

镜像中设置环境变量

端口映射

EXPOSE

该指令会将容器中的端口映射成宿主机器中的某个端口

存储使用

VOLUMN

按需定义外挂目录(IO要求高,持久化,宿主机间共享等)

启动运行

ENTRYPOINT

设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效

启动运行

CMD

容器启动时需要执行的脚本

   Redis容器化过程

4.1     Linux 编译环境

    准备一台centos7虚拟机,并在这台主机上面安装Docker软件,这里以docker版本1.13.1为例,来介绍如何安装Docker软件步骤。

#下载docker-engine

wget  

#下载docker-engine-selinux

wget  

 

#安装docker软件依赖文件

yum   install -y libtool-ltdl policycoreutils-python

 

#先安装docker-engine-selinux,再安装docker-engine-selinux

yum   localinstall docker-engine-selinux-1.13.1-1.el7.centos.noarch.rpm -y

yum   localinstall docker-engine-1.13.1-1.el7.centos.x86_64.rpm –y

 

#重启docker服务

systemctl   start docker

systemctl   enable docker

下面代表docker 软件已经安装成功


4.2     获取基础镜像

    可以直接在Linux编译环境下载Centos7基础镜像,要求编译环境是要能上外网连上hub.docker.com外网镜像仓库来下载镜像,下面输入docker search centos可以看到外网docker镜像仓库中有很多centos镜像。可以通过docker pull openshift/base-centos7命令来下载centos基础镜像。

 

    用docker pull已经将镜像下载到本地linux主机上面,接下来镜检查openshift/base-centos7镜像完整性,只要docker run命令来启动这个镜像,我们看到这个容器已经正常启起来。验证表明这个镜像是正常的。

 

    下面是docker日常用到的一些简单命令:

1 、下载centos 镜像

docker   pull openshift/base-centos7

2 、查看镜像

docker   images

3 、删除镜像

Docker   rmi <IMAGE ID >

4 、运行docker 容器

docker   run -itd  openshift/base-centos7 echo   "hello word"

5 、启停docker 容器

docker   start <CONTAINER ID >

Docker   stop <CONTAINER ID >

Docker   kill <CONTAINER ID >

6 、进入docker 容器中

Docker   exec –it <CONTAINER ID > bash

Docker   attach <CONTAINER ID >

7 、删除容器

Docker   rm <CONTAINER ID >

4.3     创建dockerfile 构建redis 环境

1、编写redis打包镜像的dockerfile步骤

2、dockerfile编程

#引用centos基础镜像

FROM   openshift/base-centos7

MAINTAINER   jaymarco

#安装redis依赖包与redis软件

RUN   yum install gcc  gcc-c++ make  cmake    tar  python-setuptools -y   && \

curl   -fL | tar xzf - -C /tmp   &&\

cd   /tmp/redis-3.2.3 && \

make   PREFIX=/usr/local/redis install && \

mkdir   -p /usr/local/redis/{bin,etc,var,logs} && \

cp   -af   src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redis-server}   /usr/local/redis/bin/ && \

cp   -a redis.conf /usr/local/redis/etc/    &&\

cp   -a sentinel.conf /usr/local/redis/etc/ &&\

echo   "export PATH=/usr/local/redis/bin:\$PATH" >   /etc/profile.d/redis.sh && \

source   /etc/profile.d/redis.sh && \

groupadd   -r redis &&\

useradd   -g redis  redis && \

chmod   -R 755 /usr/local/redis/etc && \

yum   clean all && \

rm   -rf /tmp/redis-3.2.3 &&\

/bin/cp   /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\

echo   'Asia/Shanghai' >/etc/timezone

 

#redis参数优化

RUN   sed -e 's/^bind 127.0.0.1/#bind 127.0.0.1/' \

-e   's/#   save ""/save   ""/'   \

-e   's/save 900 1/#save 900 1/' \

-e   's/save 300 10/#save 300 10/' \

-e   's/save 60 10000/#save 60 10000/'  \

-e   's/appendonly no/appendonly yes/' \

-e   's/# maxmemory-policy noeviction/maxmemory-policy noeviction/' \

-e   '481i\requirepass Redis@2017' \

-e   '539i\maxmemory 2147483648' \

-i   /usr/local/redis/etc/redis.conf && \

sed   "s|dir ./|dir /usr/local/redis/dumpdb/|"  -i /usr/local/redis/etc/redis.conf   && \

sed   "s|logfile ""|logfile   "/usr/local/redis/logs/redis.log"|"  -i    /usr/local/redis/etc/redis.conf

 

#容器端口映射

EXPOSE   6379

#启动redis

ENTRYPOINT   ["/usr/local/redis/bin/redis-server", "/usr/local/redis/etc/redis.conf"]

4.4     构建redis 镜像

    通过docker build执行创建,-t参数指定镜像名称,来构建redis镜像

    docker build -t redis:v3.2.3 .

    执行中会有类似输出: 


执行完毕后,输入 docker images 可以查看当前本机的镜像,如下图,可以看到新增的镜像


1.1     启动redis 容器

    Redis是有状态数据,我们将redis的数据文件存储到本地宿主机,只需要在启动redis容器的时候将本地目录以卷的方式挂载到容器中。

    在本地宿主机创建一个redis存储目录

    mkdir –p /home/redisdump

  然后启动 redis 容器

docker run -itd --name redis

-v   /home/redisdump:/usr/local/redis/dumpdb \

-p   6379:6379 redis:v3.2.3

我们看到容器已经正常启动,并能查看到它正在运行的进行信息。

1    验证redis容器

    启动redis容器的时候已将redis容器的6379端口映射到外面的宿主机6379端口,说明我们能够通过宿主机地址加上6379就能够访问redis容器里面的数据。

    现在我们来测试一下


    现在宿主机上模拟插入一条数据,然后返回到容器查看数据是否存在


    进入容器我们查看数据是有的,说明我们的镜像是成功的



有需要的朋友可以关注我的公众号,文章每日一更


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28833846/viewspace-2701145/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
负责数据库、中间件、大数据等基础软件建设、优化和业务保障工作。具有10年的电信与银行企业一线/二线运维管理经验。目前专注研究云计算、中间件和数据库等领域技术研究。持有Oracle OCP、weblogic OCP、Docker容器、PGCE和阿里云ACP等认证

注册时间:2020-06-22

  • 博文量
    80
  • 访问量
    60080