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 base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["netcoretest/netcoretest.csproj", "netcoretest/"]
RUN dotnet restore "netcoretest/netcoretest.csproj"
COPY . .
WORKDIR "/src/netcoretest"
RUN dotnet build "netcoretest.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "netcoretest.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --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 上,容器胜利被拉取运行
尽管只是一个小小的测试程序,确把业务程序之外的最大云原生流程撸了一遍,心愿对大家有帮忙。大家能够拉取以下镜像是否能够运行呢?
更多精彩文章
- 分布式大并发系列
- 架构设计系列
- 趣学算法和数据结构系列
- 设计模式系列