docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

docker基本概念

注: 镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

  1. Docker镜像就是一个只读的模板。比如,一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了apache或用户需要的其他应用程序。镜像可以用来创建Docker容器。另外Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人哪里下载一个已经做好的镜像来直接使用。
  2. Docker利用容器来运行应用。容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
  3. Docker仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
  4. 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub, 存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。

docker容器与虚拟机区别

  • 首先明确一点,大家都把docker比喻成轻量化的虚拟机,但他们有本质的区别,docker并不是虚拟机

  • 使用虚拟机运行多个相互隔离的应用时,如下图:

    • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。
    • 主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
    • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。
    • 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。
    • 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
    • 应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。
  • 使用Docker容器运行多个相互隔离的应用时

    • 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
    • Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。
    • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
    • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。
  • 对比虚拟机与Docker

    • Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;

    • 它还可以将容器与主操作系统隔离,并将各个容器互相隔离。

    • 虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。

    • 由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。

  • 使用场景

    • 虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。
    • Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
  • 为什么Docker快

    • docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。

    • docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返个比较费时费资源的过程,因此新建一个docker容器只需要几秒钟

    • 当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程。

Docker容器 虚拟机(VM)
操作系统 与宿主机共享OS 宿主机OS上运行虚拟机OS
存储大小 镜像小,便于存储和传输 镜像庞大(vmdk,vdi等)
运行性能 几乎无额外性能损失 操作系统额外的CPU,内存消耗
移植性 轻便,灵活,适应于Linux 笨重,与虚拟化技术耦合度高
硬件亲和度 面向软件运维者 面向硬件运维者
部署速度 快速,秒级 较慢,10以上

docker安装

前提条件

  • Docker支持以下的CentOS版本:

    • 目前,CentOS 仅发行版本中的内核支持 Docker。
    • Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
    • Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
  • 查看内核

    • uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

      1
      2
      3
      4
      5
      6
      7
      [sun@zy01 ~]$ uname -r
      3.10.0-957.21.3.el7.x86_64

      [sun@zy01 ~]$ cat /etc/redhat-release
      CentOS Linux release 7.6.1810 (Core)

      [sun@zy01 ~]$ lsb_release -a(CentOS6.8有,CentOS7无该命令)
    • 查看已安装的CentOS版本信息

centos安装

  1. 安装前源准备

    1
    2
    3
    4
    5
    6
    yum install -y yum-utils device-mapper-persistent-data lvm2
    # 官方源
    # yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    # 更新yum软件包索引
    yum makecache fast
  2. 安装docker

    1
    2
    3
    4
    # centos7 yum install -y docker-ce docker-ce-cli containerd.io
    yum install -y docker-ce
    # Centos8
    dnf -y install docker-ce
  3. 使用阿里云做镜像加速

    1
    2
    3
    4
    5
    6
    7
    8
    9
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["http://hub-mirror.c.163.com","https://7f8vpsqx.mirror.aliyuncs.com"]
    }
    EOF
    systemctl daemon-reload
    systemctl enable docker
    systemctl restart docker
  4. docker命令补全

    1
    2
    3
    sudo yum install -y bash-completion
    source /usr/share/bash-completion/bash_completion
    source /usr/share/bash-completion/completions/docker
  5. 启动docker

    1
    2
    3
    4
    5
    6
    systemctl start docker
    # 开机启动
    systemctl enable docker
    # 测试
    docker version
    docker run hello-world

安装异常处理

  • requires containerd.io >=1.2.2-3

    1
    2
    3
    4
    5
    6
    dnf install -y  https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.3.7-3.1.el7.x86_64.rpm

    # 再装剩下两个
    dnf install docker-ce docker-ce-cli
    systemctl start docker
    docker --version

docker卸载

  • 卸载软件包

    1
    yum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine
  • 删除服务注册文件

    1
    rm -rf /etc/systemd/system/docker.service.d
  • 删除docker库和运行文件

    1
    2
    3
    4
    # 删除docker库
    rm -rf /var/lib/docker
    # 删除运行文件
    rm -rf /var/run/docker

Docker Compose

  • 网址: https://docs.docker.com/compose/
  • Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。它是一个定义和运行多容器的 docker应用工具。
  • 使用compose,你能通过YMAL文件配置你自己的服务,然后通过一个命令,你能使用配置文件 创建和运行所有的服务。重点可以启动多个容器!

组成?

  • Docker-Compose将所管理的容器分为三层:

    • 工程(project)

    • 服务(service)

    • 容器(container)

  • Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。

  • 一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例。

  • **服务(service): **一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名 字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose 所完成的任务。

  • **项目(project): **由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。即是 Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所 有容器管理与部署操作。

  • Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配 置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

  • 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器 相互配合来完成某项任务的情况。

安装

  • 下载服务文件

    1
    2
    sudo curl -L "https://github.com/docker/compose/releases/download/1.28.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    # 下载的文件会输出到 /usr/local/bin/docker-compose
  • 授予权限

    1
    sudo chmod +x /usr/local/bin/docker-compose
  • 检查是否安装成功

    1
    docker-compose version

pip安装

  • 配置阿里的epel源

    1
    # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  • 安装并升级Python-pip

    1
    2
    # yum install python-pip -y
    # pip install --upgrade pip
  • 安装docker-compose

    1
    # pip install docker-compose
  • 查看docker-compose版本

    1
    2
    # docker-compose -v
    docker-compose version 1.26.2, build unknow

参考文档

帮助命令

  1. docker version
  2. docker info
  3. docker --help