通过docker部署应用入门

本篇文章主要介绍了docker部署应用的基础背景知识和轮廓,适用于没有用过docker的人。

Part 1: 假设需要部署的项目依赖

假设需要部署一个前端+后端项目,涉及到的依赖有以下这些:

依赖 类型 版本 备注
操作系统 centos/ubuntu 底层操作系统
数据库 mysql/mongo/pgsql 数据库DBMS
缓存操作 redis集群 缓存数据库
进程管理 supervisor 负责web项目的重启,监听
web容器 nginx/tomcat 用来承担一个web前端容器
消息队列 kafka集群 数据的异步处理
应用监控 Prometheus 应用数据采集与告警
分布式微服务 consul/etcd 微服务注册与发现
外部网关 nginx 反向代理与负载均衡

Part2:传统方式直接物理机上部署

需要手动在特定的物理机上手动安装所有需要的环境,且需要在进行迁移时所有操作全部重来一次。这个过程费时费力,而且还会因为某些环境的不同需要做不同的适配。而且很难做到计算资源的动态分配,比如单位为某个服务分配CPU,内存等。

Part3:虚拟机 vs Docker

为了解决上述传统方式直接在物理机部署应用上的缺点,业界出现了很多虚拟化技术。比如比较著名的虚拟机就有virtual boxvmware,安装好虚拟机后会有一个虚拟机的后台守护进程来管理所有的虚拟进程。

组件 作用
Infrastructure 我们的硬件设备
Host Operating System 即主机的操作系统,需要在虚拟机中安装一个完整的系统镜像
Hypervisor 虚拟进程管理,比如win10的hyper-v,可以实现在一个虚拟机上安装多个不同的操作系统
Guest Operating System 虚拟主机的操作系统,可以是windows,linux等
Dependencies 部署应用所需要的各种依赖环境
应用 应用本身

一般来说虚拟机的出现实现了在一台物理主机上同时运行多个隔离系统,即相当于从一台物理主机虚拟化出来了多台不同虚拟主机。相比传统方式,在资源利用上得到了质的提高。

但是,由于一个虚拟主机里边安装的是一个完整的操作系统,所以仅仅开机操作就和物理机没有区别,如果安装一个windows的操作系统,如果限制的内存和CPU等资源较少,仅仅开机就可能需要几十秒甚至几分钟。所以虚拟机在部署应用上有非常大的缺点:

  • 体态臃肿
  • 占用资源多
  • 首次部署理论上依然需要在虚拟机内部手动安装各种环境依赖

那有没有一种可能,直接剔除掉虚拟主机中不需要的东西,只留下跑应用需要的就好了,有没有一种可能,直接通过简单的命令脚本的方式来自动安装各种依赖,从而避免每次新部署项目或者迁移项目的时候都需要手动操作的尴尬?答案是有的,那就是docker。

docker是一种更新的虚拟化技术,本身采用golang编写,是云计算大环境下不可或缺的一部分。相比于虚拟机,docker支持通过自定义系统镜像的方式来进行按需虚拟化。比如只需要一个阉割版的系统内核,只需要安装项目环境需要的依赖,剔除其他不必要的东西。

Part4: 什么是docker

访问官网https://www.docker.com/可以了解关于docker的一切内容。官网首页有个简单粗暴的介绍:

Securely build, share and run any application, anywhere

这里和虚拟机的架构,少去了容器操作系统的这个步骤,因为容器的操作系统,直接通过定制镜像的时候就已经决定了。docker有个非常经典的层级概念,即镜像是通过一层一层构建上去的,而定制,则是通过Dockerfile来决定的。比如一个基础班的系统镜像:

FROM ubuntu:latest

那么这个镜像就具备了Ubuntu这个操作系统,我们只需要在这个基础镜像上添加我们需要的依赖就可以了。

Part5:docker三剑客

docker有三个比较著名的容器编排技术:

  • 如果需要在一个docker deamon上同时部署多个容器,可以使用docker-compose
  • 如果需要在多个docker deamon上同时部署一个或者多个容器,可以使用docker-swarm
  • 如果需要在多个不同的操作系统上使用docker,可以使用docker-machine

当然还有在dockder的基础上发展出来的更为复杂的内容编排技术:k8s

赞赏我吗