Docker 部署 redis,附帶部分小建議,防止踩坑
跟所有人一樣,我們先從docker基本命令開始
一、拉取redis映象(配圖來自菜鳥,其實截圖沒多大意義,對比看下)
# 預設就拉取lastest版本,如有特殊需求請加版本號
docker pull redis
# docker pull redis:3.2
二、確認一下是否拉取成功
docker images
成功了就可以看到這一行,那一串長字串就是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
六、不踩坑姿勢
-
如果要對外閘道器閉,只對內網開放,你以為的:bind 127.0.0.1 就可以?
- 常見錯誤:容器內設定bind 127.0.0.1 僅僅是對容器繫結,那會造成宿主機無法訪問
容器是不識別宿主機的local IP的,所以你想繫結bind 192.X.X.X 也同樣不可行
-
解決思路:
- 打通宿主機和容器的網路,可在啟動的時候使用--net=host,直接讓容器使用宿主機的IP和host
- 在iptables層(或者阿里雲的安全組類似的)進行埠的控制,決定暴露給誰使
- 密碼強度增加,埠更換成其他的,也可以解決不少安全性,這樣開放就開放減低了被掃描的可能性
-
資料沒有儲存出來,想直接抓aof資料
- 掛載出來即可,和conf同理