Docker

什么是容器化技术

应用部署演化主要分为三个阶段:

  • 物理机时代

  • 虚拟机时代

  • 容器化时代

物理机时代

file
  • 经济成本较高:物理服务器硬件成本高,不易于维护

  • 受制于硬件:内存、CPU能力提升有限

  • 部署成本较高:主机存放、系统安装、程序环境、应用部署多个步骤

  • 资源浪费:应用对硬件的要求不一,可能造成磁盘浪费,或者是cpu的浪费

  • 难于扩展和迁移:比如增加内存、主机迁移、操作系统更换等

虚拟化时代

file

相比较物理机,虚拟化可以让物理机的资源得到最充分的应用。多个虚拟机运行在同一个物理机上。常用的虚拟化软件有VMware、KVM等。

  • 多部署:一台物理机可以创建多个虚拟机

  • 资源池:物理机的硬件资源被Hypervisor抽象为一个资源池,资源池中的资源可以被动态分配给每个虚拟机

  • 资源隔离: 每个虚拟机的资源都是独立的,有自己的软件和硬件资源,不会相互影响

  • 很容易扩展:资源可被随时扩展和缩减(比如给VM1分配2核2g内存),虚拟机可以随时创建

  • VM需要安装操作系统:较小的应用部署在一个VM上,会造成操作系统层面的资源浪费

容器化时代

file

相较于虚拟机,容器不会打包操作系统,所以每个容器所占用的资源是变小的。容器底层依赖于容器化引擎(比如Docker),而Docker引擎则直接依赖宿主机操作系统。

  • 虚拟化是物理层面的隔离,比如内存大小分配等

  • 容器是在APP层面的隔离,他们共享物理资源

指标对比:

image-20220111202257083

容器化解决的问题

传统的服务器方式的缺点

  1. 上线流程繁琐: 开发、测试、申请资源、审批、部署、测试等环节

  2. 资源利用率低:普遍服务器利用率低,造成过多浪费(通常在百分之十以上)

  3. 扩容、缩容不及时:业务员高峰期扩容流程复杂,上线不及时

  4. 服务器环境臃肿,对维护迁移带来困难(要保证资源利用率提高,通常会在一台机器上部署多个应用,就会造成环境臃肿)

  5. 环境不一致

容器化的优点

容器化技术的产生,让软件开发的协作方式也发生了变化。传统上,一个应用程序的上线过程是极其繁杂的,需要开发人员和运维人员配合进行。开发人员需要将要上线的程序打包、将数据库数据导出、以及各种参数以及配置文件交给运维人员。运维人员会根据配置文档将环境搭建起来并部署应用程序。如果有任意一个步骤出现问题,就可能导致严重的上线问题。而有了容器之后,开发人员可以将应用程序、环境、配置都打包为一个容器,再交给运维人员,这样就不会再出现问题了。同时,容器化技术提供了标准化的应用部署方案,运维人员只需要通过容器编排工具,就可以很方便的将应用程序发布到各个集群的节点上;不仅如此,还提供了容器管理工具,便于运维人员监控和修复。

file
  • 标准化的迁移方式:开发将程序所需的所有环境打包到镜像中,将镜像交给运维处理

  • 统一参数配置:可对应用程序参数进行统一管理

  • 自动化部署:镜像 > 容器的过程都是自动进行的

  • 应用集群监控:通过监控方便了解程序的运行状态以及集群状态

  • 是开发和运维之间沟通的桥梁

什么是Docker

file
  • Docker是一款开源的容器引擎,基于Go语言开发。

  • 是一种操作系统级别的虚拟化技术(也就是操作系统沙箱机制)

  • 主要依赖于Linux的内核特性:Namespace(资源隔离)和Cgroups(资源限制)

  • Docker是一个平台(鲸鱼),多个容器(集装箱)可以运行在Docker平台上

  • 集装箱:可以保证不同的货物(应用程序)放在同一个货轮上(docker引擎),而不受影响

  • 开发人员和运维人员职责逻辑分离

  • 多环境保持一致性,保持应用程序在测试、开发、生产环境中整个生命周期的一致性以及标准化

开发人员:

  1. 开发项目

  2. 打包项目环境+代码为镜像

  3. 部署到容器平台

运维人员:

  1. 高效管理这些容器

  2. 做好预警

相关文档

https://docs.docker.com/

基本组成

image-20220111204022728
  1. Docker Client,Docker命令(基于C/S架构)

  2. Host,docker主机,也就是docker的守护进程,负责处理client的指令,用来从Registery中拉取镜像并创建容器

  3. Docker Registry,镜像仓库,负责存储、提供镜像

安装Docker

前置操作

关闭selinux以及防火墙

开始安装

参见官方文档:Get Docker | Docker Documentation

启动并设置开机启动

查看docker信息

配置镜像加速

网络代理:

配置:

配置完毕重启docker:

Commands

镜像管理

镜像是什么

  1. 是一个分层存储文件,不是一个单一的文件

  2. 一个软件的环境

  3. 一个镜像可以创建N个容器

  4. 一种标准化的交付

  5. 一个不包含Linux内核而又精简的Linux操作系统

常用镜像管理命令

容器管理

容器命令总览

创建容器

常用的创建容器的命令:

资源限制相关:

常用命令

数据持久化

docker提供2种方式可以将数据从宿主机挂载到容器中:

  • volumes:Docker管理宿主机文件系统的一部分,主要位于/var/lib/docker/volumes位置下

  • bind mounts:将宿主机上的任意的文件或者目录挂载到容器中

Bind Mounts

Jenkins、Gitlab等服务通常都是采用这种方式。

注意,在容器启动时,宿主机的路径内容会挂载(覆盖)容器,以宿主机为准

Volumes

创建数据卷:

使用数据卷:

容器网络

image-20220112153951053
  • veth pair:成对出现的一种虚拟网络设备,数据从一端进,从另一端出。用于解决网络命名空间中间的隔离

  • Docker0:网桥是一个二层网络设备(mac路由),通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信

image-20220112155239652
  • DNAT:目标网络地址转换

  • SNAT:源地址转换

最后更新于

这有帮助吗?