Docker技术分享

logo

Docker从2013年发布至今,一直备受瞩目,被认为可能会改变软件行业。

但是,许多人并不清楚Docker到底是什么,要解决什么问题,好处又在哪里?
本次分享会详细解释,帮助大家理解它,并且还有简单易懂的实例,教你如何将它用于日常开发。


实现目标
  • 理解Docker基本概念以及用法
  • 安装Docker CE

虚拟机(Virtual Machine,缩写为VM)

VM就是通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

虚拟机可以在一种操作系统里面运行另外一种操作系统,比如Windows系统里面运行Linux系统。

创建虚拟机


虽然用户可以通过虚拟机还原软件的原始环境。但是,虚拟机这种解决方案还是会有以下几个缺点。

  • 资源占用多
    • 虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1MB,虚拟机依然需要几百MB的内存才能运行。
  • 冗余步骤多
    • 虚拟机是完整的操作系统,一些系统级别的操作步骤必不可少,比如用户登录。
  • 启动慢
    • 启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

Linux容器(Linux Container, 缩写为LXC)

LXC是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。

LXC架构


LXC不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,会有以下几点优势。

  • 启动快
    • 容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度会快很多。
  • 资源占用少
    • 容器只会占用需要的资源,不会占用没有用到的资源。虚拟机由于是完整的操作系统,不可避免地要占用所有资源。另外,多个容器可以共享资源,虚拟机是独享资源。
  • 体积小
    • 容器只要包含用到的组件,而虚拟机是打包整个操作系统,所以容器文件比虚拟机文件小很多。总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销会小很多。

什么是Docker

Docker属于LXC的一种封装,提供简单易用的容器使用接口,是目前最流行的LXC解决方案。 在现代的开发流程中随处可见Docker的身影,Docker提供了环境隔离、应用打包等功能,让程序部署变得非常简单。

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。它基于Google公司推出的Go语言进行开发实现,这应该也是Go大火的原因之一吧。
如果觉得难以理解Docker,我们可以把它类比为一艘货轮,而货轮上面的集装箱就是一个个应用,也就是容器。
Docker Logo


Docker目标

Build, Ship and Run Any App, Anywhere

即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的 “一次封装,到处执行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至可以是一个操作系统或编译器。


Docker核心概念

Docker架构图

  • 镜像(Image)
    • 类似虚拟机镜像,用于创建Docker容器的模板
  • 容器(Container)
    • 容器是基于镜像创建的运行实例,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux系统(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  • 仓库(Repository)
    • 仓库是集中存放镜像文件的场所,包括多个镜像文件,通过不同的标签(TAG)来区分,分为公开仓库(Public)和私有仓库(Private)两种形式。其中,最大的公开仓库是Docker Hub,存放着数量庞大的镜像,供用户下载,用户也可以在本地网络内搭建私有仓库。可以理解为Git代码库。
  • 仓库注册服务器(Registry)
    • 仓库注册服务器是存放仓库的地方,存放着多个仓库,例如Ubuntu仓库、CentOS仓库等。
  • 客户端(Client)
    • Docker客户端通过命令行或者其他工具使用Docker API与Docker的守护进程通信
  • 守护进程(Daemon)
    • Docker Daemon是Docker架构中一个常驻在后台的系统进程,也就是Server端,可以是远程的,也可以是本地的。主要功能是接收处理Docker Client发送的请求。
  • 主机(Host)
    • 一个物理或者虚拟的机器,用于执行Docker Daemon和Container

容器与镜像的关系类似于面向对象编程中的对象与类。

Docker面向对象
容器对象
镜像

Docker Image Layer

Docker Image Layer


Docker的用途

Docker的主要用途,目前有三大类

  • 提供一次性的环境
    • 比如本地环境测试软件、持续集成的时候,提供单元测试和构建运行的环境
  • 提供弹性的云服务
    • 因为Docker容器可以随开随关,非常适合动态扩容和缩容
  • 组建微服务架构
    • 通过多个容器,一台机器可以运行多个服务,因此在本机就可以模拟出微服务架构

容器与虚拟机-架构
  • 虚拟机通过在真实的操作系统上通过Hyperviso技术进行虚拟机运行环境与体系的建立并通过该技术进行资源控制,一个性能好的物理机通常可以承载多个虚拟机,每个虚拟机都会有自己的操作系统,如下图所示。

VM架构


  • 容器提供操作系统级别的进程隔离,以Docker为例,当我们运行Docker容器时,此时容器本身只是操作系统中的一个进程,只是利用操作系统提供的各种功能实现了进程间网络、空间、权限等隔离,让多个Docker容器之间相互不知道彼此的存在,如下图所示。

Docker架构


虚拟机技术与容器技术的最大区别在于:多个虚拟机使用多个操作系统内核,而多个容器共享宿主机操作系统内核。


容器与虚拟机-性能
特性容器虚拟机
启动速度秒级分钟级
磁盘使用一般为MB一般为GB
性能接近原生弱于
系统支持量单机支持上千个容器一般几十个
隔离性安全隔离完全隔离

Docker核心技术

Docker核心技术


  • 命名空间 (Namespaces)
    • 命名空间是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。

多个服务在Linux运行


  • 控制组(Control Groups,缩写为CGroups)
    • CGroups用于隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。每一个 CGroup 都是一组被相同的标准和参数限制的进程,不同的 CGroup 之间是有层级关系的,也就是说它们之间可以从父类继承一些用于限制资源使用的标准和参数。

CGROUPS INHERITANCE


  • 联合文件系统(UnionFileSystem,缩写为UnionFS)
    • UnionFS是一种为Linux操作系统设计的用于把多个文件系统『联合』到同一个挂载点的文件系统服务。

    Docker 使用的第一种存储驱动为 AUFS(Advanced Multi-layered unification filesytem),AUFS 完全重写了早期的 UnionFS,目的是提高其性能与可靠性,此外还引入了如 branch 负载均衡等新功能。

Docker AUFS


Docker的安装

Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。下面的介绍都针对社区版。

Docker CE 的安装请参考官方文档。

安装完成后,运行下面的命令,验证是否成功

docker version 
// 或者
docker info

Docker镜像加速
https://y45bd5ad.mirror.aliyuncs.com
  • Docker for Windows镜像加速设置

Docker for Windows镜像加速设置


Docker基础命令
  • 搜索镜像

    docker search [ImageName]
    
  • 查看本地镜像

    docker images
    

    可以看到本地所有的镜像信息

    REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
    rabbitmq                         management          867da7fcdf92        5 weeks ago         181MB
    mcr.microsoft.com/mssql/server   2017-latest         d04f0f18f395        2 months ago        1.46GB
    liyasthomas/postwoman            latest              6c6f62a90502        3 months ago        949MB
    redis                            3.2                 87856cc39862        20 months ago       76MB
    mariadb                          10.3.8              2c73b3262fff        23 months ago       363MB
    
  • 删除镜像

    docker rmi [ImageID/ImageName]
    
  • 查看正在运行的容器

    docker ps
    
  • 查看所有容器包括已经关闭的容器

    docker ps -a
    
  • 删除已停止容器

    docker rm [Container ID/Container Name]
    

Docker实例

本次演示的实例是搭建一个文档分享系统ShowDoc

  • 拉取最新镜像
# 原版官方镜像安装命令(国内用户不建议直接使用原版镜像,可以用后面的加速镜像)
docker pull star7th/showdoc 
# 国内镜像安装命令(安装后记得执行docker tag命令以进行重命名)
docker pull registry.cn-shenzhen.aliyuncs.com/star7th/showdoc
  • 重命名镜像
docker tag registry.cn-shenzhen.aliyuncs.com/star7th/showdoc:latest star7th/showdoc:latest
  • 新建存放ShowDoc数据的目录
# Windows系统,在执行的时候加上文件路径,目录请提前创建好,例子:docker run --rm -v d:/docker/showdoc/data hello-world
# Linux
mkdir /docker/showdoc_data
mkdir /docker/showdoc_data/html
chmod  -R 777 /docker/showdoc_data
  • 启动ShowDoc
docker run -d --name showdoc -p 4999:80 -v d:/docker/showdoc/html:/var/www/html/ star7th/showdoc
  • 参数说明
参数说明
-d后台运行容器
–name设置容器名
-p 4999:80将宿主机4999端口映射到容器80端口
-v d:/dockerworkspace/showdoc/html:/var/www/html/将宿主机d:/dockerworkspace/showdoc/html目录映射(挂载)到容器/var/www/html/目录

根据以上命令操作的话,往后showdoc的数据都会存放在/showdoc/html目录下。

你可以打开 http://localhost:4999 来访问showdoc (localhost可改为你的服务器域名或者IP)。

账户:showdoc
密码:123456

基于Docker的开发环境、测试环境、生产环境的自动化发布流程

持续开发流程



在这里插入图片描述

Reference
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值