都2021年了,你还在为了安装一个开发或者部署环境、软件而花费半天的时间吗?你还在解决开发环境能够正常访问,而发布测试环境无法正常访问的问题吗?你还在为持续集成和持续交付(CI / CD)工作流程苦恼吗?那还在犹豫是什么,Docker能够完美的解决你遇到这所有的问题。
Docker 是一个开源的应用容器引擎,基于 Golang 语言开发,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 服务器。容器是一个沙箱机制,相互之间不会有影响(类似于我们手机上运行的 app),并且容器开销是很低的。
Docker 是一个供开发人员和系统管理员构建、运行和与容器共享应用程序的平台。使用容器部署应用程序称为容器化。容器并不是新事物,但它们用于轻松部署应用程序却是新鲜的。
注意:Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。
灵活性:即使是最复杂的应用程序也可以容器化。
轻量级:容器利用并共享主机内核,使它们在系统资源方面比虚拟机更有效率。
可移植:您可以在本地构建,部署到云上,并在任何地方运行。
松耦合:容器是高度自给自足和封装的,允许您在不影响其他容器的情况下替换或升级其中一个。
可扩展:您可以跨数据中心增加和自动分发容器副本。
安全性:容器对进程应用主动约束和隔离,而不需要用户进行任何配置。
Docker 是一个用于开发、传送和运行应用程序的开放平台。Docker 使您能够将应用程序与基础设施分开,以便您可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础设施。通过利用 Docker 的快速交付、测试和部署代码的方法,您可以显着减少编写代码和在生产中运行代码之间的延迟。Docker(opens new window)是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!无论是应用开发者、运维人员、还是其他信息技术从业人员,都有必要认识和掌握 Docker,节约有限的生命。
Docker的出现主要就是为了解决:在我的机器上运行时是正常的,为什么到你的机器上就运行不正常了。
比如你写一个Web应用,并且本地调试没有任何问题。这时候你想发给你的朋友试试看或者发布部署到远程的云服务器上查看效果,那么首先你需要配置和你本地相同的软件环境,如数据库,Web服务器(IIS,Tomcat,Nginx),必要的插件,库等等。而这你还不能保证的你的软件一定能够运行起来,因为别人可能用完全不同的操作系统,即便是使用Linux每种发行版也会有微小的区别。
为了模拟完全相同的本地开发环境。
我们首先想到的就是虚拟机,但是虚拟机需要模拟硬件,运行整个操作系统不但体积臃肿内存占用高,程序的性能也会受到影响。
这时候Dokcer就派上了用场,Docker在概念上与虚拟机非常类似。但是Docker更轻量,它不会去模拟底层的硬件 ,只会为每一个应用提供完全隔离的运行环境。你可以在容器中配置不同的应用环境,并且不用的环境之间互相不影响,这个“环境”在Docker中也被称作为Container(容器)。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker
技术比虚拟机技术更为轻便、快捷。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
如果想详细了解,可以参考文章:docker与虚拟机的区别
特性 |
docker容器 |
虚拟机 |
启动 |
秒级 |
分钟级 |
硬盘使用 |
一般为MB |
一般为GB |
性能 |
接近原生(宿主机) |
弱于原生 |
系统支持量 |
单机支持上千个容器 |
一般几十个 |
Docker中的三个重要概念分别是:Image(镜像),Container(容器),Repository(仓储)。
你可以把它理解成一个虚拟机的快照(Snapshot),里面包含了你要部署的应用程序以及它所关联的所有库。
操作系统分为内核和用户空间。对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
这里的容器就像是一台台运行起来的虚拟机,里面运行了你的应用程序,每个容器是独立运行的他们相互之间不影响。通过一个镜像,我们可以创建许多个不同的Container容器。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和类的实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务(就像Git仓库一样),Docker Registry就是这样的服务。
一个Docker Registry中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
Docker使用客户端-服务器架构。Docker 客户端与 Docker 守护进程通信,后者负责构建、运行和分发Docker容器等繁重的工作。Docker 客户端和守护进程可以运行在同一个系统上,或者您可以将一个 Docker 客户端连接到一个远程 Docker 守护进程。Docker 客户端和守护进程通过 UNIX 套接字或网络接口使用 REST API 进行通信。
Docker 架构及工作原理详情介绍
主要是用来创建我们之间讲到的镜像,这个过程就好比我们在虚拟机中安装操作系统和软件一样,只不过是通过Dockerfile这个自动化脚本完成的。
Dockerfile详解教程文章:Dockerfile制作自己的镜像文件
介绍:Portainer是一个开源的、轻量级的Docker环境管理UI(是Web应用的形式),可以用来管理Docker宿主机和docker swarm集群。
Github 上项目地址:https://github.com/portainer/portainer
官网地址:https://www.portainer.io
支持的系统:Linux, Mac OS X, Windows。
功能特性:
管理仓库、网络、数据卷、密钥、镜像、容器
管理你的配置,例如告警、监控
支持容器的健康检查
容器的启动、停止、恢复、删除
检查容器、查看容器日志、可视化状态查看
进入容器控制台
可以添加扩展
有一套 RBAC 基于角色的权限控制系统
介绍:DockStation是一个免费的、以开发人员为中心的用于管理基于 Docker的桌面应用程序。您可以仅使用 GUI 来监控、配置和管理服务和容器,而不是大量的 CLI 命令。
官网地址:https://dockstation.io/
Github地址:https://github.com/DockStation/dockstation
支持的系统:Linux, Mac, Windows
功能特性:
可以非常方便的操作 Docker 和 DockerCompose。
可以帮助我们管理容器、Service服务(本地远程都可以),并监控他们
可以轻松跟踪 CPU、内存、网络、磁盘I/O、开放端口
可以把常用的操作组织成一个项目,通过项目的方式来检查容器状态,以图形化的方式管理。
介绍:Docker Desktop 是一款易于安装的应用程序,使您能够构建和共享容器化应用程序和微服务。
官网地址:https://www.docker.com/products/docker-desktop
支持的系统:Mac, Windows
功能特性:
能够以多种语言和框架在任何云平台上容器化和共享任何应用程序
轻松安装和设置完整的 Docker 开发环境
包括最新版本的 Kubernetes
自动更新,让您保持最新状态和安全
在 Windows 上,能够在 Linux 和 Windows Server 环境之间切换以构建应用程序
使用本机 Windows Hyper-V 虚拟化实现快速可靠的性能
能够通过 Windows 机器上的 WSL 2 在 Linux 上本地工作
代码和数据的卷安装,包括文件更改通知和轻松访问本地主机网络上运行的容器
使用支持的 IDE 进行容器内开发和调试
官方Docker-docs
Docker 10分钟快速入门-B站视频
技术群:添加小编微信并备注进群
小编微信:mm1552923
公众号:dotNet编程大全