1 创建项目
打开“Visual Studio 2019”,选择“创建新项目”,找到“ASP.NET Core Web 应用程序”模板,点击“下一步”进入“配置新项目”界面,填写“项目名称”,选择保存的位置,根据需要填写解决方案名称后点击“创建”按钮。
为了简单起见,在“创建新的 ASP.NET Core Web 应用程序”界面中选择“Web 应用程序(模型视图控制器)”,去掉“为 HTTPS 配置”勾选,然后勾选“启用 Docker 支持”,并点击“创建”按钮。
2 编写 Dockerfile
在 Dockerfile 文件中(如果没有 Dockerfile 文件,说明创建项目时未选择“启用 Docker 支持”,可以在解决方案下右击项目名称,选择“添加”,然后点击“Docker 支持…”)编写以下代码:
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
MAINTAINER LiKui <admin@thiscoder.com>
WORKDIR /app
COPY . /app
EXPOSE 80
ENTRYPOINT ["dotnet", "xxx.dll"]
具体 Dockerfile 的语法请参考 Dockerfile reference。
需要注意的是:在解决方案下的项目中,右击 Dockerfile 文件,选择“属性”,将“复制到输出目录”修改为“如果较新则复制”(这样做的目的是,发布时将 Dockerfile 文件复制到发布目录中)。
3 发布
在解决方案下右击项目名称,选择“发布”,“选取发布目标”中选择“文件夹”方式,并根据需要选择发布文件保存位置,点击“创建配置文件”,然后点击“发布”按钮即可。发布完成后将 publish
文件夹打包成 zip 压缩包,方便下一步上传到服务器。
4 上传文件
使用 Xshell + lrzsz 将发布后的文件上传到远程服务器(你也可以使用其他 FTP 工具进行上传)。
通过 Xshell 连接到远程服务器后,使用 rz
命令会弹出文件选择对话窗口,选择上面打包好的文件,点击“打开”即可开发上传。
需要注意的是:a、lrzsz 无法直接上传文件夹,可以先手动压缩为 zip 包后再上传,这样也方便上传后解压;b、如果提示:-bash: rz: command not found,说明没有安装 lrzsz 工具,请自行安装。
5 解压文件
上传完成后,使用 unzip 工具解压文件到当前目录,如果提示:-bash: unzip: command not found,请先安装 unzip 工具。
unzip xxx.zip
6 打包镜像
解压完成后,cd xxx
进入发布文件夹中,并使用以下 docker build 命令打包 docker 镜像:
docker build -t xxx .
具体 Docker 的语法请参考 Docker Documentation。
如果提示:-bash: docker: command not found,请先自行安装 docker。若提示:unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /root/xxx/Dockerfile: no such file or directory,说明发布文件中没有包含 Dockerfile 文件,解决办法请参看第2节的注意事项,你也可以直接将 Dockerfile 文件复制到发布文件中即可。
打包过程如下所示:
[root@izwz9fb67b4faqfksk97z5z xxx]# docker build -t xxx .
Sending build context to Docker daemon 4.685MB
Step 1/6 : FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
---> f6d51449c477
Step 2/6 : MAINTAINER LiKui <admin@thiscoder.com>
---> Running in c07007cbcb9f
Removing intermediate container c07007cbcb9f
---> 78226e00c697
Step 3/6 : WORKDIR /app
---> Running in d95cd288f5bc
Removing intermediate container d95cd288f5bc
---> a33885a021a5
Step 4/6 : COPY . /app
---> e297f4c6e061
Step 5/6 : EXPOSE 80
---> Running in 1d531fef2ab2
Removing intermediate container 1d531fef2ab2
---> 3d07dd6f0e43
Step 6/6 : ENTRYPOINT ["dotnet", "xxx.dll"]
---> Running in e41bf678f404
Removing intermediate container e41bf678f404
---> 8ed1a36de466
Successfully built 8ed1a36de466
Successfully tagged xxx:latest
通过以下 docker images
命令查看生成的 docker 镜像:
[root@izwz9fb67b4faqfksk97z5z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xxx latest 8ed1a36de466 2 minutes ago 265MB
microsoft/dotnet 2.2-aspnetcore-runtime f6d51449c477 4 months ago 260MB
7 运行 Docker 容器
通过以下 docker run
命令将 docker 镜像运行在 docker 容器中:
docker run --name=xxx -d -p 8080:80 xxx
使用以下 docker ps
命令查看正在运行的docker 容器:
[root@izwz9fb67b4faqfksk97z5z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13f54328aefc xxx "dotnet xxx.dll" 4 seconds ago Up 3 seconds 80/tcp, 0.0.0.0:8080->80/tcp xxx
8 访问测试
配置 Nginx、域名、防火墙,并开放入方向的端口(一般80端口默认已经开放,其他端口根据具体情况进行开放;如果是云服务器,可能还需要在管理控制台中进行配置)后,通过浏览器访问进行测试查看效果。