基於Docker環境構建redis單機容器

jaymarco發表於2020-06-29

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章