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