zoukankan      html  css  js  c++  java
  • NetCore的Docker部署

    NetCoreDocker部署

    一、NetCoreDocker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口 。

    微软的.NET Core本身就是一个对跨平台支持比较好的语言,有vs这样的集成工具对开发与部署也很友好,项目上进行发布可直接获得对应平台的可运行程序,也可以发布可移植程序,但是对应平台需要安装netcore运行时。

    安装运行时需要针对不同的环境来处理,微软的下载页面提供安装的各种支持:https://dotnet.microsoft.com/download,运行时在windows平台下直接安装一个dotnet-hosting-2.1.12-win.exe即可,linux环境需要根据不同的操作系统命令行安装。

    安装运行时的过程中可能会遇到一些不可预料的状况,开发机与生产环境的一些差异可能会导致安装失败,而采用Docker容器可以直接将开发环境打包,不用在每个不同的操作系统安装运行时。 NetCorevs中就有Docker支持,但需要手动在windows环境下安装docker以支持镜像打包。

    二、Docker安装

    直接在https://hub.docker.com/网站下载win平台docker安装包,但docker for window只支持win10以上版本,如果是win7,需要下载DockerToolBox来安装(https://get.daocloud.io/toolbox/)。

    安装过程网上教程一大把,百度即可。但某些电脑的win7版本可能装好后安装虚拟机失败,最终我换了一台电脑安装成功。下面这个错误截图最终也没解决。

     

    三、Docker打包运行

    Vs2017自带的docker支持由于我本机docker安装失败未进行深入研究,由于之前已经打包过现成的Linux可执行程序出去,就考虑直接打包现有的dll

    1.Docker build 镜像打包

    Docker build命令是需要提供一个Dockerfile配置文件来告诉打包程序需要进行哪些操作的。微软默认生成的Dockerfile是打包源码的,可以参考一下,大部分都可以删除。

     

    最终其实就是一句copyadd即可

     

    其中设置utf-8是为了支持容器中的中文显示,urls是告诉容器需要提供这个对外的接口开放,workdir是指定程序的初始目录。

    拷贝相应文件到linux主机目录 如/tmp/netcoreputty远程上去,定位到netcore目录,执行命令:docker build -t testdocker .

    注意最后的”.”,这是命令的一部分,这个会将当前目录的所有文件拷贝到docker容器中,然后默认解析当前目录的Dockerfile文件进行镜像构建。

     2.Docker run镜像运行

    “docker run -d --name mytest -p 5000:5001 -v /tmp:/tmp testdocker”

    解释这个命令的参数前,首先要了解镜像与容器的概念。

    镜像:就是之前build的结果,叫testdocker,在linux主机中用docker images命令可以显示当前本地总共有多少镜像,有点类似Class类的概念

    容器:就是这个命令中的 --name mytest,就好比new的一个Class对象。一个镜像可以有多个容器运行。Docker ps可以查看当前运行的容器,参数-a可以查看所有容器。

    接下来说参数,

    -d 指定后台运行。

    --rm 与-d互斥,前台运行完成后删除容器

    -p指定linux主机端口映射容器内的端口,容器内通过Dockerfile指定的端口是5001,在主机指定5000端口与之对应。

    -v是目录对应,容器中要访问的目录如果用该参数对应过,则访问的是宿主机中的目录,前一个是主机中的目录。

     

    3.Docker pull镜像获取

    Docker pull hello-world可以从仓库获取镜像,仓库是一个镜像的合集,现在访问仓库镜像速度不是很理想,可以用阿里的镜像加速服务,需要注册一下,怎么操作修改都有提示。

     

     

    4.Docker push 镜像推送

    镜像打包好之后如何提供给别人,可以直接推送到docker hub,别人就能直接用pull命令获取。如果程序太放心放在公有仓库中,可以自己搭建一个私有仓库,网上教程也很多,由于已有现成的公司私有仓库,我就直接用了。

    推送首先要将本地镜像docker tag testdocker registry.*.com est打tag, 然后docker login 私有仓库地址登录,最后docker push tag名称将镜像推送到仓库中。

     

    5.Docker exec -it mytest bash

    进入容器中,可以查看打包的目录是否符合预期,运行的日志等

    6.容器镜像删除

    Docker rmi可以删除镜像,docker rm可以删除容器,-f可以强制删除。

     

    四、遇到的问题与解决

    1.容器运行成功后无法访问.

    查看dockerfile中的端口与docker run命令中的端口是否对应。

    2.镜像推送失败

    这个可能有多种原因,比如没登录等,主要看提示。比如证书

     

    添加配置即可:# vim /etc/docker/daemon.json

    {

      "insecure-registries": ["registry.xxx.com.cn"]

    }

    3.Dockerfile基础镜像修改为centos

    默认运行的基础镜像是FROM microsoft/dotnet:2.1-aspnetcore-runtime,但原本没用docker时发布的程序是能够直接运行在centos上的,那修改基础镜像后能不能直接运行呢?答案是不行,遇到了icu问题,可以修改程序的配置文件,或安装icu包,可以在docker中直接指定(run yum install -y icu)。https://www.cnblogs.com/xakoy/p/9039218.html

     

    4.Netcoreapi运行失败

    这是一个很奇怪的问题,最终在Stack Overflow上找到答案,dockerfile中必须设置workdir,不设置就会报这个错。而这个问题在win平台的docker中是没问题的。

      '/proc/1/map_files' is denied

     

    https://stackoverflow.com/questions/51598627/access-to-the-path-proc-1-map-files-is-denied-net-core-2-1-centos-7?r=SearchResults

    参考链接:

    https://www.cnblogs.com/nanlan2017/p/10451671.html

    https://blog.csdn.net/vitaair/article/details/80894890

    https://blog.csdn.net/qq_33256688/article/details/80319673

    https://blog.csdn.net/u013469944/article/details/84202396

    https://www.cnblogs.com/xhyan/p/6593075.html

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/zhanglb163/p/11299550.html
Copyright © 2011-2022 走看看