菜菜哥,我看了一下docker相关的内容,但是还是有点迷糊

还有哪不明白呢?

如果我想用docker实现所谓的云原生,我的项目该怎么发布呢?

这还是要详细介绍一下docker了

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上也进步了很多。

来一个具体发布流程的例子呗?

可以呀,那我就以netcore为例吧

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 /app

FROM 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/build

FROM build AS publishRUN dotnet publish "netcoretest.csproj" -c Release -o /app/publish

FROM 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上,容器成功被拉取运行

虽然只是一个小小的测试程序,确把业务程序之外的最大云原生流程撸了一遍,希望对大家有帮助。大家可以拉取以下镜像是否可以运行呢?

END

●程序员修神之路--容器技术为什么会这么流行(记得去抽奖)

●程序员修神之路--kubernetes是微服务发展的必然产物

●程序员修神之路--设计一套RPC框架并非易事

●程序员过关斩将--要想获取我的用户信息,就得按照规矩来

●程序员过关斩将--更加优雅的Token认证方式JWT

●程序员过关斩将--cookie和session的关系其实很简单

●程序员修神之路--用NOSql给高并发系统加速

●程序员修神之路--高并发系统设计负载均衡架构

●程序员修神之路--做好分库分表其实很难之一(继续送书)

●程序员修神之路--做好分库分表其实很难之二(送书继续)

●程序员过关斩将--你为什么还在用存储过程?

●程序员过关斩将--小小的分页引发的加班血案

●程序员修神之路--问世间异步为何物?

●程序员修神之路--提高网站的吞吐量????

关注后回复:“大礼包”和“福利”,领取惊喜

长按识别二维码关注

程序员修神之路--打通Docker镜像发布容器运行流程相关推荐

  1. 多个容器一起打包_程序员修神之路容器技术为什么会这么流行(记得去抽奖)

    菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗 docker可很流行呀 kubernetes是容器编排技术,容器不就是指的docker吗? docker可不等于容器哦, ...

  2. 程序员修神之路--容器技术为什么会这么流行(记得去抽奖)

    菜菜哥,你上次讲的kubernetes我研究了一下,你再给我讲讲docker呗 docker可很流行呀 kubernetes是容器编排技术,容器不就是指的docker吗? docker可不等于容器哦, ...

  3. 程序员修神之路--晦涩难懂的CAP,是否完全正确?

    微信搜一搜 架构师修行之路 菜菜哥,帮忙解决一个问题 是不是面试又被虐了? 是的呢,这次面试官问我什么是CAP? 这个可就说来话长了...... 01 PART CAP 说到CAP,首先不能不说分布式 ...

  4. 程序员修神之路--简约而不简单的分布式通信基石

    点击"蓝字"关注,领取架构书籍 菜菜哥,请教一个问题呗 面试又被卡住了? 还是你了解我呀,tcp协议面向连接是怎么回事呢? 这个说详细起来,那本好几百页的tcp协议的书籍你倒是可以 ...

  5. 程序员修神之路--分布式系统设计理念这么难学?

    点击"蓝字"关注我们吧 福利:有件小事想和大家说一下 菜菜哥,问你个问题,为什么现在的系统都设计为分布式系统呢? 这个问题问得好,就像为什么程序员会慢慢脱发一样神奇 01 PART ...

  6. 程序员修神之路--kubernetes是微服务发展的必然产物

    菜菜哥,我昨天又请假出去面试了 战况如何呀? 多数面试题回答的还行,但是最后让我介绍微服务和kubernetes的时候,挂了 话说微服务和kubernetes内容确实挺多的 那你给我大体介绍一下呗 可 ...

  7. 程序员修神之路--高并发系统设计负载均衡架构

    点击上方"蓝字"关注,酷爽一夏 菜菜哥,上次你给我讲的分库分表策略对我帮助很大 有帮助就好,上次请我的咖啡也很好喝~ 呵呵,不过随着访问量的不断加大,网站我又加了nginx做负载均 ...

  8. 程序员修神之路--用NOSql给高并发系统加速

    领取福利 记得长按,领取技术书籍哦 随着互联网大潮的到来,越来越多网站,应用系统需要海量数据的支撑,高并发.低延迟.高可用.高扩展等要求在传统的关系型数据库中已经得不到满足,或者说关系型数据库应对这些 ...

  9. 程序员修神之路--做好分库分表其实很难之二

    菜菜哥,上次听你给我讲了分库的情况后,我明白了很多,能再给我讲讲分表吗 有收获就好,分表其实有很多情况和分库类似 还有不一样的情况吗? 有呀,本来数据库和表是不同层面的东西,肯定有差异 那你给讲讲呗 ...

最新文章

  1. linux删除过期文件
  2. 【重复制造精讲】1、入门介绍
  3. configSections
  4. 自定义存储过程和函数
  5. junit 预期错误_谨慎使用JUnit的预期异常
  6. 诗和远方:无题(四十四)- 曾经写给妹子的一首诗
  7. String,StringBuilder, StringBuffer
  8. python Socket网络编程
  9. 中国黑客窃取《地狱之门》源代码公开叫卖
  10. CRM学习笔记类转换工具(pojo互转)上下文中获取用户名cookie工具
  11. 培训2022年6月22日
  12. 科学计算机怎么玩游戏,计算机也能玩文本游戏
  13. K-Means检测DGA域名
  14. 企业安全培训系统,为企业实现安全生产“保驾护航”
  15. CSS美化默认滚动条
  16. 自动化专业本科学习笔记
  17. 解决WARN: Establishing SSL connection without server‘s identity verification is not recommended警告问题~
  18. 黑苹果放html5卡,小白第一次安装黑苹果,然后卡代码,别着急,教你一个通用步骤,一个一个排查,大部分是可以解决的,毕竟安装不是最难的一个步骤...
  19. 高低温真空磁场探针台T8-EM5的技术参数
  20. MySQL系统表空间和独立表空间

热门文章

  1. TCP/IP 协议简单分析(建立连接握手过程)
  2. php程序layer,php 提交表单 关闭layer弹窗iframe的实例讲解
  3. keep-alive使用_如何使用Google Keep进行无忧笔记
  4. vsftpd服务的搭建
  5. H5在WebView上开发小结
  6. 在数据库插入带小数点数据的问题
  7. SAP的SqlAnyWhere中数据库日志文件删除后如何新建
  8. Liferay 用本地私服(nexus) 打包部署Portlet应用
  9. 企业如何用CRM软件客户管理自动化优化流程?
  10. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...