zoukankan      html  css  js  c++  java
  • 传统.NET 4.x应用容器化体验(3)

    上一篇我们自己通过编写Dockerfile来编译部署一个ASP.NET MVC应用程序到Windows Container,这一篇我们来试着将.NET 4.x的镜像推送到harbor私有镜像仓库。

    1 准备工作

    假设有两台服务器,这里我使用的是阿里云ECS:

    Node1:Windows Server 2019,Docker Client

    Node2:CentOS 7.5,Harbor

    其中,Node1作为客户端,主要用来推送镜像到harbor镜像仓库 和 从harbor拉取镜像运行容器实例。Node2作为服务端,主要用来运行harbor镜像仓库对企业内部提供容器镜像服务。

    2 搭建Harbor镜像仓库

    Why Harbor?

    因为Harbor是目前最流行的企业级私有容器镜像仓库之一,而且它同时支持Linux Container 和 Windows Container 的镜像,使得它比较符合我的需求。

    快速搭建过程

    我们在Node2(CentOS)上来快速地基于Harbor搭建一个私有镜像仓库。

    step1.安装docker compose

    # curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    # chmod +x /usr/local/bin/docker-compose
    # docker-compose -version

    step2.下载并解压harbor离线安装包

    # wget https://github.com/vmware/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
    # tar xvf harbor-offline-installer-v1.10.1.tgz

    step3.修改harbor.yml配置,主要修改hostname 和 admin初始密码,注释掉https的配置(生产环境建议开启https,这里只做快速演示)。

    hostname: 47.108.111.236
    # http related config
    http:
      # port for http, default is 80. If https enabled, this port will redirect to https port
      port: 80
    # https related config
    # https:
      # https port for harbor, default is 443
      # port: 443
      # The path of cert and key files for nginx
      # certificate: /your/certificate/path
      # private_key: /your/private/key/path
    # Uncomment external_url if you want to enable external proxy
    # And when it enabled the hostname will no longer used
    # external_url: https://reg.mydomain.com:8433
    # The initial password of Harbor admin
    # It only works in first time to install harbor
    # Remember Change the admin password from UI after launching Harbor.
    harbor_admin_password: EDC@123456

    step4.安装harbor

    # ./install.sh

    安装完成后,确认没有问题,通过浏览器访问查看harbor管理界面。

    使用账号 admin 和你配置的初始密码 即可进入管理面板,这里我们来创建一个项目,这里我们暂且命名为dotnet:

    后面的示例,我们就在客户端推送镜像到这个dotnet项目中。

    3 推送镜像到镜像仓库

    在Node1,首先,配置一下hosts映射,这里配置了一个Node2的内网地址:

    172.10.10.100 reg.edisonzhou.cn

    然后,修改一下docker的配置文件,将 reg.edisonzhou.cn 作为可以使用http访问的仓库:

    配置文件:C:ProgramDatadockerconfigdaemon.json

    { 
        "insecure-registries" : [ "reg.edisonzhou.cn" ] 
    }

    然后,就是熟悉的push镜像过程了,还是原来的味道:

    > docker login reg.edisonzhou.cn
    > docker tag reg.edisonzhou.cn/samples:aspnetmvcapp reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp
    > docker push reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp
    
    The push refers to repository [reg.edisonzhou.cn/dotnet/samples]
    11d8e5abf6ac: Pushed
    265452af5f33: Pushed
    f9fe54bc871d: Pushed
    ddaa4e132ef2: Pushed
    0fd048ba07e9: Pushed
    df61cb75b354: Pushed
    825bd5d0379d: Pushed
    0037a968c4d7: Pushed
    6420f996a252: Skipped foreign layer
    a7ba3db29ebb: Skipped foreign layer
    4.8: digest: sha256:7da03aef9a9acb66678d5c14dda85c741268557bdcd55484e6351e373445157f size: 2779

    最开始我以为.net 4.x的镜像动不动就7~8个G,即使是内网推送也可能很慢,但是没想到的是在阿里云ECS的内网推送,如此大的镜像也能很快的完成。

    此外,建议先将.net 4.x sdk的基础镜像先推送到harbor,后续推送应用程序的镜像会共享基础镜像层的文件,因此速度也会加快很多。

    当然,第一次push的过程还是需要耐心等待一下,速度取决于你的服务器的配置和网络环境(如是否内网、带宽等因素)如果出现以下错误:

    received unexpected HTTP status: 500 Internal Server Error

    你可以对harbor镜像仓库所在的linux服务器关闭SELinux:

    setenforce 0

    push完成之后再看看harbor中的仓库项目列表:

    *.后面我又陆续push了sdk 和 runtime的镜像。

    4 拉取镜像并运行

    有了私有镜像仓库,又push了镜像,我们来模拟一下在Node1(Windows Server 2019)中拉取私有仓库中的镜像来运行一下:

    >docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 --cpus 1 -m 1024m reg.edisonzhou.cn/dotnet/samples:framework-4.8-aspnetmvcapp

    成功运行后,通过浏览器访问验证一下:

    可以看到,成功运行,完美!

    对于如此巨大的容器镜像,我跑了两到三个相同的asp.net mvc sample容器实例,验证发现磁盘空间会每个实例多占用0.2G左右,内存会每个多占用200M左右。当然,这也是因为这个asp.net mvc sample实在太简单,没有任何依赖交互,但是它也侧面反映,看似庞大的asp.net容器镜像,实则不会随着容器实例的增多而重复占用空间,而是共享Windows内核。

    5 总结

    本文介绍了如何快速搭建一个harbor私有镜像仓库,并通过在Windows Server客户端推送ASP.NET应用程序的镜像到harbor,最后在Windows Server客户端拉取harbor的镜像并成功运行。

  • 相关阅读:
    TThread.CreateAnonymousThread 多线程
    flask——包含,继承,宏
    flask-数据库
    flask框架--模板
    flask框架--cookie,session
    flask框架~简易编写
    flask框架1
    第2题:设计包含min函数的栈
    第1题:把二叉搜索树转换为一个排序的双向链表
    关于过渡机制一点理解
  • 原文地址:https://www.cnblogs.com/edisonchou/p/dotnet_framework_application_on_docker_part3.html
Copyright © 2011-2022 走看看