• Docker三大核心概念(镜像、容器和仓库)与虚拟化


    目录

    1. Docker是什么

    2. Docker与虚拟化

    3. Docker虚拟化的好处

    4. Docker核心概念

       4.1.镜像

       4.2.容器

       4.3.仓库

    5. CentOS7 安装docker(在线方式)

       5.1.内核版本信息检查  

       5.2 卸载可能存在的旧版本

         5.3 安装必要的系统工具

       5.4 添加docker-ce安装源

       5.5 更新yum缓存

       5.6 安装docker-CE   

       5.7 验证

    6. 镜像

       6.1 配置加速器

       6.2 搜索镜像

       6.3 下载镜像

       6.4 查看宿主机上的镜像

       6.5 删除镜像

       6.6 保存镜像

       6.7 推送镜像到代码仓库(以阿里云docker平台为例)

       6.8 使用Dockerfile创建新的镜像(注意:末尾有一个点,表示当前路径)

    7. Docker容器

       7.1 启动、停止、重启容器命令

       7.2 查看当前运行的容器

       7.3 查看所有容器

       7.4 删除容器

       7.5 创建容器(重点)

       7.6 启动容器(重点)

       7.7 进入容器(重点)

       7.8 创建\启动\进入容器(run=create+start)

       7.9 退出容器

       7.10 宿主机和docker容器之间复制文件

                   8. 查看Docker容器内部信息

       8.1 进入容器内部获取信息

       8.2 在宿主机,执行docker exec命令

       8.3 在宿主机,使用docker inspect命令

    补充


    1. Docker是什么

    1、Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
      2、Docker是一个由GO语言写的程序运行的“容器”(Linux containers, LXCs),它是完整的一套容器管理系统 
     3、 Docker提供了一组命令,让用户更加方便直接地使用容器技术,而无需要过多关心底层内核技术

       注1:什么是容器
            一个容器就相当于一个虚拟机

       注2:docker用途,目前有三大类
            1.提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境
            2.提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容
            3.组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构


    2. Docker与虚拟化

            传统来看,虚拟化既可以通过硬件模拟来实现,也可以通过操作系统软件来实现 而容器技术则更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化 因此,有人甚至把它称为
       “新一代的虚拟化”技术,并将基于容器打造的云平台亲切地称为“容器云”毫无疑问, 
       Docker 正是众多容器技术中的佼佼者,是容器技术发展过程中耀眼的一抹亮色


       注1:

     

       注2:Docker和一个正常的虚拟机有何区别?
            当前,Docker内部使用的是Linux容器技术(LXC),这是运行在与它的宿主机器同样的操作系统上。
            这准许它可以和宿主机器共享许多系统资源。它也会使用AuFS作为文件系统,也为你管理网络。

    3. Docker虚拟化的好处


       好处一:应用部署方便

       举个简单的例子,假设用户试图基于最常见的 LAMP (Linux+Apache+MySQL+PHP )
       合来构建网站 按照传统的做法,首先需要安装 Apache MySQL PHP 以及它们各自运
       行所依赖的环境;之后分别对它们进行配置(包括创建合适的用户、配置参数等);经过大量的操作后,还需要进行功能测试,看是否工作正常;

    如果不正常,则进行调试追踪,意味着更多的时间代价和不可控的风险可以想象,如果应用数目变多,事情会变得更加难以处理

       更为可怕的是, 旦需要服务器迁移(例如从阿里云迁移到腾讯云),往往需要对每个
       应用都进行重新部署和调试 这些琐碎而无趣的“体力活”,极大地降低了用户的工作效率
       究其根源,是这些应用直接运行在底层操作系统上,无法保证同一份应用在不同的环境中行为一致

       Docker 提供了一种更为聪明的方式,通过容器来打包应用、解藕应用和运行平台
       这意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器
       是否是同一类型的平台 这无疑将帮助我们节约大量的宝贵时间,并降低部署过程出现问题的风险 

       好处二:服务器同等配置,性能更优,利用率更高

            让我们假设你有一个容器镜像(image)容量是1GB,如果你想用一个完整的虚拟机来装载,
       你得需要容量的大小是1GB乘上你需要虚拟机的数量。但使用Linux容器虚拟化技术(LXC)和AuFS,你可以共享1GB容量,
       如果你需要1000个容器,假设他们都运行在同样的系统影像上,你仍然可以用稍微比1GB多一点的空间来给容器系统
       因此,借助经过全面调优的容器系统,你就可以在同一硬件上拥有数量比使用Xen虚拟机或KVM虚拟机多出四到六倍的服务器应用实例。

       实际案例:以springcloud微服务为例
                 7个服务-7台linux服务器
                 7个服务-1台linux服务器-docker-7个镜像


    4. Docker核心概念


       Docker大部分的操作都围绕着它的三大核心概念: 镜像、容器和仓库

       注册服务器 -> 仓库(CentOS/RedHat) -> 镜像 -> 容器(一台虚拟机)

    你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。


      

     


       4.1.镜像


         Docker 镜像类似于虚拟机镜像,可以将它理解为一个只读的模板
         例如,一个镜像可以包含一个基本的操作系统环境(例如:CentOS7),可以把它称为一个 CentOS7 镜像

    注:

    CentOS是免费的、开源的、可以重新分发的开源操作系统 [1]  ,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一。

    CentOS Linux发行版是一个稳定的,可预测的,可管理的和可复现的平台,源于Red Hat Enterprise Linux(RHEL)依照开放源代码(大部分是GPL开源协议 [2]  )规定释出的源码所编译而成。

       4.2.容器


         1.Docker 容器类似于一个轻量级的沙箱, Docker利用容器来运行和隔离应用  
         2.容器是从镜像创建的应用运行实例 它可以启动、开始、停止 删除,而这些容器都是彼此相互隔离、互不可见的
         3.可以把容器看作一个简易版的 Linux 系统环境(包括 root 用户权限、进程空间、用户空间和网络空间等)
           以及运行在其中的应用程序打包而成的盒子

       4.3.仓库


         Docker 仓库类似于代码仓库,是 Docker 集中存放镜像文件的场所。

    docker镜像仓库有:1、Docker hub共有仓库;2、registry私有仓库;3、harbor企业私有仓库,它是Docker Registry的更高级封装;4、阿里云个人私有仓库。
      
         注1:Docker 仓库和仓库注册服务器( Registry)的区别
              分际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库 每个仓库集中存放某一类镜像,
              例如存放 CentOS 操作系统镜像的仓库,其中可能了很多不同版本的镜像,它则被称CentOS仓库

             

     


    5. CentOS7 安装docker(在线方式)

    1. #修改网络设置
    2. vi /etc/resolv.conf
    3. nameserver 8.8.8.8
    4. https://blog.csdn.net/Valiners/article/details/107871647
    5. service network restart
    6. #安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。
    7. #注:在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker)
    8. sudo yum install -y yum-utils
    9. #添加软件yum源信息,提升国内访问速度
    10. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    11. #在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存
    12. sudo yum makecache fast
    13. #安装docker ce (设置docker存储库并从中进行安装,以便安装和升级任务)
    14. sudo yum -y install docker-ce
    15. 其它方式还有:
    16. 1.下载RPM软件包并手动安装,并完全手动管理升级。这对于在无法访问互联网的系统上安装Docker等情况很有用。
    17. 2.使用自动便利脚本来安装Docker。
    18. #设置docker开机自启:
    19. systemctl enable docker
    20. #启动docker
    21. sudo service docker start
    22. docker info
    23. 执行该命令之后,对于当前的Docker服务状况是没有启动服务的,需要手动启动Docker服务;只有下次服务器重启,就无需手动启动Docker服务了
    24. [参考]https://docs.docker.com/install/linux/linux-postinstall/#configure-docker-to-start-on-boot
    25. #检查docker版本
    26. 使用 docker version 命令
    27. #运行docker官方的hello world示例image来验证docker是否安装成功
    28. docker run hello-world

    注:上面的命令含义:下载官方提供的用于测试使用的hello-world镜像并将其运行到容器中,来检验Docker服务是否正常安装并运行。
    执行上面的命令之后,Docker会自动下载hello-world镜像并自动运行到容器中,当命令行中出现“Hello from Docker!”的字样,说明已经成功运行了hello-world镜像,一切就OK了!

    完整图文示例可参考:http://config.net.cn/server/microservice/c295646a-b68a-48b6-a0a3-a3c829e6a64d-p1.html
       
       注:Docker支持运行CentOS版本:CentOS 7.X

       5.1.内核版本信息检查

      $ uname -r

       5.2 卸载可能存在的旧版本

       $ yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine

       注:旧版本的docker叫做docker或者docker-engine,如果有安装,先卸载其以及其依赖,新版本的docker叫做docker-ce

       docker-ce(社区版,免费)
       docker-ee(专业版,收费)


      
       5.3 安装必要的系统工具

     $ yum install -y yum-utils device-mapper-persistent-data lvm2
       
       注:安装依赖软件(yum-utils提供yum-config-manager包,用来管理yum配置文件;lv2和device-mapper-persistent-data为dockerdevicemapper存储设备的必须依赖)

       5.4 添加docker-ce安装源

       $ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

       默认开启的是stable稳定版仓库,如果想要安装test测试版或者是边缘版本可使用如下命令开启相关模式,关闭的话只需要将--enable参数换成--disable(可选)

       $ yum-config-manager --enable docker-ce-edge
       $ yum-config-manager --enable docker-ce-test

       5.5 更新yum缓存

       $ yum makecache fast

       5.6 安装docker-CE
       
       $ yum -y install docker-ce

       注:
       1)默认安装的是最新版本的稳定版
       2)查看版本列表请使用如下命令:
       

       $ yum list docker-ce --showduplicates | sort -r

       3)如果要安装特定版本的docker-CE请使用如下命令格式:
      
       $ yum install docker-ce-
       

       5.7 验证

         5.7.1 查看docker服务是否启动

         $ systemctl status docker   //查看运行状态

         5.7.2 启停服务

         $ systemctl start docker    //启动
         $ systemctl stop docker     //停止
         $ systemclt restart docker  //重启

         5.7.3 运行第一个容器(经典的hello world)

         $ docker run hello-world

         输入以上命令后,窗口有输出,表示docker安装成功 

      
         注:查看docker的版本,第二个命令是详细查看
             docker --version 或 docker info

    6. 镜像


       Docker 运行容器前需要本地存在对应的镜像, 如果镜像不存在, Docker 会尝试先从默认镜像仓库下载
      (默认使用 Docker Hub 公共注册服务器中的仓库), 用户也可以通过配置,使用自定义的镜像仓库

       镜像相关操作:

       6.1 配置加速器

    国内从Docker Hub下载镜像速度很慢,我们可以配置阿里云专属加速器来解决
         
         6.1.1 浏览器访问并登陆阿里云(淘宝或支付宝帐号登陆也可以)
           https://www.aliyun.com/
       
         6.1.2 登陆后,进入阿里云“控制台”,搜索“容器镜像服务”,然后点击菜单:“镜像中心”-->“镜像加速器”


           最后,将容器右边的“加速器地址”复制下来即可
          https://eq84exsu.mirror.aliyuncs.com(这里是我的加速器地址)

         6.1.3 设置容器镜像服务的密码(可选)
           容器镜像服务(Container Registry)提供多地域镜像托管能力,稳定的国内外镜像构建服务,便捷的镜像授权功能,
           方便用户进行镜像全生命周期管理。在开通流程中,您需要设置独立于账号密码的Registry登录密码,便于镜像的上传、下载。

           注1:此步骤为可选,如果需要使用阿里云来管理你的镜像 ,此步骤必须设置

         6.1.4 修改docker相关配置
           
           $ mkdir -p /etc/docker
           添加下面内容(地址替换成上面的加速器地址):
           $ tee /etc/docker/daemon.json <<-'EOF'
           {
               "registry-mirrors": ["我的阿里云专属加速器地址"]
           }
           EOF


           注:在这里可以先将registry-mirrors换成自己的阿里云专属加速器地址后,在复制到工具里面去执行(方便)

         6.1.5 重新加载daemon
           $ systemctl daemon-reload

         6.1.6 重启docker
           $ systemctl restart docker 

       6.2 搜索镜像

      $ docker search 镜像名称
          例如:docker search mysql

       6.3 下载镜像

            $ docker pull 镜像名

         例如, 获取一个 centos 系统的基础镜像可以使用如下的命令
         ## 未指定版本一般会使用latest(最新的)版本
         $ docker pull centos
         ## 或者直接指定版本
         $ docker pull centos:版本号

       6.4 查看宿主机上的镜像

         $ docker images

         注1:查看image位置
             

    1. ## /var/lib/docker为docker默认安装目录
    2.           cd /var/lib/docker/containers 
    3.           ls

       6.5 删除镜像

         $ docker rmi 镜像ID/标签
         
         例如:
         $ docker rmi 2ca708c1c9cc
         $ docker rmi centos:latest 或 docker rmi centos:版本号

         注1:如果提示镜像被使用,需要先停止某个ID的容器,那么要先删除容器再删除镜像。或者强制删除镜像
              $ docker rmi -f centos:版本号 
              -f, -force: 强制删除镜像, 即使有容器依赖它

              注意, 通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。 正确的做法是,
              先删除依赖该镜像的所有容器, 再来删除镜像


       6.6 保存镜像

         $ docker commit -m="description about images" --author="author" {container_id}  {repository/images_name:tag}

       6.7 推送镜像到代码仓库(以阿里云docker平台为例)

         $ docker login --username=your_username registry.cn-beijing.aliyuncs.com
         $ docker tag [ImageId] registry.cn-beijing.aliyuncs.com/[命名空间]/[仓库名称]:[镜像版本号]
         $ docker push registry.cn-beijing.aliyuncs.com/[命名空间]/[仓库名称]:[镜像版本号]

       6.8 使用Dockerfile创建新的镜像(注意:末尾有一个点,表示当前路径)

         $ docker build -t "repository/images_name:tag" .  

    7. Docker容器


       容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,
       镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态

       如何理解:类->实例,镜像->容器

       常用操作

       7.1 启动、停止、重启容器命令

         $ docker start 容器ID或name
         $ docker stop 容器ID或name
         $ docker restart 容器ID或name 

       7.2 查看当前运行的容器

         $ docker ps

       7.3 查看所有容器

         $ docker ps -a

       7.4 删除容器

         $ docker rm 容器ID/容器NAME

         注1:主要支持的选项包括
              -f, --force=false 是否强行终止并删除一个运行中的容器
              -1, --link=false :删除容器的连接 ,但保留容器;
              -v, --volumes=false :删除容器挂载的数据卷
         注2:删除容器,还可以参考附录三,可根据条件删除

       7.5 创建容器(重点)

         $ docker create -it centos:latest 
         $ docker create -it --name tomcat01 centos:latest

         注1:命令说明
              create:关键字
              centos:latest:即镜像名字:版本(或镜像ID),将使用指定镜像创建容器。另外,Docker会检查本地是否存在指定的镜像,
                             不存在就从公有仓库下载
              -it:是两个参数,-i:interactive容器具有交互功能,-t:容器将提供伪终端
              --name:指定生成的容器的名字,允许空,如果不指定会自动生成

         注2:此时,通过如下命令,可以查看到刚刚创建的容器
              $ docker ps - a
         注3:create命令新建的容器处于停止状态,可以使用start命令来启动它
              $ docker start 容器ID
         注4:docker容器状态可参考“images/docker容器状态转换图.png”(重点~~~重点~~~重点~~~)

       7.6 启动容器(重点)

         $ docker start 容器ID/name
         
         注2:docker ps 查看已启动容器,注意:此时容器状态为UP

       7.7 进入容器(重点)

         $ docker exec -it 容器ID/容器NAME /bin/bash
         ## 简写
         $ docker exec -it 容器ID/容器NAME bash

      
         注1:只有在容器启动的时候即UP状态才能进入容器终端

       7.8 创建\启动\进入容器(run=create+start)


         
         ## 新建->启动->进入容器
         $ docker run -it centos:latest /bin/bash

         ## 指定了端口号
         $ docker run -it -p 7001:8001 centos:latest /bin/bash 

         ## 使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口     
         $ docker run -it -P --name tomcat03 centos:latest /bin/bash

         ## 此命令没有进入容器,可以之后再进入

         更多的时候,需要让 Docker 容器在后台以守护态( Daemonized )形式运行 此时,可以通过添加-d参数来实现:
         $ docker run -it -d --name webapp centos:latest 
         $ docker exec -it webapp /bin/bash  

         参数说明:
         -p:端口映射,格式为:主机(宿主)端口:容器端口
         -P: 注意是大写P,使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口
         -d:后台运行模式
         --name:容器的名字

       7.9 退出容器

         退出时如果想继续运行容器:按顺序按【ctrl+p】,【ctrl+q】
         如果不想继续运行:按【ctrl+d】或输入exit

       7.10 宿主机和docker容器之间复制文件

         $ docker cp 宿主机绝对路径  容器id:路径

                   
    8. 查看Docker容器内部信息

       8.1 进入容器内部获取信息

    docker exec -it 容器ID/容器NAME /bin/bash
         如果此时已进入容器内部,可分别执行hostname、ip addr、env这三个命令可以获取相关信息

       8.2 在宿主机,执行docker exec命令


         获取容器的hostname:docker exec 容器ID/容器NAME hostname
         获取容器ip地址:docker exec 容器ID/容器NAME ip addr
         获取容器环境变量:docker exec 容器ID/容器NAME env

       8.3 在宿主机,使用docker inspect命令


         推荐使用docker inspect来获取信息,这个命令会返回一个json字符串,里面以key-value的格式准备了该容器相关的信息,
         内容十分丰富,可以一次性取得全部内容,也可以返回指定key对应的信息
         docker inspect 容器ID/容器NAME

         如果我们只对其中的一些感兴趣,例如hostname、ip地址、环境变量,该如何查看呢
         查看数据所在节点,根据节点位置编写命令,例如:
         hostname位于Config.Hostname这个节点位置,所以执行命令docker inspect -f {{.Config.Hostname}} tomcat001即可获取到hostname  

    补充


    附录一:英文
    Registry: 登录;域名注册局;注册局;注册表项;注册机构
    pull:拉


    附录二:如何卸载原先安装的 docker

    1.移除docker:
      $ yum remove docker-ce

    2.删除Docker安装目录
      $ rm -rf /var/lib/docker

    3.验证是否删除成功
      docker info 

      
      bash: /usr/bin/docker: No such file or directory

      我们可以看到已经无法找到 docker 安装目录,证明 卸载成功  


    附录三:关于删除容器

    方法一:

    1. #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,
    2. $ sudo docker ps -a|grep Exited|awk '{print $1}'
    3. #查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器
    4. $ sudo docker rm `docker ps -a|grep Exited|awk '{print $1}'`


    方法二: 

    1. #删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)
    2. $ sudo docker rm $(sudo docker ps -a -q)

    方法三:

    1. #根据容器的状态,删除Exited状态的容器
    2. $ sudo docker rm $(sudo docker ps -qf status=exited)

    方法四:
     

    1. #Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。
    2. $ sudo docker container prune  (推荐)

    附录四:docker常用命令(不断补充中)
    1.docker查看容器的cpu占用率
      docker stats

  • 相关阅读:
    开发如何尽可能的避免BUG
    01_ue4进阶_PBR材质
    C#/VB.NET 在Excel单元格中应用多种字体格式
    Java随笔-Semaphore
    人工智能与 RPA 技术应用(三)-新建/打开项目默认打开入口流程文件以及参数设置
    IDEA导入Maven模块未识别,包颜色不对(包显示灰色)
    conductor 3.7以上 jedisCommands ArrayIndexOutOfBoundsException 解决分析
    docker 安装mysql8
    java限流
    2022.12.4-----leetcode.1774
  • 原文地址:https://blog.csdn.net/m0_62019369/article/details/128144877