GVKun编程网logo

从零实操基于 WSL2 Docker 部署 Asp.Net Core 项目(wsl2运行docker)

27

如果您对从零实操基于WSL2Docker部署Asp.NetCore项目和wsl2运行docker感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解从零实操基于WSL2Docker部署Asp.Net

如果您对从零实操基于 WSL2 Docker 部署 Asp.Net Core 项目wsl2运行docker感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解从零实操基于 WSL2 Docker 部署 Asp.Net Core 项目的各种细节,并对wsl2运行docker进行深入的分析,此外还有关于8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署、ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx、ASP.NET Core 开发 - Docker 部署运行、Asp.Net Core&Docker 部署到树莓派 3B 中的实用技巧。

本文目录一览:

从零实操基于 WSL2 Docker 部署 Asp.Net Core 项目(wsl2运行docker)

从零实操基于 WSL2 Docker 部署 Asp.Net Core 项目(wsl2运行docker)

前言

平日在公司里都是基于阿里 Teambition 中的飞流进行 Docker 部署 Api 项目或服务,已经习惯了那一套成熟的操作流程,开发和部署确实快捷方便,但是还没在自己的电脑上进行操作过,特别是 Windows10 开始已经有 WSL、WSL2

去年在笔记本上捣鼓过 WSL2,但也只是打开安装完后打了下几行命令尝个鲜,没有进行过后续跟开发有关的操作

前两天把家里电脑系统升级到 Windows 11,新系统感觉良好,抽空再次尝试下 WSL2,顺便记录下完整的项目部署流程

 

WSL

WSL:适用于 Linux 的 Windows 子系统。

  • 什么是适用于 Linux 的 Windows 子系统?

适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生虚拟机开销。

  • 什么是 WSL 2?

WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本,它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。它的主要目标是提高文件系统性能,以及添加完全的系统调用兼容性。

  • WSL 2 和 WSL 1 的区别?

 

安装 WSL 2

WSL 官方教程:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10

Hyper-V 说明:https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/about/

  1. 首先要去 控制面板 -> 程序和功能 -> 启用或关闭 Windows 功能 -> 打开 Hyper-V 、适用于 Lindex 的 Windows 子系统、虚拟机平台(仅用 WSL 1 无需这个) ,设置成功后需要重启系统

  2. 打开 Windows Terminal (支持多命令窗口的终端工具,Windows11 已自带,之前版本需要去应用商品下载安装)  或者 CMD 或者 PowerShell,输入以下代码可查看当前已注册的 Linux 分发版本

    wsl -l

     
    注意:上面截图里是我已安装完 Ubuntu 和 Docker 的结果,如果第一次安装,只有一个默认 Linux

  3. 安装完成默认架构是 WSL 1,需要手动切换到 WSL 2,在这之前需要先下载安装 Linux 的内核更新包

    点击下载 Linux 内核更新包

    安装完毕之后执行下面命令,切换到 WSL 2

    wsl --set-default-version 2

 

安装 Ubuntu

  1. 打开 Windows 应用商城,搜索 Ubuntu,并选择一个版本进行安装



  2. 安装完成后,点击启动 Ubuntu,会提示需要设置用户名和密码
    (网上截图)

  3. 设置 Ubuntu 为 WSL 默认系统,WSL 版本号为 2(这里以 Ubuntu 20.04 为例)

    wsl --set-version Ubuntu-20.04 2
  4. 在 Windows Terminal 下会多一个 Ubuntu 的命令行选项

 

安装 Docker

    Windows 环境下可以去 Docker 官方下载 Docker Desktop 进行安装,最新版本已经支持使用 WSL2 运行,也可以在 Ubuntu 下以 Linux 传统方式安装 Docker(自行某度)

    

    

 

迁移 Docker 镜像默认保存路径(如果你的 C 盘很大,可跳过这步)

   Docker 的镜像默认保存路径在:C:\Users\ 你的用户名 \AppData\Local\Docker\wsl\data      长期使用镜像多了,C 盘就会吃紧了,可以迁移目录到其他盘

  1. 关闭 Docker

  2. 关闭所有发行版 Linux

    wsl --shutdown
  3. 将 docker-desktop-data 导出到指定目录下 D:\Docker\wsl\data\docker-desktop-data.tar(注意,原有的 docker images 不会一起导出)

    wsl --export docker-desktop-data D:\Docker\wsl\data\docker-desktop-data.tar
  4. 注销 docker-desktop-data

    wsl --unregister docker-desktop-data
  5. 重新导入 docker-desktop-data 到要存放的文件夹:D:\Docker\wsl\data\

    wsl --import docker-desktop-data D:\Docker\wsl\data\ D:\Docker\wsl\data\docker-desktop-data.tar --version 2

    #参数说明
    -version 2 :指定WSL版本为2
  6. 重启 Docker

  7. 如果重启 Docker 出现报错:Failed to set version to docker-desktop: exit code: -1
    需要打开 cmd 执行以下命令,执行完毕后需要重启电脑

    netsh winsock reset

    报错原因:https://zhuanlan.zhihu.com/p/151392411
    如果重启后镜像默认路径又会恢复到原路径,需要重新弄一遍上面所有步骤,囧

 

在 Docker 中安装 Nginx、MySQL 等(没用到,可跳过这步)

直接在 Ubuntu 的命令下使用 docker 命令安装组件

  • Nginx


    docker pull nginx  --拉取Nginx最新镜像
    #此处省略拉取镜像过程中的几十行命令
    #
    ....
    #
    ....

    docker run --name nginx-local -p 8080:80 -d nginx --启动Nginx容器

    #参数说明
    --name nginx-local:设置容器名称
    -p 8080:80:端口进行映射,将本地 8080 端口映射到容器内部的 80 端口
    -d:设置容器在在后台一直运行
    nginx:镜像名或标签名


     浏览器中输入 http://localhost:8080


  • MySQL


    docker pull mysql  --拉取MySQL最新镜像
    #此处省略拉取镜像过程中的几十行命令
    #
    ....
    #
    ....

    docker run
    --name mysql-local -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

    #参数说明
    --name mysql-local:设置容器名称
    -p 3306:3306:端口进行映射,将本地 3306端口映射到容器内部的 3306 端口
    -e MYSQL_ROOT_PASSWORD=123456 :设置mysql的登录密码,默认帐号名为root
    -d:设置容器在在后台一直运行
    mysql:镜像名或标签名


     测试连接 MySQL
    

  • Docker Desktop 中同步显示镜像

新建 Asp.Net Core 项目

  • 在项目中添加健康检查组件

    Install-Package Microsoft.Extensions.Diagnostics.HealthChecks
  • 在 Startup.cs 文件中添加注册代码


    public void ConfigureServices(IServiceCollection services)
    {
    services.AddHealthChecks();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    app.UseHealthChecks(
    "/health");
    }


     

  • 在控制器中随便写一个 Action 方法


  • 通过 VS 运行项目,测试健康检查Action

生成 Dockerfile 文件

  • VS 很早就支持快速生成 Dockerfile,在项目的右键中,添加 Docker 支持,选择 Linux 即可


  • 编辑 Dockerfile 添加时区,当然也可以什么都不动,直接进行下一步

    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    RUN echo
    ''Asia/Shanghai'' >/etc/timezone

     

  • 在 VS 中打开终端,也可以手动打开命令行终端工具 cd 到项目解决方案根目录下
    注意:命令行打开必须是定位在解决方案根目录下,这么做是因为项目复杂以后项目之间会相互引用,而 Dockefile 文件自动生成出来的 csproj 引用路径默认是以解决方案根目录为准,除非你手动修改了 Dockerfile 中 csproj 的文件路径


  • 在命令行中输入 docker build 命令,构建镜像

  • docker build -f DockerApi/Dockerfile -t docker-api .   --注意结尾最后还有个点
    #此处省略构建镜像过程中的几十行命令
    #....
    #....

    #参数说明
    -f DockerApi/Dockerfile :指定Dockerfile文件路径,如果Dockerfile已经在当前定位的目录下就不用特别指定了
    -t docker-api : 设置镜像标签为docker-api,标签名自定义
    . :构建镜像的上下文路径

    #构建完成后查看镜像
    docker images


  • 启动容器

  • docker run --name docker-api -it -p 5000:80 docker-api
    #参数说明
    --name docker-api :设置容器名称
    -it :i-交互式操作,t-终端
    -p 5000:80 :端口进行映射,将本地5000端口映射到容器内部的80端口
    docker-api :镜像名或标签名
  • 打开浏览器输入
    http://localhost:5000/health
    http://localhost:5000/api/demo/get



  • 大功告成!查看 Docker Desktop,同步显示所有容器

 

以上就是 Docker 上部署 Asp.Net Core 的所有实操步骤,如果按教程一步步来,应该是没有多大问题的 

作者:Harry

原文出处:https://www.cnblogs.com/simendancer/articles/14967916.html

本文分享自微信公众号 - dotNET 跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

 

  这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook

总要和一些数据库打交道吧,比如说MysqL,mongodb,redis,通常情况下这些存储设备要么是以容器的方式承载,要么是由DBA在非容器环境下统一管理。

 

一:webnotebook连接容器redis

       我们做一个小案例,把网站的所有PV记录到redis中,webnotebook前端显示当前你是 xxx 位用户,案例不重要,重要的是怎么去实现容器互联。

 

      在docker hub 上去找redis的官方镜像,具体redis该如何合理配置这里我就不管了,用最简单的一条docker run 跑起来再说。

[root@localhost data]# docker run --name some-redis -d redis
Unable to find image ''redis:latest'' locally
latest: Pulling from library/redis
6ae821421a7d: Pull complete 
e3717477b42d: Pull complete 
8e70bf6cc2e6: Pull complete 
0f84ab76ce60: Pull complete 
0903bdecada2: Pull complete 
492876061fbd: Pull complete 
Digest: sha256:dd5b84ce536dffdcab79024f4df5485d010affa09e6c399b215e199a0dca38c4
Status: Downloaded newer image for redis:latest
ed07890700a5cdb7d737a196c28009a9d1b08de35f55d51f53c80e6cfe6ba199
[root@localhost data]# 
[root@localhost data]# 
[root@localhost data]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
ed07890700a5        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp            some-redis

    

    接下来安装 StackExchange.Redis,在Index这个Action中将当前的访问作为一个PV记录到redis中,不过下面的代码要注意一点的就是,为了去访问redis,

这里我采用了redis.webnotebook.com 去映射到redis容器的ip,映射关系可以在创建容器的时候自动追加到 /etc/hosts 中,每一次访问都执行一次Increment自

增操作。

   public class HomeController : Controller
    {
        static Logger logger = LogManager.GetLogger(SimpleDemo");
        static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(redis.webnotebook.com:6379);

        /// <summary>
        /// 读取mongodb数据数据
        </summary>
        <returns></returns>
        public IActionResult Index()
        {
            var db = redis.GetDatabase();

            var num = db.StringIncrement(count);

            ViewData[num"] = num;

            return View();
        }
    }

   

     在UI上,展示下你当前是多少位访客,就是这样。

<div ="text-center">
    h1 ="display-4">您是当前 @ViewData["num"]  位访客</h1p>Learn about a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Corea>.>
div>

     

     然后你就可以docker build,完了之后docker run时通过 --link  some-redis:redis.webnotebook.com  去指定一下就好了,some-redis是redis容器的名字,

redis.webnotebook.com 是这个some-redis别名,这样就方便的实现了 redis.webnotebook.com和容器ip的映射关系。

[root@localhost publish]# docker run -d --name webnotebook -p 8080:8080 --link some-redis:redis.webnotebook.com huangxincheng/webnotebook:v1
b931e040de26c4bfc0b49cbc8e626cdcb30ad9bdff523f623c0a2d6c50899a81
[root@localhost publish]# 
[root@localhost publish]# 
[root@localhost publish]# docker 
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
b931e040de26        huangxincheng/webnotebook:v1   dotnet WebNotebook.…"   2 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   webnotebook
ed07890700a5        redis                          27 minutes ago      Up 27 minutes       6379/tcp                 some-redis

       有些人可能就好奇了,到底webnotebook容器内的/etc/hosts真的修改了吗? 接下来你可以通过 docker exec 到webnotebook容器去看一下就好啦,

从下面标红的地方可以看到,172.17.0.2 已经和 xxx.com 做了映射。

[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@b931e040de26:/data# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    redis.webnotebook.com ed07890700a5 some-redis
172.17.0.3    b931e040de26
root@b931e040de26:/data# 

 

     回到文章开头的问题,如果redis是在远程宿主机上部署的,那我的webnotebook容器该怎么访问呢?你可能会说,直接通过ip访问即可,但是为了保持

统一性,我还是希望通过redis.webnotebook.com 这个域名进行访问,也就是说怎么去把这个映射关系追加到容器中呢?可以使用-- add-host来实现。

[root@localhost publish]#  docker run -d --name webnotebook -p --add-host redis.webnotebook.com:172.17.0.2 huangxincheng/webnotebook:v1
91e7d9c1b575cc34ae98eebfc437d081b852f450104e2b368f898299852b0f18
[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@91e7d9c1b575:/data# 172.17.0.2    redis.webnotebook.com
    91e7d9c1b575
root@91e7d9c1b575:/data# 

   

二:docker-compose 容器编排

      目前我们仅引入了redis,这样有了两个容器,但随着业务的增加,你可能还需要MysqL,ssdb,rabbitmq,Nginx等服务,而docker建议的就是一个容器

一个进程,那为了能顺利承载这些服务,你可能需要部署6个容器,如果你还是按照老一套的方法一个一个的去部署,操作起来就比较乱,有没有一种方式可

以让docker自动帮我们一键部署好这些容器呢? 就好像dockerfile那样自动化部署,当然有了,那就是docker-compose 容器编排。

 

1. 安装

    官网地址:https://docs.docker.com/compose/install/#install-compose  然后按照步骤一步一步来就好了,最后通过docker-compose --version 看一下即可。

[root@localhost publish]# sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@localhost publish]# sudo chmod +x /usr/local/bin/docker-compose
[root@localhost publish]# docker-compose --version
docker-compose version 1.22.0,build f46880fe
[root@localhost publish]#

 

2. 编写docker-compose 

    docker-compose的所有命令都在 https://docs.docker.com/compose/compose-file/  上面找得到,如果有兴趣可以查看一下。

version: 3.0
services:
  webnotebook:
    container_name: webnotebook
    build: 
      context: .
      dockerfile: ./Dockerfile
    depends_on:
      - redis
    links:
      - redis:redis.webnotebook.com
    ports:
      - 8080:8080
  redis:
   container_name: some-redis
   image: redis

 

   上面的配置看起来不难吧,如果不知道参数的意思,还是那句话,查看官方文档, 最后你可以使用 docker-compose up --build 跑起来,或者使用 -d 参数

进行后台运行。

[root@localhost publish]# docker-compose up --build
Building webnotebook
Step 1/9 : FROM microsoft/dotnet:2.2-aspnetcore-runtime
 ---> dad26d192ae6
Step 2/9 : ENV TZ Asia/Shanghai
 ---> Using cache
 ---> 72535a350c5d
Step 3/9 : LABEL author hxc@qq.com
 ---> d4dcb4ba06aa
Step 4/9 : RUN mkdir /data
 ---> 6bbfc1537e42
Step 5/9 : copY ./ / 5401b74ec21f
Step 6/9 : workdir / d93e7949b527
Step 7/9 : VOLUME /data/log
 ---> 39c4285c6d6c
Step 8/9 : EXPOSE 8080
 ---> d02932ddfbcc
Step 9/9 : CMD [ dotnet",WebNotebook.dll ]
 ---> 0572ceea51a1
Successfully built 0572ceea51a1
Successfully tagged publish_webnotebook:latest
Starting some-redis ... done
Starting webnotebook ... 
Attaching to some-redis,webnotebook
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
some-redis     | 03.160 # Redis version=5.0.3,bits=64,commit=00000000,modified=0,pid=1dis     | 03.160 # Warning: no config file specified,using the default config. In order to specify a config file use redis-server /path/to/redis.conf
some-redis     | 1:M 03.161 * Running mode=standalone,port=6379.
some-redis     | 03.161 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 12803.161 # Server initialized
some-redis     | 03.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add vm.overcommit_memory = 1'' to /etc/sysctl.conf and then reboot or run the command sysctl vm.overcommit_memory=1''  this to take effect.
some-redis     | 03.161 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command echo never > /sys/kernel/mm/transparent_hugepage/enabled'' as root,and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
some-redis     | 03.161 * Ready to accept connections
webnotebook    | : Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[]
webnotebook    |       User profile is available. Using /root/.aspnet/DataProtection-Keys as key repository; keys will not be encrypted at rest.
webnotebook    | Hosting environment: Production
webnotebook    | Content root path: /data
webnotebook    | Now listening on: http://[::]:8080
webnotebook    | Application started. Press Ctrl+C to shut down.

非常简单吧,只要我有一个docker-comose文件就可以实现一键部署,好了,希望本篇对你有帮助。

 

总结

以上是小编为你收集整理的8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

 一、前言

  在之前的文章(ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路)中,我介绍了如何在 Linux 环境中安装 .NET Core SDK /.NET Core Runtime、Nginx、MySQL,以及如何将我们的 ASP.NET Core MVC 程序部署到 Linux 上,同时,使用 supervisor  守护程序守护我们的 .NET Core 程序。如果,你有看过那篇文章,并且和我一样是个 Linux 小白用户的话,可能第一感觉就是,把 .NET Core 项目部署在 IIS 上也挺好。

  将 .NET Core 项目部署到 Linux 上如此复杂,就没有简单的部署方式吗?

  你好,有的,Docker 了解一下~~~

  PS:这里的示例代码还是采用之前的毕业设计项目,在这篇文章发布的时候,我已经在程序的仓库中添加了对于 Docker 的支持,你可以下载下来,自己尝试一下,毕竟,实践出真知。

   代码仓储:https://github.com/Lanesra712/Danvic.PSU

 二、Step by Step

  1、安装 Docker & Docker Compose

  在代码交付的过程中,偶尔会遇到这样的问题,在本地测试是好的,但是部署到测试环境、生产环境时就出这样那样的问题,同时,因为本地与测试环境、生产环境之间存在差异,我们可能无法在本地复现这些问题,那么,有没有一种工具可以很好的解决这一问题呢?随着历史的车轮不断前行,容器技术诞生了。

  Docker,作为最近几年兴起的一种虚拟化容器技术,他可以将我们的运行程序与操作系统做一个隔离,例如这里我们需要运行 .NET Core 程序,我们不再需要关心底层的操作系统是什么,不需要在每台需要需要运行程序的机器上安装程序运行的各种依赖,我们可以通过程序打包成镜像的方式,将应用程序和该程序的依赖全部置于一个镜像文件中,这时,只要别的机器上有安装 Docker,就可以通过我们打包的这个镜像来运行这个程序。

  1.1、卸载 Docker

  在安装 Docker 之前,我们应该确定当前的机器上是否已经安装好了 Docker,为了防止与现在安装的 Docker CE 发生冲突,这里我们先卸载掉以前版本的 Docker,如果你确定你的机器上并没有安装 Docker 的话此步可以跳过。

  在 Linux 中可以使用 \ 加 Enter 在输入很长很长的语句时进行换行,这里和后面的命令都是采用这样的方式。

sudo yum remove docker \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine

  1.2、添加 yum 源

  在安装 Docker CE 的方式上,我是采用将 Docker CE 的源添加到 yum 源中,之后我们就可以直接使用 yum install 安装 Docker CE,整个的安装过程如下。

# 安装工具包从而可以让我们在 yum 中添加别的仓储源
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

# 设置 docker ce 的稳定库地址
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 安装 docker ce
sudo yum install docker-ce docker-ce-cli containerd.io

  当我们安装好 Docker 之后,我们就可以使用 docker 命令验证我们是否在机器上成功安装了 Docker,同时,也可以使用 docker --version 命令查看我们安装的 Docker CE 版本。

  1.3、设置开机自启

  当 Docker 已经在我们的机器上安装完成后,我们就可以将 Docker 设置成机器的自启服务,这样,如果出现服务器重启的情况下,我们的 Docker 也可以随服务器的重启自动启动 Docker 服务。

# 启动 Docker 服务并允许开机自启
sudo systemctl start docker

# 查看当前 dokcer 的运行情况
sudo systemctl status docker

  1.4、Hello World

  就像我们在学习一门新的语言时,运行的第一句代码,几乎都是打印出 Hello World,而在 Docker Hub 中,也有这么一个镜像,在无数的 Docker 教程中,安装完 Docker 后,第一件事就是拉取这个镜像文件,“告诉” Docker,我来了。

  Docker Hub 是存放镜像的仓库,里面包含了许多的镜像文件,因为服务器在国外的原因,下载的速度可能不理想,像国内的阿里云、腾讯云也有提供对于 Docker 镜像的加速器服务,你可以按需使用,当然,你也可以创建属于你的私有镜像仓库。

docker run hello-world

  docker run 命令,它会在我们的本地镜像库中先寻找这个镜像,然后运行。如果在本地没有找到的话,则会自动使用 docker pull 从 Docker Hub 中寻找,能找到的话,则会自动下载到本地,然后运行,找不到的话,这条命令也就运行失败了。

  1.5、安装 Docker Compose

  在实际的项目开发中,我们可能会有多个应用镜像,例如在本篇文章的示例中,为了在 Docker 中运行我们的程序,我们需要三个镜像:应用程序自身镜像、MySQL Server 镜像、以及 Nginx 镜像,为了将我们的程序启动起来,我们需要手敲各个容器的启动参数,环境变量,容器命名,指定不同容器的链接参数等等一系列的操作,又多又烦,可能某一步操作失败后程序就无法正常运行。而当我们使用了 Docker Compose 之后,我们就可以把这些命令一次性写在 docker-compose.yml 配置文件中,以后每次启动我们的应用程序时,只需要通过 docker compose 命令就可以自动帮我们完成这些操作。

# 从 github 下载 docker compose 二进制文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 对下载的二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 查看 docker compose 版本
docker-compose --version

  2、构建程序镜像

  当我们在服务器上安装好 docker 和 docker compose 之后,就可以开始构建我们的程序镜像了。首先我们需要对我们的运行程序添加对于 Docker 的支持。你可以自己手动在 MVC 项目中添加 Dockerfile 文件,或是通过右键添加 Docker 支持。

  Dockerfile 就像一个执行的清单,它告诉 Docker,我们这个镜像在构建和运行时需要按照什么样的命令运行。打开 VS 为我们自动创建的 Dockerfile,可以看到清晰的分成了四块的内容。

  我们知道,.NET Core 程序的运行需要依赖于 .NET Core Runtime(CoreCLR),因此,为了使我们的程序可以运行起来,我们需要从 hub 中拉取 runtime ,并在 此基础上构建我们的应用镜像。同时,为了避免因为基础的环境的不同造成对程序的影响,这里的 Runtime 需要同程序开发时的 .NET Core SDK 版本保持一致,所以这里我使用的是 .NET Core 2.1 Runtime。

  一个镜像中包含了应用程序及其所有的依赖,与虚拟机不同的是,容器中的每个镜像最终是共享了宿主机的操作系统资源,容器作为用户空间中的独立进程运行在主机操作系统上。

  PS: 图片版权归属于微软的技术文档,如有侵权,请联系我删除,源文件地址:什么是 Docker?

  镜像可以看成一个个小型的 “虚拟主机”,这里我们在镜像中创建了一个 /app 路径作为我们程序在镜像中的工作目录,同时,将 80 端口暴露给 Docker,从而可以使我们在镜像外面通过端口访问到当前镜像中的运行的程序。

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

  因为我们的应用是一个多层架构的单体应用,最终的 MVC 项目依赖于解决方案中的各个类库以及我们从 Nuget 中下载的各种第三方组件,在部署时,需要将这些组件打包成 dll 引用。所以,这里我们需要使用 .NET Core SDK 中包含的 .NET Core CLI 进行还原和构建。

  就像在下面的代码中,我们在镜像的内部创建了一个 /src 的路径,将当前解决方案下的类库都复制到这个目录下,之后通过 dotnet restore 命令还原我们的主程序所依赖的各个组件。当我们还原好依赖的组件后,就可以使用 dotnet build 命令生成 Release 版本的 dll 文件,同时输出到之前创建的 /app 路径下。

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["PSU.Site/PSU.Site.csproj", "PSU.Site/"]
COPY ["03_Logic/PSU.Domain/PSU.Domain.csproj", "03_Logic/PSU.Domain/"]
COPY ["03_Logic/PSU.Repository/PSU.Repository.csproj", "03_Logic/PSU.Repository/"]
COPY ["01_Entity/PSU.Entity/PSU.Entity.csproj", "01_Entity/PSU.Entity/"]
COPY ["02_Infrastructure/PSU.Utility/PSU.Utility.csproj", "02_Infrastructure/PSU.Utility/"]
COPY ["04_Rule/PSU.Model/PSU.Model.csproj", "04_Rule/PSU.Model/"]
COPY ["02_Infrastructure/PSU.EFCore/PSU.EFCore.csproj", "02_Infrastructure/PSU.EFCore/"]
COPY ["04_Rule/PSU.IService/PSU.IService.csproj", "04_Rule/PSU.IService/"]
COPY ["Controllers.PSU/Controllers.PSU.csproj", "Controllers.PSU/"]
RUN dotnet restore "PSU.Site/PSU.Site.csproj"
COPY . .
WORKDIR "/src/PSU.Site"
RUN dotnet build "PSU.Site.csproj" -c Release -o /app

  上面一步可以看成我们在使用 VS 生成 Release 版本的解决方案,当生成没有出错之后,我们就可以进行程序的发布。

FROM build AS publish
RUN dotnet publish "PSU.Site.csproj" -c Release -o /app

  当已经生成发布文件之后,按照我们平时部署在 Windows 上的过程,这时就可以通过 IIS 部署运行了,因此,构建我们应用镜像的最后一步就是通过 dotnet 命令执行我们的程序。

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "PSU.Site.dll"]

  似乎到这一步构建程序镜像就结束了,按照这样流程做的话,就需要我们将整个的解决方案上传到服务器上了,可是,很多时候,我们仅仅是把我们在本地发布好的项目上传到服务器上,这与我们现在的构建流程具有很大的不同,所以这里我们来修改 Dockerfile 文件,从而符合我们的发布流程。

  从上面分析 Dockerfile 的过程中不难看出,在服务器上构建镜像的第二步、第三步就是我们现在在开发环境中手动完成的部分,所以这里,我们只需要对这部分进行删除即可,修改后的 Dockerfile 如下。

FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY . /app 
EXPOSE 80
ENTRYPOINT ["dotnet","PSU.Site.dll"]

  在修改后的 Dockerfile 中,可以看到,我们删去了 build 和 release 的过程,选择直接将我们 Dockerfile 路径下的文件拷贝到镜像中的 /app 路径下,然后直接执行 dotnet 命令,运行我们的程序。

  为了确保 Dockerfile 与发布后的文件处于同一路径下,这里我们需要使用 VS 修改 Dockerfile 的属性值,确保会复制到输出的目录下,这里选择如果较新则复制即可。

  3、编写 docker-compose.yml

  当我们构建好应用的镜像,对于 Nginx 和 MySQL 我们完全可以从 hub 中拉取下来,再执行一些配置即可。所以,我们现在就可以编写 docker compose 文件,来定义我们的应用镜像运行时需要包含的依赖以及每个镜像的启动顺序。

  右键选中 MVC 项目,添加一个 docker-compose.yml 文件,同样的,需要修改该文件的属性,以便于该文件可以复制到输出目录下。注意,这里的文件名和上文的 Dockerfile 都是特定的,你不能做任何的修改。如果你的电脑上已经安装了 Docker for Windows,你也可以使用 VS,右键添加,选中容器业务流程协调程序支持自动对 docker compose 进行配置。

  在 yml 文件中,我定义了三个镜像:psu.site、docker.mysql、docker.nginx。三个镜像的定义中有许多相同的地方,都设置了自动重启(restart),以及都处于同一个桥接网络下(psu-net)从而达到镜像间的通信。

  docker.mysql 是 MySQL 的镜像,我们通过环境变量 MYSQL_ROOT_PASSWORD 设置了 MySQL 的数据库连接密码,并通过挂载卷的方式将镜像中的数据库文件持久化到我们的服务器本地路径中。同时,将镜像的 3306 端口映射到服务器的 3306 端口上。

  psu.site 则是我们的程序镜像,采用位于 /usr/wwwroot/psu/ 路径下的 Dockerfile 文件进行构建的,因为主程序的运行需要依赖于数据库,所以这里采用 depends_on 属性,使我们的应用镜像依赖于 docker.mysql 镜像,即,在 docker.mysql 启动后才会启动应用镜像。

  docker.nginx 则是我们的 nginx 镜像,这里将镜像中的 80 端口和 443 端口都映射到服务器 IP 上,因为我们需要配置 Nginx 从而监听我们的程序,所以通过挂载卷的方式,将本地的 nginx.conf 配置文件用配置映射到镜像中。同时,因为我们在构建应用镜像的 Dockerfile 文件时,对外暴露了 80 端口,所以这里就可以通过 links 属性进行监听(如果构建时未暴露端口,你可以在 docker compose 文件中通过 Expose 属性暴露镜像中的端口)。

  Nginx 的配置文件如下,这里特别需要注意文件的格式,缩进,一点小错误都可能导致镜像无法正常运行。如果你和我一样将 nginx.conf 放到程序运行路径下的,别忘了修改文件的属性。

server {
    listen 80;
	
    location / {
      proxy_pass http://psu.site;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Host $http_host;
      proxy_cache_bypass $http_upgrade;
    }
}

  一个完整的 docker compose 文件如下,包含了三个镜像以及一个桥接网络。

version: ''3.7''

services:
  docker.mysql:
    image: mysql
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=123456@sql
    volumes:
      - /usr/mysql:/var/lib/mysql
    networks:
      - psu-net

  psu.site:
    build: /usr/wwwroot/psu/
    restart: always
    depends_on:
      - docker.mysql
    networks:
      - psu-net

  docker.nginx:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    links:
      - psu.site
    networks:
      - psu-net

networks:
  psu-net:
    driver: bridge

  这里需要注意,所有有用到镜像间的通信的地方,我们都需要使用镜像名进行指代,例如上面的 nginx 的配置文件中,我们需要将监听的地址改为镜像名称,以及,我们需要修改程序的数据库访问字符串的服务器地址,修改后的数据库连接字符串如下所示。

"ConnectionStrings": {
    "SQLConnection": "server=docker.mysql;database=PSU.Site;user=root;password=123456@sql;port=3306;persistsecurityinfo=True;"
  }

  4、发布部署程序

  当我们构建好 docker compose 文件后就可以把整个文件上传到服务器上进行构建 docker 镜像了。这里我将所有的部署文件放在服务器的 /usr/wwwroot/psu/ 路径下,这时我们就可以通过 docker compose 命令进行镜像构建。

  定位到部署文件在的位置,我们可以直接使用下面的命令进行镜像的(重新)构建,启动,并链接一个服务相关的容器,整个过程都会在后台运行,如果你希望看到整个过程的话,你可以去掉 -d 参数。

# 执行镜像构建,启动
docker-compose up -d

  当 up 命令执行完成后,我们就可以通过 ps 命令查看正在运行的容器,若有的容器并没有运行起来,则可以使用 logs 查看容器的运行日志从而进行排错。

# 查看所有正在运行的容器
docker-compose ps

# 显示容器运行日志
docker-compose logs

 三、总结

    本章主要是介绍了如何通过 docker 容器,完整的部署一个可实际使用的 .NET Core 的单体应用,相比于之前通过 Linux 部署 .NET Core 应用,可以看到整个步骤少了很多,也简单很多。文中涉及到了一些 docker 的命令,如果你之前并没有接触过 docker 的话,可能需要你进一步的了解。当我们将程序打包成一个镜像之后,你完全可以将镜像上传到私有镜像仓库中,或是直接打包成镜像的压缩文件,这样,当需要切换部署环境时,只需要获取到这个镜像之后即可快速完成部署,相比之前,极大的方便了我们的工作。

原文出处:https://www.cnblogs.com/danvic712/p/10566750.html

ASP.NET Core 开发 - Docker 部署运行

ASP.NET Core 开发 - Docker 部署运行

ASP.NET Core 开发 Docker 部署,.NET Core 支持 Docker 部署运行。我们将 ASP.NET Core 部署在 Docker 上运行。

大家可能都见识过 Docker ,今天我们就详细了解一下 Docker 的用途,以及真实的应用场景。

Docker 源于 PaaS,PaaS 的应用场景即是 Docker 的应用场景。

Platform as a Service: 平台即服务,是面向软件开发者的服务,云计算平台提供硬件,OS, 编程语言,开发库,部署工具,帮助软件开发者更快的开发软件服务。比如 Google 的 GAE.

八个 Docker 的真实应用场景 http://dockone.io/article/126

Docker 最大优势:

静态打包:把应用程序及其运行时打包为一个镜像;
动态运行:以一个应用容器的形式运行这个应用。

我们无需再关心每个系统要安装什么环境,直接将镜像复制到系统中运行。

一次打包,直接运行。

参考 Docker 的 logo , 我们可以将 Docker 理解为鲸鱼上的集装箱,而鲸鱼就是操作系统。

Docker 是一个集装箱,将所有的环境打包好在一起,我们只需要考虑挪动集装箱。

 

下面我们就来正式开.NET Core 的 Docker 之旅。

 

Docker 命令:

docker 命令相关了解。

docker images //镜像列表

 
docker ps -a //所有运行过的容器
docker ps -l //最后运行容器

docker export 容器id > 文件  //持久化容器

docker import 文件 //导入容器

 
cat export.tar | docker import - linezero/demo-export:latest

 

docker save 镜像id > 文件 //持久化镜像

docker load < 文件

 

docker rm 容器id //删除容器

docker rmi 镜像id/镜像名称  //删除镜像

docker run 镜像 //运行

 

提示:可以使用 docker rm $(docker ps -q -a) 一次性删除所有的容器,docker rmi $(docker images -q) 一次性删除所有的镜像。

 

ASP.NET Core 运行于 Docker

本文环境 :Ubuntu 14.04  Docker for Linux 1.11.2

 

首先我们创建一个 ASP.NET Core 应用。

dotnet new -t web

然后在 Program.cs 添加 UseUrls("http://*:5000")

还原 dotnet restore

发布 dotnet publish

我们在 publish 文件夹添加 Dockerfile 文件

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

EXPOSE 5000/tcp

ENTRYPOINT ["dotnet", "aspnetcore.dll"]

最终 publish 目录如下:

 

 

将 publish 文件夹复制到 Ubuntu 系统

运行构建命令,构建 Docker 镜像。 

docker build -t linezero/demo .

后面的点是需要的。

然后运行容器

docker run -it -p 8080:5000 linezero/demo

 

 

容器跟镜像的关系,一个镜像可以创建多个容器。

如上面的,我可以再创建一个 docker run -d -p 8090:5000 linezero/demo 

-d 参数也就是后台运行,然后通过 docker ps 可以看到容器运行的状态,通过 docker stop 容器 id 停止。

 

Dockerfile  Docker 容器配置文件

源码模板

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

ENTRYPOINT ["dotnet", "run"]

 

发布后模板

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

EXPOSE 5000/tcp

ENTRYPOINT ["dotnet", "xx.dll"]

以上模板都依赖于  microsoft/dotnet 镜像,单独安装的命令为

docker pull microsoft/dotnet

也可以先不安装,build 的时候会为我们安装。国内速度可能有些慢,请耐心等待。

有了 Docker dotnet 镜像,你无需折腾 dotnet sdk 安装,镜像自带。

 

我们如果想将 Docker 放置到其他机器运行,很简单。

直接保存镜像,然后复制镜像到其他机器,然后使用 docker 命令 load 既可。

docker save linezero/demo > demo.tar

然后加载命令

docker load < demo.tar

然后就可以使用 docker run 运行程序了,无需关心程序需要哪些依赖。

 

原文链接:https://www.cnblogs.com/linezero/p/docker.html

Asp.Net Core&Docker 部署到树莓派 3B 中

Asp.Net Core&Docker 部署到树莓派 3B 中

原文: Asp.Net Core&Docker 部署到树莓派 3B 中

  花了一点时间将吃灰数月的树莓派装上了 Docker,并在容器中部署了一个 Asp.Net Core 应用程序,通过花生壳映射树莓派中的程序,可以使用外网访问树莓派,玩起来很有意思 (外网访问地址:http://2194cn9096.imwork.net/,访问不通可能树莓派断电了),过程中发现了一点问题,或许对于同样路线的朋友有所帮助,特此写出玩转过程。

  码云 Demo 地址:https://gitee.com/530521314/ControlEvent.git

 

一、树莓派安装操作系统

  1、进入官网下载操作系统:https://www.raspberrypi.org/downloads/,我使用了官方的 Raspbian 系统,并且选择了无界面的轻量版 Raspbian Stretch Lite.

  

  2、下载格式化 SD 卡的工具:https://www.sdcard.org/downloads/formatter_4/eula_windows/

  3、下载将系统烧录到 SD 卡中的工具 Win32 DiskImager:http://sourceforge.net/projects/win32diskimager/,选择系统磁盘路径地址,选择卡,然后执行 Write 即可,等待几分钟,便完成烧录工作

   

  4、做一些配置工作,方便启动树莓派后可以快速玩转

   4.1、启动 SSH,在卡分区内创建一个名为 ssh 的文件夹即可

   4.2、设置无线连接,本次我没有使用外接显示器到树莓派中,使用 Putty 工具直接无线连接,个人感觉更为方便,在卡内 boot 文件夹内,创建一个 wpa_supplicant.conf 的文件,并写下如下内容,该内容在树莓派通电后会由系统自动添加到 /etc/wpa_supplicant/wpa_supplicant.conf 中,设置完毕后便可以插入到树莓派,开始通电了

country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

//WiFi没有密码
network={
ssid="你的无线网络名称(ssid)"
    key_mgmt=NONE
}

//WiFi使用WEP加密
network={
    ssid="无线网络名称(ssid)"
    key_mgmt=NONE
    wep_key0="wifi密码"
}

//WiFi使用WPA/WPA2加密
network={
    ssid="无线网络名称(ssid)"
    key_mgmt=WPA-PSK
    psk="wifi密码"
}

//以我的举例(priority连接优先级最高):
network={
    ssid="Yang1802"
    key_mgmt=WPA-PSK
    psk="xxxxxxxx"
    priority=1
}

   4.3、使用 Putty 连接树莓派,树莓派 ip 地址可以找办法查看(如我使用的华为路由器,则可以登录路由器管理平台查看),使用账号 pi,密码 raspberry 完成登录,开始校正树莓派时间

// 设置时区为 亚洲(Asia) 上海(Shanghai)
sudo dpkg-reconfigure tzdata
// 启动 NTP 使计算机时钟与 Internet 时间服务器同步
sudo timedatectl set-ntp true

   5、切换到 root 账号,方便操作

sudo su

  

二、树莓派安装 Docker

   1、开始安装 Docker,由于树莓派使用的是 ARM 板,因此在安装 Docker 时,需要使用 ARM 板的安装教程:https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script,使用提供的安装脚本完成安装即可,需要等待一些时间。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

  2、安装 Git 工具,安装 Git 的目的是用于下载码云上的代码到树莓派中,虽然这个环节是有点冗余的,当我配置好了一台 Jenkins 服务器后,完全可以使用 Jenkins 服务器的功能将需要的镜像生产完成,因此这个环节就显得不这么重要了,但是,如果没有 Jenkins 服务器,那么这个环节就不得不进行了,毕竟需要将代码转移到树莓派中,或是开发环境中开发完毕,使用 ftp 转移到树莓派中等多种方式实现,使用如下命令安装 git 工具。

sudo apt-get install git

 

三、使用 Dockerfile 编译镜像并生成容器

   1、新建应用程序,按照约定的标准化应用程序构建方式完成项目搭建 (前几篇文章中讲到了),具体的项目结构可以从码云中查看。

  

  2、增加 Dockerfile 并修改默认的 Dockerfile 内容,由于树莓派使用的是 Arm 板子,因此对于.net core 运行环境也有所不同,在 Dockerfile 中需要指定发布目标平台,具体 Dockerfile 如下,使用的基础镜像可以从 dotnet 组织提供的示例中找到:https://github.com/dotnet/dotnet-docker,我针对该示例中有的 Dockerfile 做了一些改动,以适应项目结构的需要。

FROM microsoft/dotnet:2.2-sdk-stretch-arm32v7 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY ControlEvent.Web.csproj ./ControlEvent.Web/
WORKDIR /app/ControlEvent.Web
RUN dotnet restore

# copy and build app and libraries
WORKDIR /app/
COPY . ./ControlEvent.Web/
WORKDIR /app/ControlEvent.Web
RUN dotnet publish -c Release -r linux-arm -o out

FROM microsoft/dotnet:2.2-runtime-deps-stretch-slim-arm32v7 AS runtime
WORKDIR /app
COPY --from=build /app/ControlEvent.Web/out ./
ENTRYPOINT ["./ControlEvent.Web"]

  3、提交代码,在树莓派中使用 Git 克隆项目获取代码,并进入到 Dockerfile 层级使用命令构建镜像

  

  使用如下命令构建镜像,我的目标镜像名称为 controlevent,此次构建要花费点时间,需要下载相关的基础镜像,下一次构建时会很快了

docker build --pull -t controlevent .

  4、使用如下命令生成容器,本次指定了 - it 参数,在生成完毕后可以查看控制台输出,直接按 Ctrl Q 和 P 退出即可,也可直接使用 - d 参数后台运行

docker run --rm -it -p 9527:80 controlevent

  

  5、使用 ip 地址及端口访问,如果绑定了花生壳,并且在花生壳中做了本地映射,也可以直接使用域名加端口直接访问树莓派中的服务

 至此,本次树莓派中安装 Docker 并部署 Asp.Net Core 应用程序就完成了。

 

 本文地址:https://www.cnblogs.com/CKExp/p/10233780.html

 欢迎关注微信订阅号,有新的文章将同步到订阅号中

  

2019-1-7,望技术有成后能回来看见自己的脚步

今天关于从零实操基于 WSL2 Docker 部署 Asp.Net Core 项目wsl2运行docker的分享就到这里,希望大家有所收获,若想了解更多关于8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署、ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx、ASP.NET Core 开发 - Docker 部署运行、Asp.Net Core&Docker 部署到树莓派 3B 中等相关知识,可以在本站进行查询。

本文标签:

上一篇asp.net core 自定义 Content-Type(asp.net core 自定义成功页面)

下一篇Docker 小白到实战之 Dockerfile 解析及实战演示,果然顺手(docker dockerfile详解)