46

[跨平台系列三Docker篇]:ASP.NET Core应用

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA%3D%3D&%3Bmid=2654078733&%3Bidx=5&%3Bsn=5c8cdc65e4660d858196e52dc6a96e89
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

aeUjqqU.png!web

如果你是老张的忠实读者的话,如果是从博客园就开始看我的文章的话,如果后期也一直看我公众号的话,应该就知道 其实我一直在根据一条无形的教学线路来讲解的 ,,如果你真的是想好好学的话,请好好看看我之前的文章吧。

从题目我们可以看的出,今天是五部曲的第三部,你可能会好奇,为啥没有见到前两部呢?这里我简单说下:

1、跨平台第一部曲:MySql

如果你看我的所有开源项目,应该能发现我已经全部迁移到了Mysql数据库了,这里不是说SqlServer就不是不跨平台了,只是MySql用着可能更好些,当然,如果你是买的单独数据库服务器,比如阿里云的RDS数据库,Azure DataBase数据库的话,那就完全另说了。

yQJvAj7.png!web

当然,不仅仅迁移过去就行了,这只是一个开头,后期还是有很多东西,需要自己好好研究,比如缓存,数据一致性,索引,存储,锁,队列等等知识,只有用到了才会打开进一步专研的大门。

2、跨平台第二部曲:Linux

既然要跨平台,那多平台的学习就是基础中的基础,重中之重了,相信每个人windows服务器已经玩儿到飞起了,所以Linux的学习和研究就很有必要。

我之前有篇文章已经对我的所有项目做了迁移,还是比较详细的:

《[最全操作指南] 在线六个项目全部迁移Linux

还是那句话,只有用了,才会去研究,螃蟹这东西,如果没吃过,永远不会知道是酸的还是甜的。因为这个Linux迁移基础的比较简单,或者说是一个长期学习的东西,所以一篇文章就搞定了。

3、剩下三部曲

从今天开始呢,我打算用三篇讲解下Docker相关内容,打算把我六个在线项目都迁移到 Docker 上,等我完全搞懂了,就开始录视频说说,虽然我一直认为官网是最好的老师, 因为今天不会讲Docker的基本知识,所以到时候我会在视频教程里详细说

说完Docker,就说一说 CI/CD 相关的内容,应该就是基于Docker+Jenkins的吧。

最后一部曲就是 K8S 一把梭了。

(PS:我的讲解速度,取决于各位的素质三连的速度了 )

好啦,今天就说说 Docker在netCore中的从入门到部署 吧!

1、服务器与工具准备

首先我们需要一个服务器,以后我都是用的Linux了,所以还是果断的买了一个CentOS系统的服务器,相关配置:

eY3yYjM.png!web

本次所用到的工具主要有:

1、git:提供源代码管理;

2、docker:容器服务;

3、dotnetcore:SDK环境;

4、nginx:服务器代理;

vU73M3Q.png!web

购买然后登录上服务器,我们开始一一安装。

2、安装辅助工具

1、更新系统 [可选]

新买的系统,我们可以更新一下,毕竟有些包或者依赖最新的还是更好的,不过也不是必须的。

 sudo yum update

预计310M,预计10~20分钟

EJ3emq7.png!web

2、安装Git [可选]

我们如果要构建镜像的话,肯定需要发布好的问题+Dockerfile,那发布有三种方式:
第一种就是本地发布,拷贝到服务器,build 镜像;

第二种是本地发布,然后本地build,推到仓库里,服务器拉取;

第三种就是服务器PULL代码,然后服务器发布,再build;

我习惯了第三种,所以我这里安装Git了。

sudo yum -y install git

预计5m,1~5分钟

ZnQZbay.png!web

3、安装Nginx [必要]

我们创建好的容器run后,Docker会自己守护这个进程,但是还是需要一个服务器来做代理和反向代理,一般常用的就是Nginx了:

sudo yum install nginx 

预计14m,1~5分钟

启用和启动服务:

sudo systemctl enable nginx

sudo systemctl start nginx

U3U36fi.png!web

4、安装Dotnet SDK [核心]

每台计算机只需要执行一次此操作。

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1 

预计119M,20~30分钟,这个时间比较长,所以你可以考虑在本地发布好,ftp到服务器,当然如果创建了sdk,以后就省事儿了,反正各有利弊。

IjMNvab.png!web

安装成功,测试一下版本:

dotnet --list-sdks

EZzy6v.png!web

完成!

到了这里,我们辅助工具已经安装完成了,接下来,重头戏就来了——Docker安装。

3、安装Docker环境

1、安装Docker源

首先,我们可以先执行下卸载命令,如果你之前安装过,或者系统自带了,需要卸载干净:

sudo yum remove docker-ce

v2QrieU.png!web

然后我们就可以安装指定的源了,有官方版本和阿里云版本,我这里尝试使用阿里云版本的吧,听说会快一些。

Step 1 : 安装必要的一些系统工具     sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Step 2 : 添加软件源信息 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Step 3 : 更新并安装Docker-CE

sudo yum makecache fast (可选)

sudo yum -y install docker-ce

Step 4 : 开启Docker服务     sudo service docker start

安装预计 5 分钟

A3Q7Rrb.png!web

设置docker开机启动

systemctl enable docker

启动docker

systemctl start docker

查看版本

docker --version

7j26Nz2.png!web

2、测试Hello World

检查docker是否可以正常运行(运行hello-world镜像,如果本机没有hello-world镜像,系统会自动拉取hello-world镜像)

docker run hello-world

如果本地没有改镜像,会自动从远程仓库拉取,然后再生成容器。

Ibqamu3.png!web

这个时候,我们可以来检查一下:

当前服务器有哪些镜像:

docker images

可以看到,这个就是刚刚我们拉取的镜像:名称是hello-world,ID是bf756fb1ae65,大小13.3k的镜像。

那如何查看有哪些容器呢:

docker ps -a

这个就是刚刚我们看到有输出内容的容器:容器ID是4fb4bdc352ff,镜像是hello-world,状态是已退出。

PS:这里的镜像就像我们定义了一个hello的Class类,

容器呢,就是这个class类生成的对象,当然可以创建很多个。

这个时候,我们的环境已经已经搞好了,接下来就是重中之重,将我们的项目发布镜像文件了。

4、发布自己的镜像

1、添加Docker支持

这个操作是很简单的,我们打开Blog.Core项目,选择Web层,然后添加Docker支持:

bAfuUfj.png!web

会生成一个Dockerfile的文件,默认的信息比较多,目前我就来个最简单的精简版:

FROM swr.cn-south-1.myhuaweicloud.com/mcr/aspnet:3.1-alpine

WORKDIR /app

COPY . .

EXPOSE 8081

ENTRYPOINT ["dotnet", "Blog.Core.dll","-b","0.0.0.0"]

简介一下:

FROM:意思是我们的项目源镜像是哪个;

WORKDIR:镜像的工作目录;

COPY:复制文件(将Dockerfile所在目录下文件复制到镜像中的工作目录中)
EXPOSE:容器要开放的端口(我们用.NETCORE的8081端口)
ENTRYPOINT:为容器启动后要执行的命令 (这里将执行dotnet Blog.Core.dll命令)

然后右键,始终属性、始终复制到输出(bin)目录:

YFnUVj2.png!web

接下来就是上次到Github了。

2、发布

我们在服务器用Git将代码PULL下来,然后执行发布命令,我用一个批处理文件,直接一键生成(主要是防止漏掉文件):

rIrMVzj.png!web

执行发布命令:

就可以看到生成好的发布文件夹.PublishFiles。

接下来就是docker 编译镜像了。

3、创建镜像

进入到我们的发布文件夹.PublishFiles文件夹下,我们测试一下这个文件是否正常:

dotnet Blog.Core.dll

iyIZZnq.png!web

可以看到已经正常的监听了8081端口,这里要注意一下,我们在Program.cs文件中,需要配置这样:

.UseUrls("http://*:8081")

否则的话,系统找不到我们对应的端口信息。

没问题后,开始build了,还是在当前文件夹下(记得那个点):

 docker build -t laozhang/apkimg .

其中laozhang/apkimg是我们的镜像名。

ANrM7ni.png!web

因为我们的Dockerfile是五步,所以这里也正好是5个Step。

然后查看机器上的镜像:

这里多了两个镜像,一个是我们的镜像ID为af75a6d4a8ad,大小146M的项目文件,一个是我们Dockerfile的源镜像。

4、推送镜像到Docker hub仓库

既然咱们有了镜像,如果每次使用都要build,肯定是不对的,咱们可以统一推送到Hub仓库里。

先注册
(注意注册的时候,第一个选项,这个Docker ID是我们创建的镜像的ID,

也就是laozhangisphi/apkimg的 laozhangisphi

当然如果不一样,你后期也可以自己做配置,不要方。

VFbuA3v.png!web

第二:验证完邮件后,登录,创建仓库

fIFBZvA.png!web

ZZF32iN.png!web

第三步:服务器镜像推送

然后登录账号

6nIjymm.png!web

推送:

docker push laozhangisphi/apkimg:tagname

7viyYby.png!web

检查:

我们登录管理后台,查看结果

nAV7zmA.png!web

可以看到已经成功推送了,这样的话,我们就可以在任何的地方使用我的镜像啦。

docker pull laozhangisphi/apkimg:latest

现在我们有了镜像,那就可以创建容器了,因为有了容器才能运行。

5、生成并运行容器

生成容器

有了镜像,我们来生成一个容器:

docker run -it -p 8081:8081 laozhang/apkimg 

8081是我们的端口号,然后后边的laozhang/apkimg是我们的镜像名。

JJruimQ.png!web

会看到输出内容,如果没有报错的话,就恭喜啦,退出当前进程,查看下有哪些容器:

这时候可以看到多了一个容器ID为53d047bb3a66,镜像是laozhang/apkimg的容器,不过我们的项目容器是退出状态,需要开启下:

docker start 53d047bb3a66

vEvUFbM.png!web

状态已经是运行中了,那怎么测试接口是否正常了呢,可以用curl命令:

curl http://localhost:8081/api/blog

maYR73M.png!web

如果到了这里,恭喜你,Docker部署NetCore基本已经搞定了,如果你想看看容器内的日志信息。

查看日志

直接输入命令:

docker logs 53d047bb3a66

其他常用命令

查看所有镜像 docker images

删除一个imageid的镜像
docker rmi [IMAE_ID]

#删除所有镜像
sudo docker rmi $(docker images -q)

#查看所有容器运行状态
docker ps -a
docker container ls -all

#删除一个containerid的容器(实例)
docker rm 6f0c67de4b72

#删除所有容器
docker rm $(sudo docker ps -a -q)

容器日志

#查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2019-06-08" --tail=100 CONTAINER_ID

#查看某时间之后的日志:
docker logs -t --since="2019-06-08" CONTAINER_ID

#查看某时间段日志:
docker logs -t --since="2019-06-08" --until "2019-06-09" CONTAINER_ID

#查看最近30分钟的日志:
docker logs --since 30m CONTAINER_ID

过程

1、停止容器 docker stop 5ab35ebcb6e2

2、删除容器 docker rm  5ab35ebcb6e2

3、删除镜像 docker rmi 7567a38d491c

4、启动容器 docker start  685cb02f53

剩下最后一步了,nginx代理,因为我们的Docker已经守护了这个进程,所以我们不需要其他的守护进程的工作。

6、Nginx代理服务

进入/etc/nginx/文件夹

修改nginx.conf文件,这里你可以使用 vim ,也可以下载到本地,修改,然后再提交上去,看自己的需要了,反正vim也很简单,就是那几个命令:

vim xxx

i

:wq!

如果看不懂,还是下载本地修改吧。

修改的内容如下:

###### apk begin #######

server {

listen 9001;

server_name localhost;


location / {

root html;

proxy_pass http://localhost:8081;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection keep-alive;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_cache_bypass $http_upgrade;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


index index.html index.htm;

}



}


###### apk end #######

接下来就是重启Nginx服务,首先可以检测语法错误:

nginx -t

EBBnArN.png!web

nginx -s reload

这个时候,如果没报错,那恭喜,项目启动成功了!

http://192.144.227.46:9001/index.html

好啦,今天到这里已经完全说完了,整个过程大约2个小时,中间没发现什么问题,因为我有Linux的基础,所以总体还是很简单的,主要就是docker的那几个常用命令,需要看文档查一查。加油!

rI363eU.png!web


Recommend

  • 31

    0.前言 通过前面几篇,我们了解到了如何实现项目的基本架构:数据源、路由设置、加密以及身份验证。那么在实现的时候,我们还会遇到这样的一个问题:当我们业务类和数据源越来越多的时候,我们无法通过普通的构造对象的方法为...

  • 7
    • beginor.github.io 3 years ago
    • Cache

    指定 ASP.NET Core 应用监听的端口

    指定 ASP.NET Core 应用监听的端口 ASP.NET Core 应用默认监听的端口是 5000 , 在调试或者部署的过程中经常需要指定监听的端口来来运行, 本文就这个问题, 进行一个总结, 可以通过下面的方法来指定运行端口。 使用命令行参数

  • 6

    本来没想着要写这篇博客,但是在实操过程中,一个是被网络问题搞炸了心态(真心感觉网络能把人搞疯,别人下个包、下个镜像几秒钟搞定,我看着我的几KB小水管真是有苦说不出),另一个就是这里面坑还是有一些的,写出来也是为了让大家避免重复踩坑

  • 4

    将 ASP.Net Core WebApi 应用打包至 Docker 镜像 运行环境为 Windows 10 专业版 21H1, Docker Desktop 3.6.0(67351),Docker Engine 20.10.8 1. ASP.Net Core Runtime 还是 .Net Core Runtime 在这里首先要区分一下 SDK...

  • 2
    • www.scottbrady91.com 2 years ago
    • Cache

    ASP.NET Core and Docker Environment Variables

    When working with ASP.NET Core and Docker, it can be easy to get confused when trying to figure out who is setting what configuration v...

  • 2

    1 容器概念使用Docker前我们首先要简单了解一下容器的概念。MSDN上有一张虚拟机和容器的对比图,很好的展示了虚拟机和容器的区别,如下所示,虚拟机包括应用程序、必需的库或二进制文件以及完整的来宾操作系统,每台虚拟机都有一个单独的内核,我们...

  • 6
    • blog.51cto.com 1 year ago
    • Cache

    ASP.NET Core Identity 系列之三

    ASP.NET Core Identity 系列之三 精选 原创 桂素伟 2023-08-06 14:22:40

  • 10
    • blog.51cto.com 1 year ago
    • Cache

    ASP.NET Core Identity 系列之二

    ASP.NET Core Identity 系列之二 精选 原创 桂素伟 2023-08-06 13:54:39

  • 1

    在对应用模型的基本构建方式具有大致的了解之后,我们来系统地认识一下描述应用模型的ApplicationModel类型。对于一个描述MVC应用模型的ApplicationModel对象来说,它承载...

  • 2

    ASP.NET Core MVC应用模型的构建[1]: 应用的蓝图 ...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK