運用 docker 實作 redis 的 master slave

  • 1470
  • 0
  • 2016-06-18

本篇是使用 docker 來模擬 redis 的 master slave 叢集,不過容器都是放在同一台機器上執行

  • 實作環境與相關套件

    • 作業系統:Ubuntu Server 14.04 LTS 64bit
    • Docker 版本:1.11.2
    • Docker Image: Redis
  • 預先準備

    • 首先先把含有 redis 的映像檔從 docker hub 上抓下來
    • $ docker pull redis
    • 然後檢查本機是否已經安裝好含有 redis 的映像檔
    • $ docker images
      如果有出現下列資訊就表示含有 redis 的映像檔已經裝好了
  • 開始實作

    • 由於之後還需要對各個容器進行設定,所以統一執行的指令為/bin/bash,並且為每個容器配給一個終端機
    • 先將所需要的容器開起來並且建立容器間的關聯

      • 首先先用一個終端機啟動一個 redis 容器作為 master
      • $ docker run -it --name redis-master redis /bin/bash
      • Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      • OPTIONS
            -i, --interactive               Keep STDIN open even if not attached
            -t, --tty                           Allocate a pseudo-TTY
            --name                          Assign a name to the container
      • 然後再用另一個終端機啟動另一個 redis 容器作為 slave 並且設定連結連到 master
      • $ docker run -it --name redis-slave --link redis-master:master redis /bin/bash
      • OPTIONS
            --link=[]                       Add link to another container
      • 這時開啟另一個終端機查看目前共有那些 container 正在執行中
      • $ docker ps -a

        這邊應該會看到

      • 並且在 redis-slave 裡面查看 hosts 設定
      • $ cat /etc/hosts

        這邊就可以看到有關於 redis-master 的連線設定

    • 啟動容器內的 redis server 並且設定 master slave

      • redis 啟動時需要先給 redis.conf 檔給 redis-server,但 redis 的容器裡面並沒有這個設定檔,所以需要先從下載下來,再對設定檔內進行叢集的設定,但是容器裡面通常都沒有安裝編輯器 (為了保持容器的輕量化),所以就先在主機下載下來並且編輯完之後再透過 volume (主機和容器的共享資料夾) 將設定檔傳給容器
      • 下載 redis 設定檔
      • $ wget http://download.redis.io/redis-stable/redis.conf
      • 先對 redis.conf 進行 redis-master 的設定
      • # bind 127.0.0.1
        protected-mode no
        daemonize yes
      • 找到 redis-master 跟主機對應的 volume
      • $ docker inspect --format="{{range .Mounts}}{{.Source}}{{end}}" redis-master

        因為 redis 的映像檔裡面已經整合了 volume 的掛載指令,不然一般在啟動容器的時候還需要多加一個參數 -v 來掛載 volume

      • 將檔案複製到 redis-master 跟主機對應的 volume
      • sudo cp redis.conf $(docker inspect --format="{{range .Mounts}}{{.Source}}{{end}}" redis-master)

        然後在 redis-master 內就能看到

      • 在 redis-master 啟動 redis-server 並且指定 redis.conf 作為啟動用的設定檔

      • $ redis-server /data/redis.conf
      • 再來對 redis.conf 進行 redis-slave 的設定
      • daemonize yes
        slaveof master 6379
      • 將檔案複製到 redis-slave 與主機對應的 volume
      • sudo cp redis.conf $(docker inspect --format="{{range .Mounts}}{{.Source}}{{end}}" redis-slave)

        然後在 redis-slave 內就能看到

      • 在 redis-slave 啟動 redis-server 並且指定 redis.conf 作為啟動用的設定檔
      • $ redis-server /data/redis.conf
      • 如此一來就大功告成囉!!接著只要在 redis-master 新建一個 key 然後就會看到 redis-slave 也有一樣的 key 產生