下图是一个比较传统的软件架构:java
作过java的同窗可能对上图的架构方式比较了解,咱们一般会将一个应用程序生成一个war包,放到一个tomcat容器当中并在一台虚拟机(VM)中启动运行,而后配置nginx的负载均衡策略,未来自用户的请求转发到某个tomcat应用上,这种基于主机或虚拟机部署的应用会存在如下几个问题:nginx
须要事先安装应用所须要的运行环境,好比java应用所须要的jdk或者jre,若是须要从新部署一个应用,就须要从新初始化环境再安装应用,过程繁琐; 另外若是一个应用须要jdk7的运行环境另一个应用须要jdk8,那在一台主机上就很难知足;docker
若是tomcat应用自己或者所在的虚拟机操做系统出现问题时,则须要人工干预,好比配置nginx转发规则、执行重启操做等;tomcat
应用的负载有高有低,不够稳定,当前应用负载大的时候,咱们须要增长应用的数量,当应用负载下降的时候,咱们须要下降应用的数量;服务器
若是一台虚拟机部署多个应用,不一样的应用或者进程之间会相互影响;网络
...架构
咱们接下来就来看一下咱们是如何一步步的解决这些问题的。app
首先是容器化,咱们选择的方案是Docker。负载均衡
Docker将应用程序与该程序的依赖,打包成一个容器镜像,运行这个文件就会生成虚拟容器。程序在这个虚拟容器里运行,就好像运行在真实的物理机上,而且每一个容器之间资源互相隔离并且都有本身的文件系统,这样容器之间进程不会相互影响,能够经过下图来进行对比基于虚拟机和基于容器部署应用的区别:ui
Docker是客户端-服务器架构的应用,主要由如下部分组成:
服务端是一个名为dockerd守护进程,用来监听REST API请求并管理Docker对象,好比镜像、容器、存储卷及网络等。
命令行客户端(CLI),也就是咱们日常在控制台输入的docker命令行,经过调用REST API进行控制Docker daemon或者同其进行集成。
镜像仓库(Docker Registries),镜像仓库用来存储Docker镜像。
如下是Docker的架构示意图:
IMAGES
镜像通常是经过指令建立的只读文件,用来生成容器。通常一个镜像是基于另一个镜像并添加一些额外的指令建立的,能够经过一个名为Dockerfile的文件来生成一个镜像,在Dockerfile中的每一行指令会生成一层(layer)。当Dockerfile有改动须要从新生成镜像时,只须要从新生成改变的那些层就能够,这样就可使得镜像文件更加轻量、快速构建。
CONTAINERS
容器是经过镜像文件生成的运行实例。能够经过REST API或者docker client进行建立、启动、中止、移动或者删除一个容器。
SERVICE
用来管理和扩展多个容器,须要同docker swarm一块儿工做
Docker采用go语言编写,而且使用了Linux内核中的几个特性来实现其功能,主要有以下:
Namespaces
Docker经过Namespaces来提供隔离的工做空间(Workspace),当你运行一个容器的时候,Docker为这个容器建立了数个不一样类型的Namespaces,主要有如下类型:
pid namespace:提供进程隔离功能
net namespace:管理网络接口
ipc namespace:内部资源访问控制 (IPC:Inter Process Communication)
mnt namespace:管理文件系统挂载
uts namespace: 内核隔离以及版本识别(UTS:Unix Timesharing System)
CGroups(Control Groups)
Docker经过CGroup来限定容器只能使用特定的资源。举例来说,Docker能够限制某个容器只能使用多少cpu及内存资源。
UnionFS(Union File System)
一种文件系统类型,能够运行在其余文件系统上,经过建立不一样的层来使得容器文件系统更加轻量和快速。还有其余几种相似的文件系统,包括AUFS、btrfs、vfs和DeviceMapper。
如下命令是在Centos7上的命令,其余操做系统会存在一些差别
yum install docker:经过yum下载docker相关的依赖 systemctl enable docker: 开机运行systemctl start docker: 启动docker服务
执行完上述操做,docker服务已经在运行了,能够经过执行 docker version 和 docker info 命令查看docker的版本以及相关的信息。
4.1 Dockerfile文件
咱们以前有提到Docker能够将应用程序打包成一个镜像,那么如何生成镜像文件呢?这就须要用到Dockerfile文件。它是一个文本文件,用来配置镜像,Docker根据该文件生成二进制的镜像文件。如下是一个Dockerfile文件示例:
# 该镜像文件继承官方的nginx镜像,冒号表示标签,这里标签是latest,表示最新的版本 FROM nginx:latest # 将_book目录下的文件copy至镜像文件的/var/www/public目录 COPY _book /var/www/public/ COPY nginx_app.conf/etc/nginx/conf.d/ nginx_app.conf # 将容器的8080端口暴露出来,容许外部链接这个端口 EXPOSE 8080 # 容器启动后执行 nginx -g daemon off 命令 CMD ["nginx", "-g", "daemon off;"]
4.2 建立镜像文件
有了Dockerfile文件之后,就能够用docker build命令建立镜像文件了。
docker build -t zcloud-document:0.0.1. docker image ls
若是运行成功,就能够看到新生成的镜像文件zcloud-document了。
4.3 生成容器
# 生成容器 docker run -p 8080:8080 -it zcloud-document:0.0.1 docker ps # 从新生成一个新的镜像标签,并指向原来的镜像 docker tag zcloud-document:0.0.1 10.0.0.183:5000/zcloud/zcloud-document:0.0.1 # 推送到私有镜像仓库 docker push 10.0.0.183:5000/zcloud/zcloud-document:0.0.1
关于Docker其余的一些操做命令,你们能够自行查阅,网上介绍的文章也比较多,参考文章:Docker 入门教程(https://docs.docker.com/get-s...)