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

柚子的夏天發表於2020-08-31

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同理

相關文章