搞懂Docker(一)

在这里插入图片描述

简介

Docker是一个用于程序开发、交付、运行的开放平台。Docker可以使你写的程序不依赖于你的本机的环境,所以,可以更加快速的完成程序的交付。也就是说,不会出现在你的机器可以正常运行,在对方的机器上就不能正常运行的情况。你可以向管理你的程序一样,管理你的环境基础设施。得益于docker的在交付、测试、部署上所采取的措施,你可以有效的减少从开发到部署的时间。
Docker可以让程序运行在一个与外界联系不紧密的、隔离的环境中,我们称之为容器。隔离安全可以让你在一台主机中运行很多个程序。容器是轻量级的,他只包含程序所需要的组件,并且不依赖你的主机上安装的组件。你可以在工作中共享容器,可以确保其他人使用同样的容器可以产生同样的行为。
Docker提供了工具和平台来管理你的容器的生命周期:

  • 使用容器来开发程序和支持的组件。
  • 使用容器作为程序测试和发布的单元。
  • 开发完成之后,在生产环境部署你的程序,在容器中运行。这样,不管你的生产环境是本地数据中心、云主机、还是别的,都会产生同样的结果。

Docker可以用来做什么?

快速,一致的交付

Docker通过使开发人员使用容器,从而在一个标准的环境中开发程序。使用容器可以完成持续继承(CI)和持续交付(CD)。
例如以下场景:

  • 开发人员在本地编码,然后通过容器与同伴交流。
  • 使用Docker把程序放到测试环境的容器,然后执行自动和手动的测试。
  • 测试发现bug,在开发环境修改,然后再放到测试环境中验证。
  • 测试完成,交付用户,要做的只是把更新的镜像放到生产环境中去。

快速的部署和扩展

Docker基于容器的特点,使程序具有很高的可移植性。容器可以运行在笔记本电脑,本地的物理或者虚拟的机器上,云上。
另外,Docker的高可移植性和轻量级的特点使动态的管理程序变的简单,可以随时增减运行实例。

一个机器上跑多个程序

Docker既是轻量级的,又是很快速的。它相对于一般虚拟机而言,使用资源少。因而,可以在一台机器上跑多个程序,完成更多的工作。

Docker的架构

Docker使用客户端-服务器架构。客户端请求服务器,服务器完成容器的创建、运行、发布。客户端和服务器可以在同一台机器上,也可以在不同的机器上。客户端和服务器的通信使用REST API,通过UNIXsockets或者网络接口。另外一种客户端是Docker Compose,它用于你的程序中包含多个容器。
在这里插入图片描述

Docker的daemon

Docker的daemondockerd)监听着客户端的请求,管着里各种docker的对象,比如:images, containers, networks, 和volumes。一个daemon可以跟其它的daemon通信管理服务。

Docker客户端

Docker客户端(docker)是用于和daemon沟通的最常用的工具。当你使用命令,如docker run,客户端发送命令给dockerddockerd执行命令。docker命令使用Docker API。Docker客户端可以与多个daemon通信。

Docker Desktop

Docker Desktop是一个安装套件。它包括:Docker daemon (dockerd), Docker 客户端(docker), Docker Compose, Docker Content Trust, Kubernetes, 和Credential Helper. 更多的信息请参考Docker Desktop

Docker 注册中心

Docker 注册中心存储着各种docker的镜像。Docker Hub作为公共的注册中心,每个人都可以访问。docker默认从Docker Hub上查找镜像。你还可以建立私有的注册中心。
当你使用docker pull或者docker run命令,Docker从你配置的注册中心拉取需要的镜像。当你使用docker push命令,Docker会把你的镜像推到你配置的注册中心上。

各种Docker对象

你使用Docker,就是创建和使用images, containers, networks, volumes, plugins, 和其它的对象。下面来看看其中的几种。

Images

镜像是只读的,包含一堆用于创建容器的命令,它相当于一个模板。通常情况下,一个镜像是基于另外一个镜像和其它的指令。例如,你可以创建一个镜像,它是基于ubuntu镜像,并且装有Apache服务器和你的应用程序,还有一些配置。
你可以创建自己的镜像或者他人创建好的,然后发布到注册中心上。创建你自己的镜像,你可以使用Dockerfile用简单的语法定义创建镜像的步骤,然后执行。Dockerfile中的每一个指令会在镜像中创建一个。当你修改Dockerfile,然后重新创建镜像时,它只会重新创建修改过的。这就是为什么镜像相比于其他虚拟技术很轻、小、快。

containers

容器是一个镜像运行的实例,就像类与对象的关系。你可以创建、启动、停止、移动、删除一个容器。你可以把容器连接到一个或多个网络,给它附加上存储,甚至可以根据当时的容器运行的状态创建一个新镜像。
通常情况下,容器是独立于其它容器和它所在主机的。你也可以设置容器的存储、网络或者其他的部分跟其它容器或者主机的关联性。
容器的定义是根据它的镜像和你对容器的设置共同决定的。当一个容器被移除时,它改变的状态,如果没有记录到永久存储器中时,就会丢失。

docker run 命令

下面的命令,运行了一个ubuntu 容器,附加在了你的命令行会话上,并在容器内部运行/bin/bash指令,你就可以与ubuntu 容器交互。

docker run -i -t ubuntu /bin/bash

当你运行这个命令,会发生以下的情况(假设你的配置使用默认的注册信息)

  1. 如果你本地没有ubuntu镜像,Docker 从你配置的注册中心上拉取,相当于你执行命令docker pull ubuntu
  2. Docker 创建了新容器,相当于你执行命令docker container create
  3. 在容器中创建了一个可读写的文件系统,作为容器的最后一层。这就使得程序在它本地的文件系统中读写修改文件和目录。
  4. Docker 会创建一个网络接口连接到默认的网络,即使你没有设置任何网络选项。这会给容器赋予一个IP。默认情况下容器可以利用宿主机的网络连接到外面的世界。
  5. Docker 启动容器,并且执行/bin/bash。由于容器已经启动并设置了交互式的选项(-i选项),并且附加在了你的终端(-t选项),你可以利用你的键盘提供给容器的输入,容器会把输出打印在你的终端窗口上。
  6. 当你在你的终端输入exit指令给/bin/bash,容器就会停止运行,但是没有被移除。你可以重新启动或者移除它。

背后使用的技术

Docker使用Go语言编写,而且还借鉴了Linux kernel中的一些特性。Docker使用了一项称为namespaces的技术来实现容器的隔离性。当你创建了一个容器,Docker创建了一堆该容器的namespaces
namespaces提供了用于隔离的层。容器的每个部分各自运行在各自的namespace*,namespace会限制外部对它的访问。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值