如何部署Docker .NET Core?

.NET

1 基础知识

1.1 基于Docker的.NET简介

– .NET Core可运行于Docker容器中
– 容器提供一种轻量级方法,使应用程序与主机系统的其他组件隔离
– 容器仅共享内核,同时为应用程序提供资源

1.2 Docker的基础知识

1.2.1 映像

– 映像是构成容器基础的文件系统的有序集合
– 映像不具有状态,并且是只读的
– 一个映像可依赖于另一个映像
– 有依赖关系的映像有自己的定义和设置
– 映像包含容器启动时所需的运行参数
– 映像包含容器运行时所部署的应用程序和依赖关系

1.2.2 容器

– 容器是映像的运行实例
– 容器从映像加载部署的应用程序和依赖关系
– 映像可以实例化为多个容器,每个容器实例具有独立的文件系统和内存网络接口

1.2.3 注册表

– 容器注册表是用于存储映像的库
– 容器实例可由注册表中的映像创建
– Docker具有一个托管于Docker中心的公共注册表
– Docker的公共注册表可提供.NET Core的相关映像
– Microsoft容器注册表(MCR)是微软提供的官方注册表(构建于Azure CDN之上,MCR没有面向公众网站)

1.2.4 Dockerfile

– Dockerfile是定义可创建映像的一组指令文件
– Dockerfile中的每个指令创建映像的一个分层
– 重新生成映像如有已更新的层会被重新生成(多数情况下)
– Dockerfile可用于分享创建镜像的方式

2 .NET Core的容器化

2.1 环境的部署

2.1.1 部署.NET Core

如果你尚未部署.NET Core环境,可使用二进制包的方法配置,
https://www.cmdschool.org/archives/7693

2.1.2 部署Docker容器

如果你尚未部署Docker环境,请按如下方法部署,
https://www.cmdschool.org/archives/2183

2.1.3 创建工作文件夹

cd ~
mkdir docker-working

2.1.3 声明SDK版本

vim ~/docker-working/global.json

加入如下配置,

{
  "sdk": {
    "version": "2.2.202"
  }
}

注:如果是高版本SDK(如3.0),请务必强制应用使用SDK2.2

2.1.4 安装相关工具包

yum install -y vim tree bzip2

2.2 创建.NET Core应用

2.2.1 创建应用

cd ~/docker-working
dotnet new console -o app -n myapp

创建完毕后,可使用如下命令查看创建的文件,

tree ~/docker-working/

可见如下输出,

/root/docker-working/
├── app
│   ├── myapp.csproj
│   ├── obj
│   │   ├── myapp.csproj.nuget.cache
│   │   ├── myapp.csproj.nuget.dgspec.json
│   │   ├── myapp.csproj.nuget.g.props
│   │   ├── myapp.csproj.nuget.g.targets
│   │   └── project.assets.json
│   └── Program.cs
└── global.json

2 directories, 8 files

2.2.2 测试应用

cd ~/docker-working/app/
dotnet run

可见如下显示,

Hello World!

2.2.3 修改应用程序

vim ~/docker-working/app/Program.cs

将应用修改如下,

using System;

namespace myapp
{
    class Program
    {
        static void Main(string[] args)
        {
            var counter = 0;
            var max = args.Length != 0 ? Convert.ToInt32(args[0]) : -1;
            while(max == -1 || counter < max)
            {
                counter++;
                Console.WriteLine($"Counter: {counter}");
                System.Threading.Tasks.Task.Delay(1000).Wait();
            }
        }
    }
}

注:
– 以上创建无限循环的代码用于测试
– 请使用【Ctrl+C】快捷键结束

2.3 发布.NET Core应用

2.3.1 发布应用

cd ~/docker-working/app/
dotnet publish -c Release

可见如下提示,

Microsoft (R) Build Engine version 16.0.450+ga8dc7f1d34 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 40.15 ms for /root/docker-working/app/myapp.csproj.
  myapp -> /root/docker-working/app/bin/Release/netcoreapp2.2/myapp.dll
  myapp -> /root/docker-working/app/bin/Release/netcoreapp2.2/publish/

2.3.2 确认应用发布

cd ~/docker-working/app/
ls bin/Release/netcoreapp2.2/publish/

可见如下显示,

myapp.deps.json  myapp.dll  myapp.pdb  myapp.runtimeconfig.json

2.4 创建映像

2.4.1 创建Dockerfile

vim ~/docker-working/Dockerfile

加入如下配置,

FROM mcr.microsoft.com/dotnet/core/runtime:2.2

注:
– 命令“FROM”声明从存储库“mcr.microsoft.com/dotnet/core/runtime”拉取标记为“2.2”的镜像
– 请确当前的.NET Core运行时版本与保拉取镜像的版本一致

2.4.2 简化映像文件

cd ~
tar -cvjf docker-working.tar.gz ~/docker-working/

原则上,我们见你你先备份当前的工作目录,然后执行以下操作,

cd ~/docker-working/
rm -rf app/obj/*
rm -rf app/bin/Debug/
rm -f app/bin/Release/netcoreapp2.2/*.*

简化后可使用如下命令检查工作目录树,

tree ~/docker-working/

可见如下显示,

/root/docker-working/
├── app
│   ├── bin
│   │   └── Release
│   │       └── netcoreapp2.2
│   │           └── publish
│   │               ├── myapp.deps.json
│   │               ├── myapp.dll
│   │               ├── myapp.pdb
│   │               └── myapp.runtimeconfig.json
│   ├── myapp.csproj
│   ├── obj
│   └── Program.cs
├── Dockerfile
└── global.json

6 directories, 8 files

2.4.3 创建镜像

cd ~/docker-working/
docker build -t myimage -f Dockerfile .

可使用如下命令检查创建的镜像,

docker images

可见如下显示,

REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
myimage                                 latest              b938a3374c58        3 weeks ago         181MB
mcr.microsoft.com/dotnet/core/runtime   2.2                 b938a3374c58        3 weeks ago         181MB

以上两个映像具有相同的“IMAGE ID”,是因为Dockerfile只定义以现有映像生成新映像,可使用如下命令形成新的映像层,

vim ~/docker-working/Dockerfile

修改配置如下,

FROM mcr.microsoft.com/dotnet/core/runtime:2.2
COPY app/bin/Release/netcoreapp2.2/publish/ app/
ENTRYPOINT ["dotnet", "app/myapp.dll"]

注:
– 命令“COPY”指示Docker将计算机的“app/bin/Release/netcoreapp2.2/publish/”文件夹复制到容器中的“app/”文件夹
– 命令“ENTRYPOINT”指示Docker将容器配置为可执行文件(容器启动时执行“ENTRYPOINT”命令,当结束时,容器亦停止)
修改完毕后,你需要再次执行以下指令创建镜像,

cd ~/docker-working/
docker build -t myimage -f Dockerfile .

可见如下输出,

Sending build context to Docker daemon  16.38kB
Step 1/3 : FROM mcr.microsoft.com/dotnet/core/runtime:2.2
 ---> b938a3374c58
Step 2/3 : COPY app/bin/Release/netcoreapp2.2/publish/ app/
 ---> Using cache
 ---> c51cd6e4757d
Step 3/3 : ENTRYPOINT ["dotnet", "app/myapp.dll"]
 ---> Using cache
 ---> 1ee8787e56ce
Successfully built 1ee8787e56ce
Successfully tagged myimage:latest

再次使用以下命令查看映象,

docker images

可见如下显示,

REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
myimage                                 latest              1ee8787e56ce        2 minutes ago       181MB
mcr.microsoft.com/dotnet/core/runtime   2.2                 b938a3374c58        3 weeks ago         181MB

2.5 创建容器

2.5.1 新建已经停止的容器

docker create myimage

可见如下输出,

be29063157fbf20e455bca1f0123aa677d5a4f8c8d5c095a9c092cf7956b0908

以上命令基于映象创建容器。

2.5.2 查看当前容器列表

docker ps -a

可见如下显示,

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                   PORTS               NAMES
be29063157fb        myimage             "dotnet app/myapp.dll"   About a minute ago   Created                                      brave_golick

注:
– “CONTAINER ID”是随机分配的,每次创建都会有所不同
– “NAMES”也是随机分配的,用于引用相应的容器实例,以上自动名称为“brave_golick”
– “NAMES”需要使用固定值,请使用“docker create –name”参数启动并指定

2.6 管理容器

2.6.1 启动容器

docker start brave_golick

运行后,可使用以下命令查看已运行的容器,

docker ps

可见如下显示,

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
be29063157fb        myimage             "dotnet app/myapp.dll"   28 minutes ago      Up 13 seconds                           brave_golick

2.6.2 连接容器

docker attach --sig-proxy=false brave_golick

可见如下输出,

Counter: 157
Counter: 158
Counter: 159
Counter: 160
Counter: 161
Counter: 162

注:如需终止,请使用【Ctrl+C】

2.6.3 停止容器

docker stop brave_golick

2.6.4 删除容器

docker rm brave_golick

2.6.5 一次性运行容器

docker run -it --rm myimage

可见如下输出,

Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
Counter: 6

注:以上原则上会随着进程停止而自动删除容器,但由于程序使用的是无限循环,故而请使用以下”stop”指令停止。

2.6.6 更改入口点

docker run -it --rm --entrypoint "bash" myimage

即进入容器内部的命令提示符,

root@dfb0da834d4b:/# 

你可通过熟悉的命令浏览容器的系统环境,例如查看app的目录,

root@dfb0da834d4b:/# ls /app/

可见如下显示,

myapp.deps.json  myapp.dll  myapp.pdb  myapp.runtimeconfig.json

可通过如下命令退出容器环境,

root@dfb0da834d4b:/# exit

===============

.NET和Docker的简介
—————–
https://docs.microsoft.com/zh-cn/dotnet/core/docker/intro-net-docker

.NET Core的容器化
——————
https://docs.microsoft.com/zh-cn/dotnet/core/docker/build-container

.NET Core Hub
——————
https://hub.docker.com/_/microsoft-dotnet-core

没有评论

发表评论

Docker
如何打包Docker Nginx?

1 前言 一个问题,一篇文章,一出故事。 由于docker hub原版本的nginx镜像过于精简,于 …

Docker
如何打包Docker MAC-Telnet?

1 基础知识 一款可以使用MikroTik RouterOS MAC-Telnet协议连接Mikro …

Docker
如何部署Docker Unifi-WiFi?

1 前言 一个问题,一篇文章,一出故事。 笔者Unifi-WiFi想要迁移至docker环境,于是产 …