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

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

  1. Docker是什么

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

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

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

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

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

  1. 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个镜像

  1. Docker核心概念

   Docker大部分的操作都围绕着它的三大核心概念: 镜像、容器和仓库
   注册服务器 -> 仓库(CentOS/RedHat) -> 镜像 -> 容器(一台虚拟机)

(你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。)
https://ucc.alicdn.com/images/user-upload-01/376a5cdf07f34cab8d35bf9e5e51630e.jpeg

  

   4.1.镜像

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

注:

   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仓库

         

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

修改网络设置

vi /etc/resolv.conf
nameserver 8.8.8.8
https://blog.csdn.net/Valiners/article/details/107871647
service network restart

安装yum-utils软件包(提供yum-config-manager 实用程序)并设置稳定的存储库。

注:在新主机上首次安装Docker Engine之前,需要设置Docker存储库。之后,您可以从存储库安装和更新Docker)

sudo yum install -y yum-utils

添加软件yum源信息,提升国内访问速度

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存

sudo yum makecache fast

安装docker ce (设置docker存储库并从中进行安装,以便安装和升级任务)

sudo yum -y install docker-ce
其它方式还有:
1.下载RPM软件包并手动安装,并完全手动管理升级。这对于在无法访问互联网的系统上安装Docker等情况很有用。
2.使用自动便利脚本来安装Docker。

设置docker开机自启:

systemctl enable docker

启动docker

sudo service docker start
docker info
执行该命令之后,对于当前的Docker服务状况是没有启动服务的,需要手动启动Docker服务;只有下次服务器重启,就无需手动启动Docker服务了
[参考]https://docs.docker.com/install/linux/linux-postinstall/#configure-docker-to-start-on-boot

检查docker版本

使用 docker version 命令

运行docker官方的hello world示例image来验证docker是否安装成功

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 卸载可能存在的旧版本

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

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

  
   5.3 安装必要的系统工具

   5.4 添加docker-ce安装源
   $ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

   5.5 更新yum缓存

   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 验证

  1. 镜像

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

   镜像相关操作:

   6.1 配置加速器

   6.2 搜索镜像

   6.3 下载镜像

   6.4 查看宿主机上的镜像
     $ docker images

     注1:查看image位置
         

## /var/lib/docker为docker默认安装目录
          cd /var/lib/docker/containers 
          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 保存镜像

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

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

  1. Docker容器

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

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

   常用操作

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

   7.2 查看当前运行的容器

   7.3 查看所有容器

   7.4 删除容器
     $ docker rm 容器ID/容器NAME

   7.5 创建容器(重点)
     $ docker create -it centos:latest 
     $ docker create -it --name tomcat01 centos:latest

   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  

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

   7.10 宿主机和docker容器之间复制文件
     $ docker cp 宿主机绝对路径  容器id:路径

               

  1. 查看Docker容器内部信息

   8.1 进入容器内部获取信息

   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命令

补充

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

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

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

附录三:关于删除容器

显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID,

$ sudo docker ps -a|grep Exited|awk '{print $1}'

查询所有的容器,过滤出Exited状态的容器,列出容器ID,删除这些容器

$ sudo docker rm docker ps -a|grep Exited|awk '{print $1}'

删除所有未运行的容器(已经运行的删除不了,未运行的就一起被删除了)

$ sudo docker rm $(sudo docker ps -a -q)

根据容器的状态,删除Exited状态的容器

$ sudo docker rm $(sudo docker ps -qf status=exited)

Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器。

$ sudo docker container prune  (推荐)

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

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
118 77
|
11天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
11天前
|
Docker 容器
将本地的应用程序打包成Docker镜像
将本地的应用程序打包成Docker镜像
|
2天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
51 5
|
4天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
29 3
|
11天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
28 9
|
11天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
31 3
|
11天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
21 2
|
4月前
|
存储 安全 Ubuntu
Docker 镜像与 Docker 容器的区别
【8月更文挑战第27天】
360 5
|
4月前
|
存储 Ubuntu 应用服务中间件
在Docker中,怎么快速查看本地的镜像和容器?
在Docker中,怎么快速查看本地的镜像和容器?