传统.NET 4.x应用容器化体验(5)

时间:2024-01-29 07:04:42

前面几篇都是基于阿里云ECS直接玩的,有童鞋问直接用Windows Server 2019可以玩不,本篇就为你介绍一下如何给Windows Server 2019配置Docker环境。

1 准备工作

首先,你需要一台服务器,安装 Windows Server 2019 DataCenter(数据中心)版本。

Windows Server 2016版本开始就支持原生Docker了,在2019版本,它做了以下的改进更好地支持Docker:

Kubernetes 1.14 发行版本中包含了将 Windows 容器调度到 Kubernetes 集群中 Windows 节点 (Windows Server 2019) 上的生产级支持,从而使得巨大 的 Windows 应用生态圈能够充分利用 Kubernetes 的能力。

其次,你最好给服务器安装一下更新(非必选步骤):

> scconfig

在弹出的选择框选择:6,然后选择:A

这时Windows Server会下载所有的更新。

最后,启用Windows Server的Container服务:

> Install-WindowsFeature -Name Containers

安装完成后需要重启Windows Server。

2 Docker安装与配置

两种安装方式

在Windows Server 2019中,支持在线安装 和 离线安装 Docker服务,在线安装其实是通过Nuget来安装(耗时较多),这里我们选择直接下载下来离线安装。

下载离线包

这里我们选择下载docker离线安装包 20.10.5 版本,这也是阿里云ECS(Windows Server 2019 with Container镜像)所采用的的版本。

https://dockermsft.blob.core.windows.net/dockercontainer/docker-20-10-5.zip

将离线包解压后放到Windows Server 2019的 C:\Program Files\Docker 目录下,当然,这个目录也需要你手动创建。

设置环境变量

为Docker目录设置环境变量:

配置镜像加速

阿里云ECS主机为我们默认配置了镜像加速源,而在自己搭建的服务器上,需要配置一下镜像加速

创建 C:\ProgramData\docker\config 目录,并在此目录下创建一个 daemon.json 配置文件:

{
    "registry-mirrors": ["https://k2aspcxw.mirror.aliyuncs.com"], 
    "insecure-registries" : [ "reg.edisonzhou.cn" ]
}

这里的内容里,一是为docker配置配置镜像加速(这里使用的阿里云的镜像源),二是为docker配置私有镜像仓库。

Note:设置私有镜像仓库如果配置为hosts 或 域名,请先确保是否有提前设置映射。

启动dockerd服务

将dockerd注册为Windows服务,以便能够开机自启动:

cd C:\Program Files\Docker # 进入dockerd.exe所在目录路径
dockerd --register-service # 将dockerd 注册为服务

然后,通过命令启动dockerd服务:

Start-Service docker

或者直接在服务列表中启动dockerd服务:

切换数据目录

一般情况下,我们的C盘容量总是有限的,因此我们可以切换一下docker默认的数据目录(C盘下),避免将来C盘被docker镜像文件撑爆。我们要做的就是修改daemon.json,增加data-root的配置:

{
    "registry-mirrors": [ "https://k2agpcx0.mirror.aliyuncs.com" ],
    "insecure-registries": [ "reg.edisonzhou.cn" ],
    "data-root": "E://Docker"
}

重新启动docker服务即可生效,不过一旦切换了目录,原来存在镜像以及容器就不被检查出来了,都需要重新创建,所以在切换之前最好先删除原来下载好的镜像&容器

3 pull & run

拉取一些基础镜像

这里我们还是拉取一些如.NET SDK & Runtime之类的基础镜像:

docker pull mcr.microsoft.com/dotnet/framework/sdk:4.8
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.8

构建ASP.NET应用镜像

这里我们将之前的asp.net mvc sample源码拷贝到Windows Server并进行build镜像。

该源码的Dockerfile如下:

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetmvcapp/*.csproj ./aspnetmvcapp/
COPY aspnetmvcapp/*.config ./aspnetmvcapp/
RUN nuget restore
# copy everything else and build app
COPY aspnetmvcapp/. ./aspnetmvcapp/
WORKDIR /app/aspnetmvcapp
RUN msbuild /p:Configuration=Release -r:False
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8 AS runtime
WORKDIR /inetpub/wwwroot
COPY --from=build /app/aspnetmvcapp/. ./

构建过程如下:

E:\Sources\aspnetmvcapp> docker build -t reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp .
Sending build context to Docker daemon   2.83MB
Step 1/12 : FROM reg.edisonzhou.cn/dotnet/sdk:4.8 AS build
 ---> cf61fa19d693
Step 2/12 : WORKDIR /app
 ---> Running in 0aeaf13a2399
Removing intermediate container 0aeaf13a2399
 ---> cd8cb2e21d9a
Step 3/12 : COPY *.sln .
 ---> 720986cc9a80
Step 4/12 : COPY aspnetmvcapp/*.csproj ./aspnetmvcapp/
 ---> 19ed4b0394b8
Step 5/12 : COPY aspnetmvcapp/*.config ./aspnetmvcapp/
 ---> 685d35ea2682
Step 6/12 : RUN nuget restore
 ---> Running in a96b4ac5f72c
 ......... 此处省略一万字
 Removing intermediate container a3f263c97c1e
 ---> 40774beabb8c
Step 10/12 : FROM reg.edisonzhou.cn/dotnet/runtime:4.8 AS runtime
 ---> 142ad6e5e9c6
Step 11/12 : WORKDIR /inetpub/wwwroot
 ---> Running in e306e8160570
Removing intermediate container e306e8160570
 ---> 56f50e22d843
Step 12/12 : COPY --from=build /app/aspnetmvcapp/. ./
 ---> 313613c96b44
Successfully built 313613c96b44
Successfully tagged reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

运行ASP.NET应用容器

直接通过 docker run 起来:

docker run --name aspnet_mvc_sample --rm -it -d -p 8000:80 --cpus 1 -m 1024m reg.edisonzhou.cn/dotnet/samples:aspnetmvcapp

运行效果如图:

4 总结

本文介绍了如何在本地的Windows Server 2019服务器上安装和配置Docker环境,最后演示了一下ASP.NET应用的基本容器操作。

对于传统.NET 4.x应用的容器化迁移,我们也还在探索,相信探索和实践的深入,我会分享更多相关的内容。