zoukankan      html  css  js  c++  java
  • Docker

    虚拟化简介

    计算机虚拟化(Computing Virtualization),一种资源管理技术,是指通过虚拟化技术将一台计算机的各种实体资源 , 如处理器 , 网络 , 内存及存储等 , 抽像 , 转换后呈现出来 , 打破实体结构间的不可切割的障碍,虚拟成多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率,使 IT 资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。同一主机上运行多个系统或应用 , 从而提高系统资源的利用率 , 同时带来降低成本 , 方便管理和容错容灾。

    虚拟化级别

    1)完全虚拟 -- 处理器密集型技术,因为它要求 hypervisor 管理各个虚拟服务器,并让它们彼此独立 (Vmware/Virtual PC)

    (2)准虚拟 -- 改动客户操作系统,让它以为自己运行在虚拟环境下,能够与 hypervisor 协同工作 (para-virtualization)

    (3)系统虚拟 -- 没有独立的 hypervisor 层。相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立

    (4)桌面虚拟化—桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。桌面虚拟化使得桌面管理变得简单,不用每台终端单独进行维护,每台终端进行更新

    虚拟化分类

    1型虚拟化

    Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

    2型虚拟化

    物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。

    理论上讲:

    1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;

    2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

    容器位于前两者之上,以进程的形式存在于操作系统之中 容器为应用程序提供了隔离的运行空间:每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。为了能达到这种效果,容器技术使用了一系列的系统级别的机制诸如利用Linux namespaces 来进行空间隔离,通过文件系统的挂载点来决定容器可以访问哪些文件,通过 cgroups 来确定每个容器可以利用多少资源。此外容器之间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升

    Docker 

    容器( container-based )虚拟化方案,充分利用了操作系统本身已有的机制和特性,以实现轻量级的虚拟化(每个虚拟机安装的不是完整的虚拟机),甚至有人把他称为新一代的虚拟化技术, Docker 无疑就是其中的佼佼者

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

    Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

    容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

    Docker 的优点

    优点: 启动快,资源占用小 , 资源利用高,快速构建标准化运行环境 创建分布式应用程序时快速交付和部署,更轻松的迁移和扩展,更简单的更新管理

    局限: Docker 是基于 Linux 64bit 的,无法在 windows/unix 或 32bit 的 linux环境下使用 LXC 是基于 cgroup 等 linux kernel 功能的,因此 container 的 guest 系统只能是linux 隔离性相比 KVM 之类的虚拟化方案还是有些欠缺,所有 container 公用一部分的运行库 管理相对简单,主要是基于 namespace 隔离 cgroup 的 cpu 和 cpuset 提供的 cpu 功能相比 KVM 的等虚拟化方案相比难以度量 ( 所以 dotcloud 主要是按内存收费 ) docker 对 disk 的管理比较有限 container 随着用户进程的停止而销毁, container 中的 log 等用户数据不便收集。

    docker与虚拟机比较

    启动快比虚拟机 , 可以秒级启动 对资源占用小 , 宿主机上可运行千台容器 方便用户获取 , 分布 , 和更新应用镜像 , 指令简单 , 学习费用低 通过 Dockerfile 配置文件来灵活的自动创建和部署镜像 & 容器 , 提高工作效率 Docker 除了运行其中应用外 , 基本不消耗其他系统资源 , 保证应用性能同时 , 尽量减小系统开销

    Docker 架构

    Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

    Docker 容器通过 Docker 镜像来创建。

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

    Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。

    Docker 容器(Container):容器是独立运行的一个或一组应用。

    Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。

    Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

    Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库,Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

    Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

    docker的镜像 :

    镜像(docker image) --- Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器中的仓科)下载,用户也可以通过配置使用自己的镜像库。

    1)下载镜像

    #docker pull NAME:TAG

    下载某个被打上了某个标签的叫 ×× 名字 的镜像

    eg: docker pull ubuntu:latest 若在下载时你未指定标签,默认追加 latest

    标签,表示库中最新镜像 镜像在下载过程中是分层的,并且在每层前会有各层的 ID号,层(Layer )是 AUFS (联合文件系统)的重要概念,是实现增量保存与更新的基础

    2)查看本地镜像相关信息

    #docker images

    显示结果: #docker tag docker.io/ubuntu:latest ubuntu:latest

    3)搜索库中满足需求的镜像,以此下载符合需求的镜像文件

    #docker search centos

    4)删除本地镜像

    #docker rmi image[ image== 库:标签 ][ ID 号 ]

    eg: Docker rmi ubuntu: latest

    docker镜像分层

    docker镜像的分层结构:支持通过扩展现有镜像,创建新的镜像

    可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

    分层结构的优势:

    有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。

    镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

    添加文件 在容器中创建文件时,新文件被添加到容器层中。

    读取文件 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。

    修改文件 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。

    删除文件 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

    只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

    docker的镜像创建 :

    创建镜像的三种方法

    1)基于修改后的容器创建:docker commit 命令

    #docker run -it  centos:7   /bin/bash

    此时容器较镜像已经发生改变,我们以此生成新镜像

    #docker commit container-name image-name

    顺利的话会返回一个新的 ID 号

    #docker images 查看镜像列表,会看到本地多了一个名为新名字的镜像

    2)基于本地模板导入

    导出:将镜像保存为本地文件

    #docker save -o centos.tar centos:7

    导入 :将压缩包文件导入到本地镜像列表

    #docker load --input centos.tar 或者

    #docker load -i centos.tar

    #docker rmi ID

    #docker images

    简单来说,容器是镜像的运行实体。所不同的是它带有额外的可写层

    3)基于 Dockerfile 文件创建

    基于 Dockerfile 文件创建 Dockerfile 是一个文本文件,用来配置 image,记录了镜像构建的所有步骤。Docker 根据 该文件生成二进制的 image 文件。如何可以生成 image 文件?如果你要推广自己的软件,势必要自己制作 image 文件。

    1、用 Dockerfile 创建上节的 centos-with-vi,其内容则为:

    [root@cicd ~]# cat /root/dockerfile

    FROM centos:7

    RUN yum install -y vim

    root@cicd docker]# docker build -t centostest /root/docker/ 或者:docker build -t centostest .

    Dockerfile 中最常用的指令

    FROM:指定 base 镜像。

    MAINTAINER:设置镜像的作者,可以是任意字符串。

    COPY:将文件从 build context 复制到镜像。

    COPY 支持两种形式: COPY src dest

    COPY ["src", "dest"]

    注意:src 只能指定 build context 中的文件或目录

    ADD:与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest。

    EXPOSE:指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出。

    VOLUME:将文件或目录声明为 volume。

    WORKDIR:为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。

    RUN:在容器中运行指定的命令,RUN 指令通常用于安装应用和软件包。

    CMD:容器启动时运行指定的命令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。

    ENTRYPOINT:设置容器启动时运行的命令,可让容器以应用程序或者服务的形式运行。

    Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给 ENTRYPOINT。

    完整的dockerfile:

    [root@cicd docker2]# ls

    dockerf test.tar.gz tmpfile2

    [root@cicd docker2]# cat dockerfile

    #my dokerfile

    FROM centos:7

    MAINTAINER steven

    WORKDIR /testdir

    RUN touch tmpfile1

    COPY ["tmpfile2","."]

    ADD ["test.tar.gz","."]

    [root@cicd docker2]# docker build -t my-imge .

    docker的使用 :

    1)创建容器,create命令是创建并不启动容器

    #docker creat -it centos:7

    2)查看所有状态的容器

    #docker ps -a

    #docker ps

    3)启动停止的容器

    #docker start ID

    4)运行一个容器

    #docker run -ti docker.io/centos:7 /bin/bash

    #ctrl+d//exit退出,并且容器也退出

    #ctrl+p+q退出容器,并且保持容器up的状态

    -t 分配一个伪终端

    -i 让容器的标准输入持续打开

    用/bin/bash环境显示

    5)以后台守护进程(Daemonized)形态运行      用-d参数实现

    #docker run -dti docker.io/centos:7

    6)终止容器

    #docker stop NAME/ID  #docker kill NAME/ID

    7)重启容器

    #docker restart NAME/ID

    8)删除容器

    #docker -rm -f NAME/ID

    -f 强制删除处于运行中的容器

    -l 删除链接,保留容器

    -v 删除挂载的数据卷

    9)进入容器docker attach 和 docker exec 两种方式:

    docker attach直接进入容器 启动命令的终端,不会启动新的进程

    #docker attach NAME/ID

    docker exec则是在容器中打开新的终端,并且可以启动新的进程

    #docker exec -it NAME/ID /bin/bash

    10)导入和导出容器

    docker export ID > *.tar

    b.将容器导入系统成为镜像

    #cat *.tar | docker import - test

    11)查看容器日志

    #docker logs -f NAME/ID

    12)暂停容器

    #docker pause NAME/ID

    13)取消暂停继续运行容器

    #docker unpause NAME/ID

    docker镜像的仓库  --- repository的创建:

    仓库分为公共仓库和私有仓库

    DockerHub的官方仓库 https://hub.docker.com

    DockerPool社区仓库 https://dl.dockerpool.com

    Dockern Pool (http://dockerpool.com)是国内专业的Docker社区,目前也提供了官方镜像的下载管理服务

    仓库 --- 创建自己的私有仓库

    1)# docker run -d -p 5000:5000 -v /var/lib/registry:/var/lib/registry --restart=always --name registry 

    修改配置文件将私有库地址加入进去

    # vim /etc/sysconfig/docker

    # line 4: add Docker-Registry's URL

    OPTIONS='--insecure-registry 192.168.254.162:5000

    3)#systemctl  restart  docker

    4)# docker tag my-imge:latest 192.168.254.162:5000/my-imge1:latest

    更换 my-imge:latest 一个新的名称标签

    5)# docker push 192.168.254.162:5000/my-imge1:latest

    上传 my-imge1:latest

    6)# 删除本地原有的busybox 镜像,然后向私有库192.168.254.162重新下载

    # docker rmi 192.168.254.162:5000/my-imge1:latest

    # docker pull 192.168.254.162:5000/my-imge1:latest

    docker底层依赖的核心技术 :

    命名空间 (Namespaces)

    控制组 (Control Groups)

    联合文件系统 (Union File System)

    Linux 虚拟网络支持:本地和容器内创建虚拟接口

    1)命名空间 (Namespaces):实现了容器间资源的隔离 每个容器拥有自己独立的命名空间 , 运行其中的应用就像是运行在独立的操作系统中一样 , 我们都可以看到文件系统,网卡等资源保证了容器之间互不影响, namesaces管理进程号 , 每个进程命名空间有一套自己的进程号管理方法 , 进程命名空间是一个父子关系的结构 , 子空间中的进程对于父空间是可见的。

    网络命名空间—有了 PID 命名空间 , 那么每个名字中的进程就可以相互隔离 , 但是 , 网络端口还是共享本地的端口 . 网络命名空间就是为进程提供一个完全独立的网络协议栈的视图 包括 : 网络设备接口 ,IPv4 和 IPv6 协议栈 ,IP 路由表 , 防火墙规则 ,sockets 等等 ....。

    目前容器所使用的命名空间提供5种不同的类型 :

    3)联合文件系统 (Union FS) docker 中使用AUFS(another Union File System 或 v2 版本以后的Advanced multi-layered Unification File System) 控制为每一个成员目录设定只读 / 读写 / 写出权限 , 同时 AUFS 有一个类似分层的概念 , 对只读权限的分支可以逻辑上进行增量的修改 轻量级的高性能分层文件系统 , 它支持将文件系统中的修改信息作为一次提交 , 并层层叠加 , 并且可以将不同目录挂载到同一个虚拟文件系统下docker 目前支持的联合文件系统包括AUFS/btrfs/vfs/DeviceMappe

     

  • 相关阅读:
    springboot2 pagehelper 使用笔记
    MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
    浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决
    idea设置JVM运行参数
    java.lang.OutOfMemoryError: Java heap space内存不足问题
    lasticsearch最佳实践之分片使用优化
    Elasticsearch分片优化
    ELASTICSEARCH 搜索的评分机制
    elasticsearch基本概念与查询语法
    mysql 用户及权限管理 小结
  • 原文地址:https://www.cnblogs.com/kittywerwer/p/11741856.html
Copyright © 2011-2022 走看看