美文网首页docker
Docker部署Web单体应用

Docker部署Web单体应用

作者: 10_01 | 来源:发表于2017-06-29 05:41 被阅读51次

    前言

    本文中描述的是一个典型的Web单体应用部署场景,不涉及任何业务系统,在具体项目中使用此部署方案时,针对所部署产品的不同,各个环节都存在可能的优化点。

    目标

    • 降低产品运维的复杂度,提升运维效率
    • Build once,Run anywhere;Configure once,Run anything
    • 集群高可用,无单点故障
    • 适用于中小规模的单体Web后端服务系统的典型部署场景
    • 向微服务架构体系转型过程中,将Docker融入遗留单体架构的系统,先将已有产品“容器化”,再逐步将产品“微服务化”

    典型Web应用部署视图

    典型Web应用部署视图

    环境说明

    • 系统
      基于Linux Kernel 3.10以上的64位发行版,本文采用CentOS-7.3.1611-x86_64-Minimal,默认内核3.10.0-514.el7.x86_64
    • Docker
      要求docker 1.12以上的版本
      由swarm管理的docker集群中,每台物理机中需要安装相同版本的docker
      Docker的安装详见附录中的"安装Docker"章节
    • 物理机(2台)
    hostname ip interface
    HostA 10.0.0.1 ens33
    HostB 10.0.0.2 ens33

    在两台主机中分别安装CentOS系统,并在系统中安装Docker

    • Docker镜像中心
      使用私有镜像中心保存业务系统镜像
      镜像中心地址:10.0.0.222:5000

    • Docker镜像

    镜像名称 镜像说明
    10.0.0.222:5000/web-app:v1.0 可运行的应用系统
    10.0.0.222:5000/custom-nginx:v1.0 自定义的Nginx

    关于镜像的制作,请参考附录中的相关章节

    • 系统设置
      为了便于演示,对操作系统进行了如下操作:
      在生产环境中,只需开启相关端口即可

    关闭防火墙

    #查看防火墙状态
    

    firewall-cmd --state

    停止防火墙

    systemctl stop firewalld.service

    禁止防火墙开机启动

    systemctl disable firewalld.service

    关闭SELINUX
    

    setenforce 0
    vi /etc/sysconfig/selinux

    编辑/etc/sysconfig/selinux文件,将SELINUX设置为disabled

    操作步骤

    1、安装Linux系统

    2、在系统中安装Docker

    步骤1和步骤2可参考环境说明章节中的相关操作

    3、部署高可用集群(可选)

    在需要部署高可用的集群主机中,使用keepalived+ipvsadm,将多台物理机通过虚拟IP,提供给使用者一个唯一的IP地址,同时通过keepalived实现“单机房”内的高可用。多机房(异地多活)部署,建议增加域名解析

    • 安装 ipvsadm 和 keepalived.
    yum -y install ipvsadm keepalived
    #开启IP数据包转发
    echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
    sysctl -p
    #开启ipvsadm
    touch /etc/sysconfig/ipvsadm
    systemctl start ipvsadm
    systemctl enable ipvsadm
    
    • 配置keepalived
      集群中的每台物理主机均需配置keepalived.conf 每台主机的配置文件仅state和priority参数不同,其余配置均相同
    mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org
    vi /etc/keepalived/keepalived.conf
    

    <b>keepalived.conf 配置文件示例</b>(注意注释中需要修改的地方)

    global_defs {
        router_id LVS_DEVEL
    }
    vrrp_instance VI_1 {
        #一个MASTER,其它节点为BACKUP
        state MASTER
        #根据实际情况修改
        interface ens33
        #集群标识(确保在局域网内与其它集群不同),数值范围(0,255)
        virtual_router_id 123
        #优先级(确保相同集群中priority值的高低不同)
        priority 200
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass inspur
        }
        virtual_ipaddress {
            #虚拟IP
            10.0.0.100/16
        }
    }
    #虚拟IP
    virtual_server 10.0.0.100 8090 {
        delay_loop 6
        lb_algo rr
        lb_kind DR
        nat_mask 255.255.0.0
        persistence_timeout 0
        protocol TCP
        real_server 127.0.0.1 8090 {
            weight 100
            TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 8090
            }
        }
    }
    
    • 设置keepalived启动并默认开机启动
    systemctl start keepalived
    systemctl enable keepalived
    

    !!!如果您是在本地虚拟机中部署,并且真实部署环境使用的虚拟机,现在可以上传至真实运行环境了,后面的配置会涉及到主机的IP

    4、部署Docker集群

    若使用私有镜像中心,且镜像中心不支持HTTPS,则需要做如下修改

    # 在pull主机中的”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入
    { "insecure-registries":["10.0.0.222:5000"] }
    # 保存退出后,重启docker
    systemctl restart docker
    

    物理机集群中选择需要搭建Docker集群主机,使用Swarm对当前物理机集群中安装Docker的主机集群化。加入Swarm管理的Docker主机节点,将受Swarm调度、编排。
    本示例中使用一个Swarm管理节点(Manager)和一个Swarm工作节点(Worker),在实际使用中,可以建立多个Manager节点,Manager同时也是Worker,Worker后期也可以动态指定为Manager

    • 初始化
      选择一个主机,启动Swarm模式,保存初始化后打印的Token,因为在节点加入时要使用Token作为通讯的密钥
      这里要注意的是IP地址,如果你的worker节点部署在远程的VPS上,那么你应该给个远程的外网可以访问的IP地址,在多网卡的机器上需要注意这个问题
      如果你的机器只有一个 IP 地址,可以省略--adbertise-addr选项,docker 会自动选择正确的 IP
    docker swarm init --advertise-addr 10.0.0.1
    
    • 将其它物理机节点加入到Swarm集群
    docker swarm join \
    --token SWMTKN-11m0u46krm5khxd7a46ugyxbsg16nqse8r8r0fdprv1zkvm99kj2sq8vm12ho9gqi3hwowbunugw \
    10.0.0.1:2377
    #此处IP为Swarm管理节点的IP
    
    • 在manager节点查看节点列表
    docker node ls
    

    5、部署应用

    • 创建Docker内部网络
      创建一个名字为"myoverlay"的内部Docker网络,用于Docker容器间通讯,运行时,指定相同overlay网络的容器之间可以互相连通,容器内可以使用服务运行时指定的名称进行访问(Docker内部DNS)
    docker network create -d overlay myoverlay
    
    • 部署api-portal
      在Swarm Manager节点部署公共接口服务,服务数量为4个,指定名字为“backend”(注意:此处名字与自定义的nginx的default.conf配置中的proxy_pass对应),指定运行在myoverlay网络中,可以不公布端口至宿主机(此处为了方便演示,加上了--publish 8081:8080参数,公布了容器内部的tomcat端口)
    docker service create --replicas 4 --name backend --network myoverlay --publish 8081:8080  10.0.0.222:5000/web-app:v1.0
    
    • 部署Nginx
      在manager节点部署nginx服务,服务数量为2个,指定名字为“iNginx”,指定运行在myoverlay网络中,公开指定端口是8090映射容器80,使用自定义的nginx镜像
    docker service create --replicas 2 --name iNginx --network myoverlay --publish 8090:80  10.0.0.222:5000/custom-nginx:v1.0
    

    6、Enjoy

    访问10.0.0.100:8090/api-portal/,请求将会负载均衡在两台物理机中的2个Nginx实例,Nginx将请求转发,负载均衡至4个backend中。

    后续运维

    使用Docker Swarm可以支持如下运维场景:

    • 服务健康监测。服务挂掉后,Swarm将根据设定的服务数量,自动在集群内将服务恢复至设定值。
    • 使用命令扩展或缩减服务,增加负载
    docker service scale iNginx=3
    
    • 服务滚动升级,失败自动回滚
    • 待发现……

    附录

    安装Docker

    使用官方安装步骤,摘录如下:
    下列摘录为Docker最初的文档版本,适用于测试环境中安装Docker,现在官网中看到的文档,增加了对生产环境的相关安装及操作步骤

    You can install Docker CE on CentOS in just three steps.
    Prerequisites
    Docker CE is supported on CentOS 7.3 64-bit.
    1. Set up the repository
    Set up the Docker CE repository on CentOS:

    sudo yum install -y yum-utils
    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum makecache fast
    

    2. Get Docker CE
    Install the latest version of Docker CE on CentOS:

    sudo yum -y install docker-ce
    

    Start Docker:

    sudo systemctl start docker
    sudo systemctl enable docker
    

    3. Test your Docker CE installation
    Test your installation:

    sudo docker run hello-world
    

    关于本文所涉及镜像的制作

    10.0.0.222:5000/custom-nginx:v1.0

    <b>default.conf 配置文件示例</b>(注意注释中需要修改的地方)

    server {
        listen 80;
        server_name localhost;
        location / {
            proxy_pass http://backend:8080;
            #此处backend对应创建Swarm服务时(docker service create)指定的名称
            #8080端口对应所创建的Swarm服务内部容器的服务端口
        }
    }
    

    操作步骤

    #运行Nginx官方镜像
    docker run -it nginx:1.12 /bin/bash
    #修改Nginx的default.conf配置文件
    cd /etc/nginx/conf.d/
    mv default.conf default.conf.bak
    touch default.conf
    #写入配置文件
    echo "server {" >> default.conf
    echo "listen 80;" >> default.conf
    echo "server_name localhost;" >> default.conf
    echo "location / {" >> default.conf
    echo "proxy_pass http://backend:8080;" >> default.conf
    echo "}" >> default.conf
    echo "}" >> default.conf
    #退出容器
    exit
    #制作镜像
    docker commit <容器ID> 10.0.0.222:5000/custom-nginx:v1.0
    #上传镜像至私有镜像中心
    docker push 10.0.0.222:5000/custom-nginx:v1.0
    

    10.0.0.222:5000/web-app:v1.0

    <b>Dockerfile 示例</b>

    FROM tomcat:9.0.0.M21-jre8
    MAINTAINER Zhaozy
    COPY api-portal-1.0.0-SNAPSHOT.war /usr/local/tomcat/webapps/api-portal.war
    
    • 将Dockerfile文件和api-portal-1.0.0-SNAPSHOT.war包拷贝到某个目录内,在目录内执行
    docker build -t 10.0.0.222:5000/web-app:v1.0 .
    
    • 上传镜像至私有镜像中心
    docker push 10.0.0.222:5000/web-app:v1.0
    

    使用CI(持续集成)+ Docker Compose,可以简化业务系统的部署,后续再整理“使用容器、CI、微服务等技术搭建适用于中小型研发团队的研发生态体系”相关的内容

    相关文章

      网友评论

        本文标题:Docker部署Web单体应用

        本文链接:https://www.haomeiwen.com/subject/jgajcxtx.html