Docker 部署 redis教程,附帶部分小建議,防止踩坑

Docker 部署 redis,附帶部分小建議,防止踩坑

跟所有人一樣,我們先從docker基本命令開始

一、拉取redis鏡像(配圖來自菜鳥,其實截圖沒多大意義,對比看下)

# 默認就拉取lastest版本,如有特殊需求請加版本號 
docker pull redis 
# docker pull redis:3.2 

img

二、確認一下是否拉取成功

docker images

image-20200821134304449

成功了就可以看到這一行,那一串長字元串就是imageId

三、運行redis之前,docker run配置解釋

​ 好了,前兩步都是基操,沒什麼可說的,到了運行redis這步,有很多人就開始犯迷糊,到底怎麼樣來運行一個可供使用的redis呢?如果只想快速開始一個:沒有密碼、默認埠6379,本地可連接的redis實例,你可以直接看第五步,但我強烈建議你不要這麼干,除非你的redis就是在本地玩玩,不丟在線上伺服器上。

​ 我們先看我自己使用的的完整版啟動腳本,再來告訴你,配置里的啟動項都是幹嘛的

docker run  -d -p 6379:6379 -v /data/docker/redis/conf/redis.conf:/etc/redis/redis.conf  redis  redis-server /etc/redis/redis.conf
  • docker run

    啟動

  • -d

    將docker容器以後台啟動的方式啟動(除非你想看看容器啟動起來馬上看到裡面的樣子),啟動後返回容器的ID

  • -p 6379:6379

    將容器內部的埠6379映射到宿主機的6379埠

  • -v /data/docker/redis/conf/redis.conf :/etc/redis/redis.conf

    -v 或者 –volume ,將宿主機卷綁定掛載到容器中,簡單點說就是和埠一樣,把宿主機的文件映射到容器中,前提是這個文件存在,否則只是一個空卷

  • redis

    啟動的redis鏡像名稱,如果不加tag,就是默認的lastest,如果有多個版本,請指定,比如 redis:3.2

上文啟動命令並未指定此容器的名字,docker在啟動後會隨機分配一個容器名,如果需要自定義,則在命令里加上 ** –name redis-test ** ,redis-test 是我起的一個名字

  • redis-server /etc/redis/redis.conf

    容器運行命令的最後,就是執行容器內部的命令了,啟動過redis的同學都知道,這個命令的意思就是以 /etc/redis/redis.conf 為配置項啟動redis了

四、運行redis

​ 經過上文的參數解釋,你應該知道了,redis運行最主要的問題就是要把這個配置文件給掛載出來,那麼我們在運行之前,就要提前 在 /data/redis/conf 目錄下(這只是我的目錄,你可以任意目錄,記得替換掉啟動參數里的路徑)新建一個 redis.conf , 這裡同樣給出一份配置(配置可以去參考redis的詳細配置)

# 這裡要設置成no,因為我們容器本身就已經是-d啟動了,如果設置成yes,會無法啟動起redis
daemonize no
# 這樣設置可以讓外界連接到redis,如果不想對公網暴露,可以設置成bind 127.0.0.1 ,但也有坑,坑見下文 
bind 0.0.0.0
# 寫入文件,不開啟,一重啟數據就沒了
appendonly yes
# 運行5個連接存活,防止出現長時間不連,需要重連的情況
tcp-keepalive 5
# 原則上必須填寫,你要是對公網開放還沒有密碼,那就是裸奔
requirepass 你的密碼

​ 運行後,此redis實例可以使用了,測試是否成功,執行以下命令,直接連接名稱為redis-test的容器並執行 redis-cli命令

docker exec -it redis-test redis-cli

​ 成功,則看到連接到redis

127.0.0.1:6379>

​ 輸入 auth 你的密碼 獲取許可權, OK則沒有問題

127.0.0.1:6379>auth 你的密碼
OK

​ 同樣的,可以測試從本地連接了。

五、啟動一個最簡單的redis實例,無密碼

$ docker run -itd --name redis-test -p 6379:6379 redis

六、不踩坑姿勢

  1. 如果要對外網關閉,只對內網開放,你以為的:bind 127.0.0.1 就可以?

    • 常見錯誤:容器內設置bind 127.0.0.1 僅僅是對容器綁定,那會造成宿主機無法訪問

    容器是不識別宿主機的local IP的,所以你想綁定bind 192.X.X.X 也同樣不可行

    • 解決思路:

      1. 打通宿主機和容器的網路,可在啟動的時候使用–net=host,直接讓容器使用宿主機的IP和host
      2. 在iptables層(或者阿里雲的安全組類似的)進行埠的控制,決定暴露給誰使
      3. 密碼強度增加,埠更換成其他的,也可以解決不少安全性,這樣開放就開放減低了被掃描的可能性
  2. 數據沒有保存出來,想直接抓aof數據

    1. 掛載出來即可,和conf同理