docker-compose编排项目redis容器实现主从复制

一.pip管理工具安装python

  docker-compose是python项目,因此安装须要经过python下的包管理工具pip安装。通常linux服务器都会预安装有python环境,因此优先检查python是否已经安装,pip管理工具是否已经安装linux

  

# 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-composeredis

二.资料准备docker

  建立目录如/workdir做为redis容器的工做目录。在/workdir中建立redis-master.conf(主reids配置文件)、redis-slave.conf(从reids配置文件)、redis-master.sh(主容器的redis启动脚本)、redis-slave.sh(从容器的redis启动脚本)bootstrap

  redis-master.conf主要配置以下:bash

  

################################## 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代码以下:python2.7

#!/usr/bin/bash
redis-server /workdir/redis-slave.conf

 

   准备docker-compose编排文件,因为当前docker引擎版本是18.09.0因此这里version使用3.7版本tcp

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.根据上面的道理,在容器的使用过程当中,不一样容器尽可能不要共用同一个文件或脚本,尽可能分开使用,尽管使用的脚本内容同样也不要本身去跳这些坑。

相关文章
相关标签/搜索