将.NetCore3.1程序部署到Docker上

关于Docker的基本操作,请参考:Docker学习
本文使用的Linux系统是Centos8
使用的VS是VS2022
使用的数据库是Mysql

为C#程序添加Dockerfile

右键单击启动项目,添加Docker支持:
在这里插入图片描述
选择Linux:
在这里插入图片描述
可以看到,自动添加了Dockerfile文件:
在这里插入图片描述
需要注意的是,自动生成的Dockerfile是需要将源码拷贝到Linux下进行打包构建镜像的。在构建镜像的时候,会编译源代码。自动生成的Dockerfile如下:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["Langtian.ServerAPI/Langtian.ServerAPI.csproj", "Langtian.ServerAPI/"]
COPY ["Langtian.ServerAPI.Model/Langtian.ServerAPI.Model.csproj", "Langtian.ServerAPI.Model/"]
COPY ["../../Langtian.DataBaseModel/Langtian.DatabaseModel/Langtian.DatabaseModel.csproj", "../../Langtian.DataBaseModel/Langtian.DatabaseModel/"]
COPY ["Langtian.ServerAPI.Dao/Langtian.ServerAPI.Dao.csproj", "Langtian.ServerAPI.Dao/"]
RUN dotnet restore "Langtian.ServerAPI/Langtian.ServerAPI.csproj"
COPY . .
WORKDIR "/src/Langtian.ServerAPI"
RUN dotnet build "Langtian.ServerAPI.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Langtian.ServerAPI.csproj" -c Release -o /app/publish

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

关于Dockerfile的指令意思,后面再写一篇文章单独介绍。
自动生成的Dockerfile文件分为多个镜像构建步骤。步骤如下:

  • 基础镜像->设置工作目录-开放端口
  • 设置工作目录->指定要复制的代码文件夹->还原Nuget包->复制所有指定的文件夹到镜像构建上下文->运行dotnet build编译项目,并设定输出到上下文的/app/build目录->运行dotnet publish发布项目文件到/app/pblish文件夹。
  • 从/app/publish文件夹,将全部文件复制到构建上下文。
  • 设置镜像启动的入口命令是 dotnet Langtian.ServerAPI.dll

由于我不想使用源代码构建,仅仅想发布后的文件拷贝到Linux上进行构建Docker镜像,所以Dockerfile修改如下:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 10000

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "Langtian.ServerAPI.dll"]

记得将Dockerfile设置为始终复制到输出目录:
在这里插入图片描述

发布C#程序到指定文件夹

在这里插入图片描述
选择发布后的文件夹:
在这里插入图片描述
选择部署模式和目标运行时:
在这里插入图片描述
选择好之后点击发布按钮:

在这里插入图片描述
发布成功之后,会看到文件夹中有了很多文件,其中包含Dockerfile:
在这里插入图片描述

将发布文件夹传递到Linux目录

本文使用FinalShell进行传递文件
在这里插入图片描述

使用Docker拉取Mysql镜像并运行

由于本程序依赖于Mysql,所以必须先运行Mysql。

拉取Mysql镜像

docker pull mysql:latest
latest: Pulling from library/mysql
ffbb094f4f9e: Pull complete 
df186527fc46: Pull complete 
fa362a6aa7bd: Pull complete 
5af7cb1a200e: Pull complete 
949da226cc6d: Pull complete 
bce007079ee9: Pull complete 
eab9f076e5a3: Pull complete 
8a57a7529e8d: Pull complete 
b1ccc6ed6fc7: Pull complete 
b4af75e64169: Pull complete 
23390142f76f: Pull complete 
Digest: sha256:ff9a288d1ecf4397967989b5d1ec269f7d9042a46fc8bc2c3ae35458c1a26727
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
[root@TONY ~]# 

查看下载的镜像:
在这里插入图片描述

创建容器并后台启动Mysql容器

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

指令解释:
run:创建并启动一个容器
-d:容器以后台的方式运行
-p:端口映射,前面一个是宿主主机端口,后面一个是docker容器的的端口
-e:Dockerfile中规定的环境变量,用于传递参数给应用程序。MYSQL_ROOT_PASSWORD是构建Mysql是指定的环境变量
最后一个就是镜像的名称。
一个镜像可以构建多个容器。
在这里插入图片描述
运行成功,会返回容器的ID

进入容器的Mysql命令行创建用户

由于root用户一般是不允许外部主机访问的,所以创建一个用户,用于外部主机(容器和容器之间的访问)访问Mysql
启动容器之后,可以查看运行的容器:

docker ps

在这里插入图片描述
进入容器的Mysql命令行:

docker exec -it dc26afdc79c9 bash

其中dc26afdc79c9为mysql容器的ID
进入命令行后,连接mysql:

mysql -uroot -p123456

在这里插入图片描述

Mysql创建用户

create user 'test'@'%' identified by 'Test@123';

'test'@'%' :指定用户名test可以所有IP访问
Test@123:密码
授予权限给用户:

grant all on *.* to 'test'@'%';

在这里插入图片描述

使用DBeaver连接容器中的Mysql测试

在这里插入图片描述

创建程序所需要的表…

至此Mysql在Docker容器中创建完成。

修改程序的数据库连接配置

上面我们已经把发布好的文件夹拷贝到/usr/docker-test/serverapi-linux目录下了
首先将当前目录切换到这个目录:

cd /usr/docker-test/serverapi-linux/

在这里插入图片描述

修改配置文件appsettings.json:
在这里插入图片描述

镜像构建

/usr/docker-test/serverapi-linux目录下,运行

docker build -t tony/mes-api:v1 .

-t:tag的意思。为镜像添加名称描述和版本。
注意:最后的.号不能够省略,表示Dockerfile在当前目录

终端输出如下所示:

[root@TONY serverapi-linux]# docker build -t tony/mes-api:v1 .
Sending build context to Docker daemon  22.96MB
Step 1/9 : FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
 ---> e41b25ecf8bf
Step 2/9 : WORKDIR /app
 ---> Running in 999fe0e888e6
Removing intermediate container 999fe0e888e6
 ---> 4e086f5a5f3d
Step 3/9 : EXPOSE 80
 ---> Running in 70f10b42dc56
Removing intermediate container 70f10b42dc56
 ---> 4ffbb0994640
Step 4/9 : EXPOSE 443
 ---> Running in 124a9021ac6e
Removing intermediate container 124a9021ac6e
 ---> 55dffdd77766
Step 5/9 : EXPOSE 10000
 ---> Running in 805b1407f45b
Removing intermediate container 805b1407f45b
 ---> 40947ed642d2
Step 6/9 : FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
 ---> 7ed1cf292591
Step 7/9 : WORKDIR /app
 ---> Using cache
 ---> 4b749088bd25
Step 8/9 : COPY . .
 ---> 6fee3d2c7bf8
Step 9/9 : ENTRYPOINT ["dotnet", "Langtian.ServerAPI.dll"]
 ---> Running in 2b722f14fcf6
Removing intermediate container 2b722f14fcf6
 ---> 85a682aa2c39
Successfully built 85a682aa2c39
Successfully tagged tony/mes-api:v1

在这里插入图片描述

查看构建的镜像:

[root@TONY serverapi-linux]# docker images
REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
tony/mes-api                      v1        7540b38c0667   5 minutes ago   208MB
<none>                            <none>    85ebc7de55eb   5 minutes ago   733MB
mcr.microsoft.com/dotnet/sdk      3.1       7ed1cf292591   6 days ago      710MB
mcr.microsoft.com/dotnet/aspnet   3.1       e41b25ecf8bf   6 days ago      208MB
mysql                             latest    bbf6571db497   7 days ago      516MB
[root@TONY serverapi-linux]# 

可以看到刚刚构建的tony/mes-api

使用镜像创建容器并运行

根据镜像创建容器并运行容器(不设置数据卷挂载):

docker run -d -p 10000:10000  tony/mes-api:v1

根据镜像创建容器并运行容器(设置数据卷挂载):

docker run -d -p 10000:10000 -v /log/10000:/app/Log tony/mes-api:v1

设置环境变量URL:

 docker run -d -p 10000:10000 -e ASPNETCORE_URLS=http://0.0.0.0:10000  -v /log/10000:/app/Log tony/mes-api:v1

其中-v /log/10000:/app/Log是设置数据卷挂载
即将Centos的/log/10000目录与容器的/app/Log目录进行映射
ASPNETCORE_URLS为.netcore的URL环境变量名称
查看容器是否在运行:

docker ps

在这里插入图片描述
使用网页访问一下服务:
在这里插入图片描述
在这里插入图片描述
本程序部署的结构图解如下:
在这里插入图片描述

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值