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
没有评论