Docker部署Web单体应用

前言

本文中描述的是一个典型的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、微服务等技术搭建适用于中小型研发团队的研发生态体系”相关的内容

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • 前两篇东西,我们分别介绍了Mesos和Dockers的安装和使用。在《Mesos实战》这篇的结尾,我说过将会介绍如...
    燕京博士阅读 1,286评论 0 2
  • Docker从2013年发布第一个版本以来,已经火遍全球,技术迭代也比较频繁,其周边产品和技术也越来越丰富。Doc...
    归海听雪阅读 12,245评论 7 44
  • 昨晚终于有了空闲时间,二话不说就和朋友相约去看口碑极好的《天才枪手》。开始时可乐喝的有点多,想上洗手间,可硬是忍着...
    玎町阅读 238评论 0 0
  • 空荡荡的大厅里,只有靠左的那个房间里点开了耀眼白织灯,亮白的灯光透过玻璃墙射向走廊那边的空场,光线不够长,可足够亮...
    程景至阅读 448评论 2 5
  • “酿”作为名词时,指一门手艺,是匠人制酒的过程;“酿”作为动词时,是对制酒过程的漫长等待; 一瓶纯粹的酱酒,都要经...
    酢客阅读 627评论 1 2