一.pip管理工具安裝
docker-compose是python項目,所以安裝需要通過python下的包管理工具pip安裝。一般linux服務器都會預安裝有python環境,所以優先檢查python是否已經安裝,pip管理工具是否已經安裝
# wget https://bootstrap.pypa.io/get-pip.py #下載pip腳本
# python2.7 get-pip.py #將pip綁定到python2.7中
# pip install --upgrade pip #更新pip
# pip install docker-compose==1.22 #安裝指定版本的docker-compose
# docker -v
Docker version 18.09.0
當安裝docker-compose可能遇到一些錯誤提示,如:自動刪除request包失敗時可以通過pip install --ignore-installed request命令忽略安裝request包再安裝docker-compose
二.資料准備
創建目錄如/workdir作為redis容器的工作目錄。在/workdir中創建redis-master.conf(主reids配置文件)、redis-slave.conf(從reids配置文件)、redis-master.sh(主容器的redis啟動腳本)、redis-slave.sh(從容器的redis啟動腳本)
redis-master.conf主要配置如下:
################################## NETWORK ##################################### bind 0.0.0.0 port 6379 ################################## SECURITY ################################### requirepass 1 ################################# REPLICATION ################################# masterauth 1 #以防以后使用哨兵切換主節點后連接不到新主節點
redis-slave.conf主要配置如下:
################################## NETWORK ##################################### bind 0.0.0.0 port 6379 ################################## SECURITY ################################### requirepass 1 ################################# REPLICATION ################################# slaveof 172.20.0.2 6379 #指定主節點的ip masterauth 1
redis-master.sh代碼如下:
#!/usr/bin/bash redis-server /workdir/redis-master.conf
redis-slave.sh代碼如下:
#!/usr/bin/bash redis-server /workdir/redis-slave.conf
准備docker-compose編排文件,由於當前docker引擎版本是18.09.0所以這里version使用3.7版本
version: "3.7" services: redis-master: image: redis container_name: redis-master stdin_open: true tty: true networks: redis: ipv4_address: 172.20.0.2 volumes: - "/workdir:/workdir" expose: - "6379" command: ["/bin/bash","/workdir/redis.sh"] redis-slave: image: redis container_name: redis-slave stdin_open: true tty: true depends_on: - redis-master networks: redis: ipv4_address: 172.20.0.3 volumes: - "/workdir:/workdir" expose: - "6379" command: ["/bin/bash","/workdir/redis.sh"] networks: redis: driver: bridge ipam: driver: default config: - subnet: 172.20.0.0/16
執行編排文件。
# docker-compose up -d Creating network "docker-compose_redis" with driver "bridge" Creating redis-master ... done Creating redis-slave ... done # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f586ac5a1b8 redis "/bin/bash /workdir/…" 11 seconds ago Up 10 seconds 6379/tcp redis-slave 354d20e933bf redis "/bin/bash /workdir/…" 11 seconds ago Up 10 seconds 6379/tcp redis-master
備注:
1.如果在編排文件測試的過程中遇到error等錯誤,經重新編寫后不能馬上執行docker-compose up -d執行編排任務。因為之前的命令中很可能已經創建了指定的容器或網絡等。需要執行 docker-compose down先停掉編排任務再執行 docker-compose up -d執行編排任務。
2.寫編排文件的時候曾經踩了一個大坑,容器建立完后使用bash腳本啟動主、從redis服務時曾經嘗試公用一個配置文件來啟動。后來一台啟動成功一台啟動不成功。經過docker logs redis-slave查看日志后發現是
':C 15 Dec 09:43:39.423 # Fatal error, can't open config file '/workdir/docker-compose/redis-master.conf
經過測試發現當一個redis服務通過一個配置文件啟動后會把該配置文件的權限修改並且在服務執行的過程中會主動根據環境配置(如:哨兵或客戶端設置環境變量時)的變動修改配置文件的值。所以兩個redis服務不能共用一個配置文件,需要獨立擁有自己的配置文件。
3.根據上面的道理,在容器的使用過程中,不同容器盡量不要共用同一個文件或腳本,盡量分開使用,盡管使用的腳本內容一樣也不要自己去跳這些坑。