Docker 部署 redis教程,附帶部分小建議,防止踩坑
阿新 • • 發佈:2020-08-31
### 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