1. 程式人生 > >Docker 部署 redis教程,附帶部分小建議,防止踩坑

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

### Docker 部署 redis,附帶部分小建議,防止踩坑 > 跟所有人一樣,我們先從docker基本命令開始 #### 一、拉取redis映象(配圖來自菜鳥,其實截圖沒多大意義,對比看下) ```shell # 預設就拉取lastest版本,如有特殊需求請加版本號 docker pull redis # docker pull redis:3.2 ``` ![img](https://www.runoob.com/wp-content/uploads/2016/06/docker-redis3.png) #### 二、確認一下是否拉取成功 ```shell docker images ``` ![image-20200821134304449](https://tva1.sinaimg.cn/large/007S8ZIlly1ghydqwl7enj319m01kaap.jpg) 成功了就可以看到這一行,那一串長字串就是imageId #### 三、執行redis之前,docker run配置解釋 ​ 好了,前兩步都是基操,沒什麼可說的,到了執行redis這步,有很多人就開始犯迷糊,到底怎麼樣來執行一個可供使用的redis呢?如果只想快速開始一個:沒有密碼、預設埠6379,本地可連線的redis例項,你可以直接看[第五步](#啟動一個最簡單的redis),但我強烈建議你不要這麼幹,除非你的redis就是在本地玩玩,不丟在線上伺服器上。 ​ 我們先看我自己使用的的完整版啟動指令碼,再來告訴你,配置裡的啟動項都是幹嘛的 ```shell 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的詳細配置) ```properties # 這裡要設定成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 ```shell 127.0.0.1:6379> ``` ​ 輸入 auth 你的密碼 獲取許可權, OK則沒有問題 ```shell 127.0.0.1:6379>auth 你的密碼 OK ``` ​ 同樣的,可以測試從本地連線了。 ### 五、啟動一個最簡單的redis例項,無密碼 ```shell $ 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. 掛載出來即可,和con