1. 程式人生 > >docker裡的ubuntu16下搭建redis

docker裡的ubuntu16下搭建redis

先宣告一下,不是上面的部落格寫的不好,而是博主本人第一次搭建,之前也從沒用過docker,所以有些地方可能對於老手來說不值一提,但作為新手還是要注意一下的,不,是特別需要注意。其實博主本來可以用vm裡的openSESU(linux發行版之一)來直接安裝redis的,但看這個docker蠻好玩的,就試用一下,結果折騰了兩天才搞好。好了,廢話不多說了,開始填坑了。只是坑太多了,都不知道怎麼講起了。。。

寫在前面的話:
1.推薦使用官網裡DockerToolbox,它有一個視覺化的工具。
不要使用原博裡的boot2docker windows了,網上搜的根本下不動。

2.記得要進入你的BIOS裡開啟那個虛擬化的東東

,Intel是叫什麼hyper-v吧,AMD是叫SVM那個,跟電腦的型號有關,可能有不同叫法,總之改成enable就行了,要不然你根本安裝不了docker。

額,首先,還是講講docker吧,我只寫自己的理解,什麼docker是程序間的隔離,一般的虛擬機器是在OS之上利用虛擬機器管理程式虛擬出一個完整的作業系統就不說了,給兩個連結:
docker與虛擬機器效能比較
How is Docker different from a normal virtual machine?
docker首先要區分兩個概念,一個是容器(container:就是用~>docker ps查詢出來的那些),一個是映象(images:用docker images可以查詢出來)。有人說這就像是類和例項之間的區別,images是類,container是例項,也挺形象的。
但如果按照本意理解,我覺得images就是一個模板然後根據這個模板建立不同的container,因為是模板所以是”死的”,在執行的永遠是”活的”container。

1)、所以每次我們在進入(進入一個執行的container用:~>docker exec -it container_id /bin/bash)container修改後

2)、然後退出時(退出用:~>exit)

3)、最好儲存為一個images(先用~>docker ps檢視剛才進入的容器id,再用~>docker commit container_id image_name(自己想的images名字))

這樣就可以利用這個image還原出上次的環境,就不用重複上次的步驟了。

1坑一
從這引出第一個坑,那就是不用的image可不可以刪除呢?原博說可以,其實沒有說清楚,也可以說原博說的有問題。
答案是:有繼承關係的不可以,沒有繼承關係的可以。


就哪原博來說吧,首先建立了一個ubuntu14映象,然後用這個image建立一個容器,在裡面進行ssh的配置,之後退出,commit為一個新的image,命名為ubuntu:ssh。那這個ubuntu14就不可以被刪除,除非先刪除ubuntu:ssh這個。依次類推。但我們可以刪除tag,這樣使用

~>docker images

時就不會顯示。除非用

~>docker images -a

這會查詢出所有的images,包括tag為none的。但就算這樣,你依然刪不掉這個imges,所以不用再搜怎麼刪掉tag為none的image了,不過“壞的”none倒是可以用網上的方法刪掉。

坑二
安裝後的(即make後)/usr/local/redis1/bin/資料夾下是沒有redis.conf檔案的,要到解壓檔案裡拷一份過來,或者懂指令碼的話知道./redis-server 後的那個redis.conf其實是個引數,所以你也可以直接指定在/opt/redis-stable資料夾下的那個redis.conf檔案。但是要注意按他那樣修改檔案是不夠的,還要註釋掉一句 bind 127.0.0.1 ::1,後面你就知道了,不註釋掉這一句你根本連不上,哦,是假的連上了,因為你ping的時候會報錯,會說你的redis執行在protected mode上,之後再輸flushall就會說報在驅動器上插入軟盤這樣的鬼問題。

坑三
折騰了最久的就是redis啟動了咩有啊,啟動了怎麼連不上啊。
首先判斷redis server是否啟動,用下面這句:

ps -ef|grep redis

這裡寫圖片描述
注意,一定要出現./redis-server *:6379這句才算啟動成功,只出現下面的那句說明沒有啟動成功。這裡順便說一句,如果你沒有註釋掉bind 127.0.0.1這句,就是綁定當前主機,那6379前面的就會是127.0.0.1,這樣你用win下的命令列來連的話就連不上。
這裡說的是用

./redis-server redis.conf

這句來連時判斷redis是否啟動的方法,因為我們在redis.conf裡設定了使用守護程序來開啟redis,所以就會在後臺執行redis,所以要這樣來判斷。
但如果使用

./redis-server 

這句來開啟redis,那直接看有沒有啟動畫面就行了。就是那個一層一層的東西。

終極神坑
就是用這句話始終啟動不了redis-server。

./redis-server redis.conf

而且又不報錯,壓根就不知道怎麼解決。這時,不要懷疑,一定是redis.conf檔案裡的內容有錯。不要想著改寫法或者把redis.conf放到其他地方了。
我的就是redis.conf裡的這句錯了

dir "/usr/local/redis1/data"

沒有在redis1下建立一個data資料夾。啟動指令碼是不會為你mkdir資料夾的這點要注意。其實原博中有教,但可能也是修改後沒有儲存為新的imges的原因,所以第二天再開的時候沒考慮到,壓根就不可能想到嘛。。。
但也因禍德芙。知道了可以檢視log檔案查詢錯誤。
redis.conf裡配置的位置

logfile "/var/log/redis/redis1.log"
35:C 18 Mar 10:04:51.373 # Can't chdir to '/usr/local/redis/data': No such file or directory
39:C 18 Mar 10:21:05.934 # Can't chdir to '/usr/local/redis/data': No such file or directory
46:C 18 Mar 10:29:00.054 # Can't chdir to '/usr/local/redis/data': No such file or directory
48:C 18 Mar 10:37:52.435 # Can't chdir to '/usr/local/redis/data': No such file or directory
53:C 18 Mar 10:42:10.195 # Can't chdir to '/usr/local/redis/data': No such file or directory
56:C 18 Mar 10:42:44.306 # Can't chdir to '/usr/local/redis/data': No such file or directory
30:C 18 Mar 23:35:22.588 # Can't chdir to '/usr/local/redis/data': No such file or directory
54:C 19 Mar 00:09:24.329 # Can't chdir to '/usr/local/redis/data': No such file or directory
60:C 19 Mar 00:11:26.290 # Can't chdir to '/usr/local/redis/data': No such file or directory
61:C 19 Mar 00:11:32.107 # Can't chdir to '/usr/local/redis/data': No such file or directory
63:C 19 Mar 00:13:55.100 # Can't chdir to '/usr/local/redis/data': No such file or directory
64:C 19 Mar 00:14:06.935 # Can't chdir to '/usr/local/redis/data': No such file or directory
74:C 19 Mar 01:03:38.161 # Can't chdir to '/usr/local/redis/data': No such file or directory
75:C 19 Mar 01:04:36.938 # Can't chdir to '/usr/local/redis/data': No such file or directory
78:C 19 Mar 01:05:34.192 # Can't chdir to '/usr/local/redis/data': No such file or directory
79:C 19 Mar 01:06:48.317 # Can't chdir to '/usr/local/redis/data': No such file or directory
83:C 19 Mar 01:07:15.929 # Can't chdir to '/usr/local/redis/data': No such file or directory
84:C 19 Mar 01:07:42.098 # Can't chdir to '/usr/local/redis/data': No such file or directory
85:C 19 Mar 01:09:24.167 # Can't chdir to '/usr/local/redis/data': No such file or directory
87:C 19 Mar 01:09:42.920 # Can't chdir to '/usr/local/redis/data': No such file or directory
95:C 19 Mar 01:11:27.031 # Can't chdir to '/usr/local/redis/data': No such file or directory
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 7001
 |    `-._   `._    /     _.-'    |     PID: 100
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

100:M 19 Mar 01:18:27.712 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
100:M 19 Mar 01:18:27.713 # Server started, Redis version 3.2.8
100:M 19 Mar 01:18:27.713 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
100:M 19 Mar 01:18:27.713 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
100:M 19 Mar 01:18:27.713 * The server is now ready to accept connections on port 7001
                _._                                                  

看這滿屏的 Can’t chdir to ‘/usr/local/redis/data’: No such file or directory,瞬間明白redis.conf出錯的原因。出現其它問題也可以檢視日誌檔案來找出問題的源頭。

其實還有遇到挺多小問題的,就不一一列舉了。