Docker 是一个开源的利用容器引擎,基于 Go 语言 并听从 Apache2.0 协定开源。Docker 能够让开发者打包他们的利用以及依赖包到一个轻量级、可移植的容器中,而后公布到任何风行的 Linux 机器上,也能够实现虚拟化。
容器是齐全应用沙箱机制,相互之间不会有任何接口(相似 iPhone 的 app),更重要的是容器性能开销极低。Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),咱们用社区版就能够了。

正如以上所说,Docker诞生的意义不仅仅实现了相似虚拟机的隔离性,最次要的是它能够把应用程序以及应用程序的运行环境整个打包在一起。留神:是整个环境哦,不仅仅是一些依赖库。这个划时代的提高,间接把docker镜像和宿主拆散开来,使得docker镜像只有公布出来,就能使任何人在任何中央任何工夫都能够随便运行,换句话说,docker镜像能够被散发到任何运行docker的服务器上。

Docker 架构

在docker的架构中,次要有三个次要概念:

镜像

Docker 镜像能够看作是一个非凡的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还蕴含了一些为运行时筹备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不蕴含任何动态数据,其内容在构建之后也不会被扭转。

docker镜像由多层组成,不同的镜像都能应用雷同的父镜像作为他们的根底镜像,这些雷同的根底镜像在docker的角度来看就是完全相同的层。在docker镜像的传输过程中,当某些雷同的层曾经存在的时候,就齐全不须要从新传输了,这大大提高了镜像在网络上的传输效率。

分层的设计不仅使镜像散发更高效,也有利于缩小镜像的存储空间。每一层仅仅被存储一次,就算基于雷同根底层的镜像被创立两个容器的时候,这两个容器也是相互隔离的,尽管他们能读到雷同的文件,然而却看不到对方文件的批改。一个容器被创立的时候,会创立一个新的可写层,容器中的批改会反馈到这个新的可写层中。就算了容器批改了底层的文件,此文件的批改内容会copy到顶层,底层仍然不会发生变化。

容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是动态的定义,容器是镜像运行时的实体。容器能够被创立、启动、进行、删除、暂停等。docker的容器通常是一个linux容器,它是运行在宿主机上的一个过程,然而和其余宿主过程是隔离的,并且所用的资源是受限的(只能拜访特定的资源,比方网络接口,文件系统)

镜像仓库

镜像仓库和它的字面意思统一,是很多镜像的汇合,它的作用就是把镜像共享给每个人,当然这里顺便提一下,镜像仓库也能够有私人仓库。当你的应用程序被打包之后,如果想在另外一个机器上运行,你就能够把你的利用镜像上传到镜像仓库,而后凋谢这个仓库,这样网络上的任何机器都可能下载你的镜像,而后运行。

通常,一个仓库会蕴含同一个软件不同版本的镜像,而标签就罕用于对应该软件的各个版本 。咱们能够通过<仓库名>:<标签>的格局来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。

仓库又能够分为两种模式:
public(私有仓库)
private(公有仓库)
Docker Registry 私有仓库是凋谢给用户应用、容许用户治理镜像的 Registry 服务。个别这类公开服务容许用户收费上传、下载公开的镜像,并可能提供免费服务供用户治理公有镜像。

除了应用公开服务外,用户还能够在本地搭建公有 Docker Registry 。Docker 官网提供了 Docker Registry镜像,能够间接应用做为公有 Registry 服务。当用户创立了本人的镜像之后就能够应用 push 命令将它上传到私有或者公有仓库,这样下次在另外一台机器上应用这个镜像时候,只须要从仓库上 pull 下来就能够了。

构建散发运行镜像

开发人员首先构建一个镜像,而后把镜像推到镜像仓库中。因而,任何能够拜访镜像仓库的人都能够应用该镜像。而后,他们能够将镜像拉取到任何运行着Docker的机器上并运行镜像。Docker会基于镜像创立一个独立的容器,并运行二进制可执行文件指定其作为镜像的一部分。

docker的缺点

就像所有的技术解决方案,docker也不是完满的。docker的缺点在于运行的内核,因为它间接运行在宿主机的内核之上,所以如果docker容器的运行内核版本和宿主机的内核不匹配就会呈现问题。追根到底,还是硬件架构设计上的差别,不仅仅是docker容器,简直所有的软件都会有内核架构不同而不能运行的问题。除此之外,因为docker是基于linux的容器技术,所以在windows下运行并不令人满意,尽管这些年docker在windows上也提高了很多。

docker镜像公布

docker镜像的仓库有很多,这里以官方网站https://hub.docker.com/ 为例,首先你要在官网创立一个账号,而后能够在Account Settings=》Security中设置一个AccessToken ,这里为了演示,没有在官网显示创立仓库。因为我是自身是C#出身,这里利用vs2019来做演示。

关上vs2019新建一个netcore的我的项目,我这里创立一个控制台程序,程序很简略

 static void Main(string[] args)        {            Console.WriteLine("Hello World!");            while (true)            {                Console.WriteLine("Hello World22222!");                System.Threading.Thread.Sleep(1000);            }        }

而后在我的项目右键 增加=》docker反对,会依据以后我的项目主动生成dockerfile文件。就算没有ide的反对,也能够本人手撸一个dockerfile文件,而后利用docker的命令打包,当然语法和以下是一样的

FROM mcr.microsoft.com/dotnet/core/runtime:3.0-buster-slim AS baseWORKDIR /appFROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS buildWORKDIR /srcCOPY ["netcoretest/netcoretest.csproj", "netcoretest/"]RUN dotnet restore "netcoretest/netcoretest.csproj"COPY . .WORKDIR "/src/netcoretest"RUN dotnet build "netcoretest.csproj" -c Release -o /app/buildFROM build AS publishRUN dotnet publish "netcoretest.csproj" -c Release -o /app/publishFROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "netcoretest.dll"]

而后我的项目右键 公布=》容器注册表=》docker hub 创立公布选项,会弹出输出docker hub账号密码弹窗,而后输出账号密码,最初点击公布按钮,本地必须要装置docker哦,我这里为了演示,在windows上装置的docker for windows。和以上相似,就算没有ide的反对,咱们一样能够利用docker命令把镜像推送到指定仓库。这里只是演示流程,所以不要纠结。

如果环境没有谬误的话,公布过程中会弹出黑窗口

公布实现,在docker hub中刷新页面回发现新仓库曾经被创立好了

接下来就是在装有docker的机器上,拉取进行并运行容器了,这里以我本地windows 和测试服务器linux为例,别离演示,然而其实在两个操作系统中命令是截然不同的

docker run chenhongyu/netcoretest

无论是在windows上还是在linux上,容器胜利被拉取运行

尽管只是一个小小的测试程序,确把业务程序之外的最大云原生流程撸了一遍,心愿对大家有帮忙。大家能够拉取以下镜像是否能够运行呢?

更多精彩文章

  • 分布式大并发系列
  • 架构设计系列
  • 趣学算法和数据结构系列
  • 设计模式系列