1. docker基础玩法

关键点:

  1. 安装centos7
  2. 在里面安装docker,升级到最新docker版本,熟悉相关命令。
    相关命令如:
docker images
docker ps
docker ps -a
docker rm
docker rmi
docker stop
docker run -d -p 1111:1111 --name=xxxx image:v1
docker build -t cn.code/simeple-demo:latest .
dcoker search xxxx
docker pull xxx
等等等等略。
  1. 然后在docker里面下载redis,rabbitmq等的镜像,启动,当作正常服务来用,体验很好。而且资源占用惊人地少。

2. docker中部署springboot项目

关键点:

  1. 自己写个简单的springboot项目,打包成​​.jar​​​文件。(值得一提的是,​​pom.xml​​​文件中可能要增加对应的​​<build>​​节点。)
  2. 将jar文件上传到centos机器中
  3. 建立Dockerfile,自己打包镜像
  4. 启动镜像,也即将springboot项目部署到了docker中。

相对较为简单,细节以后补充

3. docker中部署.NET 5 web项目(重点)

自己建立一个简单的.net5 web项目,就是mvc之类的。

3.1 windows,iis中部署此项目

要点:

  1. 应用程序池也不见得非得是 托管的或者非托管的,都行。
  2. visual studio中选中项目,发布。 如果准备用于windows中部署,就不要选择​​生成单文件​​​了。否则会遇到​​500.38​​错误。官方这么说的,我们照着这么用就行了。
  3. 然后就可以像访问 .net framework web项目一样正常访问就差不多了。

3.2 centos7 ,部署此web项目

要点:
有用的官方文档:
​​​使用 Nginx 在 Linux 上托管 ASP.NET Core​

  1. 安装.net5 SDK
  2. 安装ngxin,正常启动等不提了。
  3. 修改nginx的配置文件,配置反向代理
  4. 在开发机器中,使用visual studio发布项目,目标为 linux-64。然后将产生的许多文件全部上传到centos机器中。
  5. 然后在centos机器中,使用命令​​dotnet myWebsite.dll​​ 启动此项目,控制台明显可见输出内容。(我记得.net core某些版本的启动命令不是这样的,但不重要,这个.net5的项目的启动命令就是这样的)
  6. 然后从其他机器中,访问nginx的 ip:80 即可被反向代理到这个.net5 web项目中,也即成功部署了项目到centos7中。

其中的一个关键内容,修改ngxin.conf文件的一部分内容为:

server {
listen 80;
server_name example.com *.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

linux 守护进程什么的不提了,可有可无。
至于linux基本的防火墙端口开放,或者干脆防火墙关闭什么的基操,略。

3.3 centos7 中的docker中,部署此web项目

此部分是本文的精华部分
开发此项目使用Visual Studio,在​​​windows​​​机器上,称此机器为A。
部署此项目在一个​​​安装了docker的CentOS7​​机器上,称此机器为B。

步骤如下。

3.3.1. 先不妨给自己的docker中安装必要的镜像(但这一步并非必要,后面会提到)

B 机器中

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker


跳转到:

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker spring_02


然后直接装sdk:

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker .net5_03


docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker spring_04


​地址​

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker .net项目_05

3.3.2. 给.NET5项目,添加Dockers支持

A 机器中

会产生一个​​Dockerfile​​文件,这个文件就是将此项目打包为docker镜像的必要文件。

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker_06


得到Dockerfile

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker boot_07


Dockerfile的内容形如

以下即是我这个示例.net5项目产生的Dockerfile文件的内容
只是个示意,不用在意细节,不同的项目产生的内容当然是不同的。
另外,值得一提的是前面几行 ​​​FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base​​​等,会在产生我们自己的项目镜像前自动下载需要的这个镜像,这也就响应了前面 ​​3.3.1​​节提到的后面会解释。

#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:5.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["XJ.Web/XJ.wWeb.csproj", "XJ.Web/"]
COPY ["XJ.bOffice/XJ.bOffice.csproj", "XJ.bOffice/"]
COPY ["XJ.fFileManager/XJ.fFileManager.csproj", "XJ.fFileManager/"]
COPY ["XJ.dDictionary/XJ.dDictionary.csproj", "XJ.dDictionary/"]
COPY ["XJ.dDatabase/XJ.dDatabase.csproj", "XJ.dDatabase/"]
COPY ["XJ.aStructure/XJ.aStructure.csproj", "XJ.aStructure/"]
COPY ["XJ.cCommon/XJ.cCommon.csproj", "XJ.cCommon/"]
RUN dotnet restore "XJ.Web/XJ.wWeb.csproj"
COPY . .
WORKDIR "/src/XJ.Web"
RUN dotnet build "XJ.wWeb.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "XJ.wWeb.csproj" -c Release -o /app/publish

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

3.3.4 然后这个项目是由git管理的,我在docker所在的服务器中将此项目​​clone​​下来,并生成镜像

B机器中

​git clone this-project.git​​​,在B机器中得到此项目的源码,比如得到 目录 ​​this-projecct​​​,里面就是项目源码。
当然,要切换到前面A机器中​​​添加docker支持​​时对应的分支上,两边代码保持一致。

然后,将A机器中刚才产生的那个Dockerfile文件设法传送到B机器中,放到 ​​this-project​​​ 目录下的根目录中。
然后执行​​​docker build -t this-project:v1 .​​​ ,然后就开始不是那么快的镜像打包。
会依次下载需要的镜像,然后编译编码,最终产生项目的镜像。

以下是我此次操作的过程截图:

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker .net项目_08

上图可见,最终确实产生了镜像,也即图片中下部的 ​​xj-demo:v1​​ 这个镜像。

ps: 如果有个报错,可参考这里:​​Unable to load the service index for source https://api.nuget.org/v3/index.json​

3.3.5 启动镜像,也即在docker中启动项目

如下图,启动镜像。

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker boot_09

其中,从命令中可见,将镜像启动后的80端口映射到B机器自身的80端口。
那么,理论上我访问B机器的80端口,就可以看到启动成功的网站。

试一下:

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker_10

如图,访问成功。
也即此.net5 web项目在docker中部署成功。

顺便看一下​​docker ps​

docker玩法,以及 docker部署springboot项目 、docker部署.net core /.net5 项目_docker .net5_11


完美实现预期。