Docker+keepalived+nginx实现主从热备的方法示例

前言

为解决单点故障,我们需要配置主从热备方案,服务器数量有限,故使用Docker模拟安装配置。

本次配置默认已经安装了Docker。

配置环境:centos7 64位

docker版本:Docker version 17.12.1-ce, build 7390fc6

1,拉取centos7镜像

docker pull centos:7

2,创建容器

docker run -it -d --name centos1 -d centos:7

3,进入容器centos1

docker exec -it centos1 bash

4,安装常用工具

yum updateyum install -y vimyum install -y wgetyum install -y gcc-c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum install -y openssl openssl--develyum install -y popt-develyum install -y initscripts
yum install -y net-tools

5,将容器打包成新的镜像,以后直接以该镜像创建容器

docker commit -a 'cfh' -m 'centos with common tools' centos1 centos_base

6,删除之前创建的centos1 容器,重新以基础镜像创建容器,安装keepalived+nginx

docker rm -f centos1
#容器内需要使用systemctl服务,需要加上/usr/sbin/init
docker run -it --name centos_temp -d --privileged centos_base /usr/sbin/init
docker exec -it centos_temp bash

作者:江湖救急
链接:https://juejin.im/post/5dc517386fb9a04a9272110b
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

7,安装nginx

#使用yum安装nginx需要包括Nginx的库,安装Nginx的库
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 使用下面命令安装nginx
yum install -y nginx
#启动nginx
systemctl start nginx.service
#查看是否启动成功,出现nginx欢迎界面表示安装成功
curl 172.17.0.2

8,安装keepalived

1.下载keepalived wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2.解压安装:tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/

3.下载插件openssl yum install -y openssl openssl-devel(需要安装一个软件包)

4.开始编译keepalivedcd /usr/local/keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived

5.make一下 make && make install

9,将keepalived 安装成系统服务

mkdir /etc/keepalivedcp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/然后复制keepalived脚本文件:cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ln -s /usr/local/sbin/keepalived /usr/sbin/可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!

#若启动报错,则执行下面命令
cd /usr/sbin/
rm -f keepalived
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ 

#常用命令
systemctl daemon-reload 重新加载systemctl enable keepalived.service 设置开机自动启动systemctl disable keepalived.service 取消开机自动启动systemctl start keepalived.service 启动systemctl stop keepalived.service停止systemctl status keepalived.service 查看服务状态

10,修改/etc/keepalived/keepalived.conf文件

#备份配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup

rm -f keepalived.conf
vim keepalived.conf
#配置文件如下

vrrp_script chk_nginx {
  script "/etc/keepalived/nginx_check.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 121
  mcast_src_ip 172.17.0.6
  priority 100
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }

  track_script {
    chk_nginx
  }

  virtual_ipaddress {
    172.17.0.100
  }
}

11,添加心跳检测文件

vim nginx_check.sh
#以下是脚本内容
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
  /usr/local/nginx/sbin/nginx
  sleep 2
  if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killall keepalived
  fi
fi

12,给脚本赋予执行权限

chmod +x nginx_check.sh

13,设置开机启动

systemctl enable keepalived.service

#开启keepalived
systemctl start keepalived.service

14,检测虚拟IP是否成功,在宿主机里面执行下面命令,如果出现nginx欢迎界面表示成功

curl 172.17.0.100

15,将centos_temp 容器重新打包成镜像,然后利用这个新镜像再创建两个容器,实现热备效果

docker commit -a 'cfh' -m 'centos with keepalived nginx' centos_temp centos_kn

16,删除所有容器

docker rm -f `docker ps -a -q`

17,用centos_kn 镜像创建主服务器容器

docker run --privileged -tid --name centos_master --restart=always centos_kn /usr/sbin/init

docker exec -it centos_master bash

18,修改centos_master里面nginx 欢迎页,

vim /usr/share/nginx/html/index.html

19,创建从服务器容器

docker run --privileged -tid --name centos_slave --restart=always centos_kn /usr/sbin/init
docker exec -it centos_slave bash

#修改keepalived.conf 配置文件,主要是state和priority两个参数的调整,其中master节点的priority值一定要比slave大才行

vrrp_script chk_nginx {
  script "/etc/keepalived/nginx_check.sh"
  interval 2
  weight -20
}

vrrp_instance VI_1 {
  state SLAVE
  interface eth0
  virtual_router_id 121
  mcast_src_ip 172.17.0.6
  priority 80
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }

  track_script {
    chk_nginx
  }

  virtual_ipaddress {
    172.17.0.100
  }
}

20,修改完成之后重新加载

systemctl daemon-reload
systemctl restart keepalived.service

21,修改nginx欢迎页(若nginx没启动则执行 systemctl start nginx.service)

vim /usr/share/nginx/html/index.html

22,测试

A> 分别在宿主机,centos_master,centos_slave中进行一下命令测试,如果显示都为Master的欢迎页面,说明配置成功1/3

curl 172.17.0.100

B> 此时停止centos_master容器( docker stop centos_master ),保留centos_slave容器,执行以下命令,若切换到Slave页面,则说明keepalived配置成功2/3

curl 172.17.0.100

C> 重启centos_master 容器,此时执行以下命令,看是从Slave切换到了Master,如果切换成功,说明我们配置到此成功了。

curl 172.17.0.100

说明,测试过程中,重启容器之后,nginx没有启动,需要进入容器启动一下,不然访问不到Master页面了,但是可以Ping通。

执行下面命令,配置nginx随机启动,这样不用每次重启容器还需要手动启动nginx

chkconfig nginx on

以上就是整个配置过程,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 利用Docker制作Nginx+PHP镜像的步骤详解

    前言 这篇文章给大家介绍的是使用Docker制作nginx+php的镜像,本文里的镜像是centos + nginx 1.9.7 + php 5.6.14,下面话不多说,直接看实现的步骤吧. 1.首先下载到nginx和php: nginx-1.9.5.tar.gz 下载:http://nginx.org/en/download.html php-5.6.14.tar.gz   下载:>http://php.net/downloads.php 2.以及扩展包so: memcache-2.2.4.t

  • docker中编译nodejs并使用nginx启动

    1.编译Nodejs 要进行Nodejs编译,使用docker就变得非常的方便了. 首先从hub.docker.com下载最新的镜像.https://hub.docker.com/_/node/ 一般的项目都使用的是node6的镜像. docker pull node:6-alpine 然后就可以直接使用npm install了. Alpine是一个非常小的操作系统,在编译,运行docker非常喜欢使用这个系统,因为小,占用磁盘小,下载速度快,部署也快. 节省磁盘空间,节省部署时间. 2.使用d

  • Docker容器中运行nginx

    nginx简介 Nginx是一款面向性能设计的HTTP服务器,相较于Apache.lighttpd具有占有内存少,稳定性高等优势.与旧版本(<=2.2)的Apache不同,nginx不采用每客户机一线程的设计模型,而是充分使用异步逻辑,削减了上下文调度开销,所以并发服务能力更强.整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活. 在Linux操作系统下,nginx使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高.同时Nginx在OpenBSD或FreeBSD

  • docker下安装Nginx的方法

    一. 环境说明 docker: 18.03.1-ce nginx: 1.15.1 二. 拉取最新的 Nginx 镜像 拉取镜像 $ docker pull nginx 查看当前镜像 $ docker images # 查询结果: REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 8b89e48b5f15 7 hours ago 109MB 三. 准备工作 本次将web服务部署在 /srv/web 目录下: 3.1 创建 /srv/web 目录 并

  • 滚动 docker 中的 nginx 日志思路详解

    docker使用 1. docker ps 查看运行中的容器 2. docker images 查看docker镜像 3. docker rm id(容器id)  删除容器(容器id可以通过docker ps查看,容器必须停止后才能删除) 3.1 删除全部的容器 docker rm `docker ps -a -q` 4. docker stop  id(容器id) 停止容器运行 5. docker rmi  id(镜像id) 删除镜像 6. docker pull ubuntu:16.04(镜

  • CentOS7 Docker Nginx部署及运行详解

    网上找了一些资料部署,出现不一样的问题,现在总结一下自己的部署流程. 1.资源准备 Dockerfile文件 # "ported" by Adam Miller <maxamillion@fedoraproject.org> from # https://github.com/fedora-cloud/Fedora-Dockerfiles # # Originally written for Fedora-Dockerfiles by # scollier <scol

  • Docker中运行nginx并挂载本地目录到镜像中的方法

    1 从hup上pull镜像 docker pull nginx 2 创建将要挂载的目录 mkdir -p /data/nginx/{conf,conf.d,html,logs} 3 先要有配置文件才能启动容器 3.1 vim /data/conf/nginx.conf user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_co

  • 详解利用nginx和docker实现一个简易的负载均衡

    测试步骤: 1.在服务器中搭建一个nginx服务器并启动,具体过程可参考 http://www.jb51.net/article/94483.htm,这里不在建立 2.在docker中从源中拉一下nginx的官方镜像,docker pull nginx,留着备用 3.在本地目录新建两个文件夹,我这里的新建在/mydata/test1,/mydata/test2/ 4.分别在两个test文件夹中新建index.html来标志,在第一个html中输出this is nginx1,在第二个html中输

  • Docker新手实践及部署NGINX的步骤详解

    docker是什么 官方文档入口 在知乎上看到关于docker的思想讲的挺好的:如何通俗解释Docker是什么?.这里直接引用了. Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响.那么我就不需要专门运送水果的船和专门运送化学品的船了.只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走. docker就是类似的理念.现在都流行云计算了,云计算就好比大货轮.docker

  • docker nginx 部署多个项目的示例方法

    前提条件 1.本地电脑和服务器已安装 docker,下载方法自行谷歌吧 2.在 docker hub 上已有账号, 注册传送门: https://hub.docker.com/ 3.需要对 docker 已有所熟悉 ,并了解Dockerfile里的一些指令 使用Dockerfile 制作镜像 假如本机有一个叫web的项目 在web根目录下新建Dockerfile,写入以下内容 FROM nginx:1.13.6-alpine LABEL maintainer="lilywang <lily

  • docker nginx 运行后无法访问的问题解决

    ## 1 最近在学docker部署,一开始打算将nginx先docker化的. 对照官方的docker镜像介绍说明,进行自定义配置 将官方的nginx.conf复制出来后,修改添加了一些自定义,主要是屏蔽了default.conf,以及include文件夹 sites-available # include /etc/nginx/conf.d/.conf; include /etc/nginx/sites-available/; 官方原先配置 user nginx; worker_process

随机推荐