• .net core docker容器编排部署(linux)


    环境准备

    需要一个linux操作系统:我这里用的是ubuntu 18.04,安装步骤就不说了,网上很多教程,当然也可以私信我。

    既然需要用到docker,那么就安装个docker,apt install docker-ce。

    root@pims_server:/# docker -v
    Docker version 19.03.7, build 7141c199a2
    

    查看版本,这样docker就算是成功安装好了。

    加载基础镜像

    为了到时候build镜像的时候快一点,我们可以先准备下基础基础镜像,我这里用的是2.2版,只要runtime即可。

    root@pims_server:~# docker pull microsoft/dotnet:2.2-aspnetcore-runtime
    2.2-aspnetcore-runtime: Pulling from microsoft/dotnet
    804555ee0376: Downloading [=======================>                           ]   10.8MB/22.52MB
    970251047358: Download complete
    f3d4c41a4fd1: Download complete
    bd391c46585f: Downloading [==============>                                    ]  17.73MB/62.15MB
    
    

    下载完成之后,执行docker images可以查看所有镜像。

    root@pims_server:~# docker images
    REPOSITORY          TAG                      IMAGE ID            CREATED             SIZE
    microsoft/dotnet    2.2-aspnetcore-runtime   e7e3b238011c        3 months ago        261MB
    

    新建一个.netcore应用程序

    这里就不细讲了,我提前准备好了一个项目,发布之后,把publish文件夹拷贝到linux系统中,如下所示:

    root@pims_server:/mnt/share/schedule_web# ll
    total 13794
    drwxrwxrwx 1 root root   20480 Mar 23 08:49 ./
    drwxrwxrwx 1 root root    4096 Mar 25 07:39 ../
    -rwxrwxrwx 1 root root 2179584 May 28  2018 BouncyCastle.Crypto.dll*
    drwxrwxrwx 1 root root    4096 Mar 23 08:49 Configs/
    -rwxrwxrwx 1 root root     155 Mar 20 10:13 Dockerfile*
    -rwxrwxrwx 1 root root  299008 Aug 10  2018 Google.Protobuf.dll*
    -rwxrwxrwx 1 root root  221184 Mar  8  2017 log4net.dll*
    -rwxrwxrwx 1 root root   20560 Oct 11 14:28 Microsoft.EntityFrameworkCore.Abstractions.dll*
    -rwxrwxrwx 1 root root 1426512 Oct 11 14:26 Microsoft.EntityFrameworkCore.dll*
    -rwxrwxrwx 1 root root  762744 Oct 11 14:24 Microsoft.EntityFrameworkCore.Relational.dll*
    -rwxrwxrwx 1 root root  231800 Oct 11 14:28 Microsoft.EntityFrameworkCore.SqlServer.dll*
    -rwxrwxrwx 1 root root  780288 Dec  3 01:13 MySql.Data.dll*
    -rwxrwxrwx 1 root root   67584 Dec  3 01:13 MySql.Data.EntityFrameworkCore.dll*
    -rwxrwxrwx 1 root root  693680 Nov  8 16:56 Newtonsoft.Json.dll*
    -rwxrwxrwx 1 root root  263168 Dec  3 07:04 Oracle.EntityFrameworkCore.dll*
    -rwxrwxrwx 1 root root 4656640 Dec  4 09:17 Oracle.ManagedDataAccess.dll*
    -rwxrwxrwx 1 root root  256284 Mar 23 08:43 PimsSchedulingWebApi.deps.json*
    -rwxrwxrwx 1 root root  153600 Mar 23 08:43 PimsSchedulingWebApi.dll*
    -rwxrwxrwx 1 root root   58032 Mar 23 08:43 PimsSchedulingWebApi.pdb*
    -rwxrwxrwx 1 root root     224 Mar 23 08:43 PimsSchedulingWebApi.runtimeconfig.json*
    -rwxrwxrwx 1 root root  281600 Mar 23 09:05 PimsSchedulingWebApi.Views.dll*
    -rwxrwxrwx 1 root root    7800 Mar 23 08:43 PimsSchedulingWebApi.Views.pdb*
    -rwxrwxrwx 1 root root  176640 Dec 20 01:57 Remotion.Linq.dll*
    -rwxrwxrwx 1 root root  424448 Oct 16  2017 Renci.SshNet.dll*
    drwxrwxrwx 1 root root       0 Mar 23 08:49 runtimes/
    drwxrwxrwx 1 root root       0 Mar 23 08:49 SqlScripts/
    -rwxrwxrwx 1 root root   34816 Jul 14  2016 SshNet.Security.Cryptography.dll*
    -rwxrwxrwx 1 root root  380848 Nov 20  2017 System.Configuration.ConfigurationManager.dll*
    -rwxrwxrwx 1 root root   44080 Sep 18  2018 System.Diagnostics.DiagnosticSource.dll*
    -rwxrwxrwx 1 root root  236320 Dec 20 01:57 System.Interactive.Async.dll*
    -rwxrwxrwx 1 root root   51064 Sep 12  2019 System.Security.AccessControl.dll*
    -rwxrwxrwx 1 root root   24880 Jul 19  2017 System.Security.Cryptography.ProtectedData.dll*
    -rwxrwxrwx 1 root root   93048 Sep 12  2019 System.Security.Permissions.dll*
    -rwxrwxrwx 1 root root   33656 Sep 12  2019 System.Security.Principal.Windows.dll*
    -rwxrwxrwx 1 root root  118520 Jun 11  2016 System.Xml.XPath.XmlDocument.dll*
    -rwxrwxrwx 1 root root   58880 Dec  3 01:01 Ubiety.Dns.Core.dll*
    -rwxrwxrwx 1 root root     537 Mar 23 08:43 web.config*
    drwxrwxrwx 1 root root       0 Mar 23 08:49 wwwroot/
    

    至于如何拷贝到linux有很多种方法,有远程工具可以直接通过xftp上传,因为我是用的VirtualBox虚拟机,可以直接利用共享文件夹,挂载到linux上即可。
    挂载共享文件夹命令:sudo mount -t vboxsf Shared /mnt/share
    Shared是共享文件夹名称,/mnt/share是要挂载到的目标路径。

    Dockerfile

    我们可以看到这里面就是项目生成的dll文件,还有一个Dockerfile文件,这是build镜像是要用到的。

    FROM microsoft/dotnet:2.2-aspnetcore-runtime
    MAINTAINER zhanwei
    COPY . /app
    WORKDIR /app
    EXPOSE 8000
    ENTRYPOINT ["dotnet", "PimsSchedulingWebApi.dll"]
    

    这就是我的Dockerfile,很简单microsoft/dotnet:2.2-aspnetcore-runtime是基础镜像。
    COPY:
    复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

    WORKDIR:
    指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
    docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

    EXPOSE:
    仅仅只是声明端口。
    作用:
    帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
    在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

    ENTRYPOINT:
    类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 指令指定的程序。但是, 如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。
    优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
    注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

    Build镜像

    都准备好了之后,执行docker build命令,注意最后有一个.,少了这个点是执行不成功的。

    root@pims_server:/mnt/share/schedule_web# sudo docker build -t schedule_web:1.0 .
    Sending build context to Docker daemon  19.02MB
    Step 1/6 : FROM microsoft/dotnet:2.2-aspnetcore-runtime
     ---> e7e3b238011c
    Step 2/6 : MAINTAINER zhanwei
     ---> Running in a42940177b66
    Removing intermediate container a42940177b66
     ---> b9eb0d8cd441
    Step 3/6 : COPY . /app
     ---> 810d14b5a4a0
    Step 4/6 : WORKDIR /app
     ---> Running in 97360f19bf80
    Removing intermediate container 97360f19bf80
     ---> 092ed5dc0364
    Step 5/6 : EXPOSE 8000
     ---> Running in 46593eb29da3
    Removing intermediate container 46593eb29da3
     ---> 397cf3432ae2
    Step 6/6 : ENTRYPOINT ["dotnet", "PimsSchedulingWebApi.dll"]
     ---> Running in add035b834d4
    Removing intermediate container add035b834d4
     ---> 40b10808fc7c
    Successfully built 40b10808fc7c
    Successfully tagged schedule_web:1.0
    root@pims_server:/mnt/share/schedule_web#
    

    好的,成功了,现在查看一下images,可以看到刚刚构建的镜像了

    root@pims_server:/mnt/share/schedule_web# docker images
    REPOSITORY          TAG                      IMAGE ID            CREATED             SIZE
    schedule_web        1.0                      40b10808fc7c        25 seconds ago      279MB
    microsoft/dotnet    2.2-aspnetcore-runtime   e7e3b238011c        3 months ago        261MB
    
    

    创建容器并启动容器,-p映射端口,5000是容器内部端口,8000是本机对外开放端口。

    root@pims_server:docker run -it -p 8000:5000 schedule_web:1.0
    

    容器编排docker-compose

    当我们有多个服务要部署时,可以用容器编排,可以同时启动多个容器。
    比如现在有一个后台定时服务、一个前端服务。那么为了方便我只有通过compose up命令就可以了。

    root@pims_server:/# docker images
    REPOSITORY          TAG                      IMAGE ID            CREATED              SIZE
    schedule_server     1.0                      163b44854f0d        About a minute ago   279MB
    schedule_web        1.0                      40b10808fc7c        4 minutes ago        279MB
    microsoft/dotnet    2.2-aspnetcore-runtime   e7e3b238011c        3 months ago         261MB
    

    查看docker-compose版本,顺便检查下服务器是否安装。

    root@pims_server:/home/zhanwei# docker-compose --version
    docker-compose version 1.23.2, build unknown
    root@pims_server:/home/zhanwei#
    
    

    docker-compose.yml文件

    version: '3'
    services:
      #启动注册中心eureka-server集群 集中管理/服务注册/服务发现
      schedule_web:
        container_name: schedule_web
        image: schedule_web:1.0
        ports:
          - "8000:5000"
        environment:
          appId: testid
          appSecret: testsecret
          baseUrl: http://192.168.12.48:8080/api/openapi/orgs/v1/
          db_server: 10.30.52.20
          db_port: 3306
          db_type: mysql
          db_user: root
          db_pwd: 123456
          db_name: schedule_8000
      schedule_server:
        container_name: schedule_server
        image: schedule_server:1.0
        environment:
          db_server: 127.0.0.1
          db_port: 3306
          db_type: mysql
          db_user: root
          db_pwd: 123456
          db_name: schedule_8000
    

    执行命令docker-compose up -d,我们看下结果:

    root@pims_server:/home/zhanwei# docker-compose up -d
    Creating schedule_web    ... done
    Creating schedule_server ... done
    root@pims_server:/home/zhanwei#
    

    已经启动完成了。。。

    docker-compose命令解析:
    up:
    启动所有在Compose问中定义的容器,并且把它们的日志信息汇集在一起。通常会添加-d参数(在up后面),让容器在后台执行
    start:启动指定的已经存在的容器。
    build:重新建造由Dockerfile构建的镜像。
    ps:获取由Compose管理的容器的状态信息。
    run:启动一个容器,并允许一个一次性的命令。被连接的容器会同时启动,除非用了 --no-deps参数。
    logs:汇集由Compose管理的容器的日志,并以彩色输出。
    stop:停止容器,但不会删除它们。
    rm:删除已停止的容器。不要忘记使用-v参数来删除任何由Docker管理的数据卷。

    查看一下容器

    root@pims_server:/# docker ps
    CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                              NAMES
    77677298c7f9        schedule_server:1.0   "dotnet PimsScheduli…"   25 minutes ago      Up 25 minutes                                          schedule_server
    bc5502237d9e        schedule_web:1.0      "dotnet PimsScheduli…"   25 minutes ago      Up 25 minutes       8000/tcp, 0.0.0.0:8001->5000/tcp   schedule_web
    

  • 相关阅读:
    字符串比较,栈溢出引起的程序bug
    C语言实现的矩阵乘法运算器
    n阶魔方阵(奇数阵)的输出
    文件的上传和下载---以图片为例
    数据列表的分页显示---前端及后台
    表单重复提交的解决方法
    JAVA基础----持续更新
    Servlet---基础、转发重定向、编码问题解析
    JDBC的链接及封装
    com.mysql.jdbc.connection和java.sql.connection的区别
  • 原文地址:https://www.cnblogs.com/zhanwei103/p/12849783.html
Copyright © 2020-2023  润新知