使用 Docker 構建 redis 容器


1 背景介紹


使用 Docker 構建 redis 容器


用傳統部署搭建一套 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鏡像。


使用 Docker 構建 redis 容器


3 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 容器啟動時需要執行的腳本

4 Redis 容器化過程

4.1 Linux 編譯環境

準備一臺 centos7虛擬機,並在這臺主機上面安裝 Docker軟件,這裡以 docker版本 1.13.1

為例,來介紹如何安裝 Docker軟件步驟。

#下載 docker-engine

wget

https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-1.13.1-1.el7.centos

.x86_64.rpm

#下載 docker-engine-selinux

wget

https://yum.dockerproject.org/repo/main/centos/7/Packages/docker-engine-selinux-1.13.1-1.el7

.centos.noarch.rpm


#安裝 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>

4、運行 docker 容器

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

5、啟停 docker 容器

docker start <container>

Docker stop <container>

Docker kill <container>

6、進入 docker 容器中

Docker exec –it <container> bash/<container>

Docker attach <container>

7、刪除容器

Docker rm <container>

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 http://download.redis.io/releases/redis-3.2.3.tar.gz | 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 可以查看當前本機的鏡像,如下圖,可以看到新增的鏡像


4.5 啟動 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


我們看到容器已經正常啟動,並能查看到它正在運行的進行信息。


5 驗證 redis 容器

啟動 redis 容器的時候已將 redis 容器的 6379 端口映射到外面的宿主機 6379 端口,說明我們

能夠通過宿主機地址加上 6379 就能夠訪問 redis 容器裡面的數據。

現在我們來測試一下


現在宿主機上模擬插入一條數據,然後返回到容器查看數據是否存在


進入容器我們查看數據是有的,說明我們的鏡像是成功的。


使用 Docker 構建 redis 容器


分享到:


相關文章: