【Docker】【基础】入门知识

举报
huahua.Dr 发表于 2021/05/07 11:51:06 2021/05/07
【摘要】 docker是一个快速交付、开发和运行应用程序的平台

一、docker介绍

docker是一个快速交付、开发和运行应用程序的平台。

docker提供一个独立的运行应用程序环境,应用程序不依赖其环境就可以部署运行应用程序,可以将业务程序和基础架构进行隔离,具有隔离性。隔离原理是底层利用linux内核命名空间namespacescgroups功能来达到容器工作空间的隔离性。

docker通过快速交付、测试和部署代码的方法,可以减少编写代码和生产环境运行程序的时延。

docker具有隔离性和安全性,并且docker是轻量级的,因此可以运行多个docker容器,并且还可以设置共享容器与其他容器进行交互(后面有专门的kubernetes解决应用容器之间相互发现和访问的问题)。

docker提供了工具和平台来管理容器的生命周期:

  1. 使用容器来开发应用程序和组件
  2. 使用容器分发和测试应用程序
  3. 上面都准备好了之后,就可以将应用程序部署到生产环境中。

二、docker作用优点

1. 快速、一致性的交付应用程序

场景:

  • 本地开发代码,并使用docker容器与其他同事共享工作
  • 本地开发完之后,使用docker将应用程序打包成镜像推送到测试环境中,并执行自动和手动测试。
  • 当开发发现bug的时候,先在开发环境中修复,然后使用docker重新部署到测试环境进行测试和验证。
  • 测试完成之后,使用docker将修改好的镜像推送到生产环境。

2. 响应式部署和拓展

docker具有可移植性和轻量级特性,可以实时根据业务需求拓展和拆除应用程序和服务

3. 同一台机器上运行多个docker容器

docker具有轻量级和快速特性,可以使用很少的资源完成更多的工作

三、docker架构

  •  docker使用client-server的架构模式,也就是docker客户端(简称docker)与docker守护进程(简称dockerd)之间进行通信的一个架构。
  •  守护进程dockerd完成docker容器的创建、分发和运行docker容器的繁重工作。
  • 客户端docker和守护进程dockerd可以在同一系统或同一台机器运行,也可以在不同系统或不同机器上运行(docker远程连接到dockerd),它们是怎么进行通信的呢?docker与dockerd是通过使用RESTAPI、UnixSocket或网络接口进行通信的。

基本架构图:

基本流程说明:

  1. 当docker用户在docker客户端运行docker pull命令时,该命令发送到守护进程dockerd中,dockerd会从Registry仓库中拉取指定镜像到本地images中。

  2. 当docker用户在docker客户端运行docker build命令时,该命令发送到守护进程dockerd中,dockerd将本地images中指定的镜像编译好,以供使用。
  3. 当docker用户在docker客户端运行docker run命令时,该命令发送到守护进程dockerd中,dockerd会在本地images将指定编译好的镜像在指定的容器中运行起来。

基本概念解释:

docker守护进程(dockerd)

守护进程dockerd其实就是docker服务,主要是监听客户端Docker的API请求,管理docker镜像、docker容器、networks网络、volumes存储卷等;docker守护进程还可以与其他守护进程进行通信一起管理docker服务,组成一个dockerd集群,为客户端docker提供服务。

docker客户端(docker)

客户端docker是docker用户与docker的交互主要方式,如当docker用户执行docker run命令时,docker将这些命令发送到dockerd,在dockerd上执行该命令。

docker命令使用Docker APIdocker客户端可以与多个守护进程dockerd通信。

docker注册中心(Registry)

docker注册中心registry,可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag,每个标签对应一个镜像,简单来说就是专门存放Docker镜像的地方,docker有个公共仓库叫Docker Hub,提供每个人使用,dockerd默认配置了Docker Hub为默认查找镜像的仓库,当然也可以配置自己的私人仓库。

当docker用户在docker客户端运行docker pull 或 docker run命令时,请求的镜像将从你配置的registry仓库拉取。

docker用户在docker客户端运行docker push命令时,会将镜像推送至你配置的registry仓库中。

docker对象

docker中包含很多对象:镜像images,容器containers,网络networks,存储卷volumes,插件plugins,还有其他的一些对象等等。

1. docker镜像(images)

镜像images只是一个描述怎么创建Docker容器的只读模板;通常一个镜像是基于另一个镜像并进行额外的自定义配置;例如,你可以构建基于ubuntu的镜像,并且可以在镜像中安装Apache web服务器和应用程序,以及使应用程序运行所需的详细配置信息等等,每个dockerd都有一个本地images,存放自己制作的镜像或者从别的仓库拉取过来的镜像。

可以创建自己的镜像,也可以直接使用仓库里面别人发布的镜像。

想要创建自己的镜像,需要的步骤为:

  • 创建一个dockerfile文件。
  • 使用简单的语法定义创建、运行镜像所需的指令步骤。

dockerfile文件中的每条指令都会在images中创建一个layer,当改变dockerfile文件并重新编译镜像时,只是改变并重建images中的layer,这就是制作镜像如此轻、小、快速的原因之一。

2. docker容器

  • 容器是镜像的可运行实例,简单来说就是计算机上的另一个进程,与宿主机上的其他进程隔离。
  • 可以使用Docker API或CLI创建、启动、停止、移动或删除容器,可以将容器连接到一个或多个网络并附加存储卷给它,甚至还可以根据当前容器的状态创建一个新镜像。
  • 默认情况下,容器与容器之间以及容器与宿主机之间是存在比较好的隔离环境的,你可以控制容器的网络、存储卷与其他容器或宿主机的隔离程度。
  • 容器的定义是由镜像决定的,当创建或者运行一个容器时,需要在镜像文件中提供好所有的配置信息;删除容器的时候,没有保存容器状态的更改都会消失。
  • 例如,运行一个docker容器命令docker run  -i -t ubuntu /bin/bash .,运行一个ubuntu容器并运行/bin/bash .会执行以下步骤:
    1. 守护进程检查本地有没有ubuntu镜像,如果没有,docker会从配置的仓库中提取它,就像手动运行docker pull ubuntu一样。
    2. docker会创建一个新容器,就像手动执行命令docker container create。
    3. docker分配一个读写文件系统给容器,允许正在运行的容器在该文件系统创建和修改文件或目录。
    4. docker创建一个网络接口将容器连接到默认网络,如果没有指定任何的网络配置,docker会为容器自动分配IP地址,并且默认可以使用宿主机的网络连接连接到外部网络。
    5. 上面完成之后,docker启动容器并执行/bin/bash .,并以交互方式运行且连接到本地终端(-i和-t参数),可以从键盘输入,同时输出记录到终端
    6. 当输入exit命令时,将终止/bin/bash命令,容器将停止,但不会被删除,可以再次启动或删除它

3. docker仓库(Repository)

上面也说了一个docker Registry注册中心可以包含多个仓库Repository,一个Repository包含多个标签Tag,一个标签Tag对应一个镜像,同一个Repository下的多个Tag就是指的是同一个软件不同版本的镜像,通过<仓库名><标签>的格式来指定具体软件版本,如果不给出标签,就以latest作为默认标签。在docker注册中心多用户环境下仓库名经常以两段式路径出现:用户名/软件名。

问题:镜像与容器的区别

镜像就是运行容器实例的一个模板,镜像包含运行容器实例的环境配置信息和应用程序。

容器就是镜像的一个运行实例,可以基于镜像创建多个实例,每个实例都是独立运行的。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200