许久没上CSDN,打开时发现被盗号,内容全清空了,真是荒废了…
乘过年有空学习下一直想尝试的分布式开发,我将使用最新版本的netCore3.1为开发语言(c#),若干netCore开源框架做负载平衡、API网关等,使用Docker做程序的部署。
因先要先解决技术上的问题,开发过程会跳跃进行,以后再做整理
开干…
本文涉及知识点:
CentOS
Docker
NetCore 3.1
因为我使用Visual Studio编写代码,所以需要安装Docker Desktop,登录官网下载安装一个即可,没什么难度;倒是Docker Desktop需要Hyper-V做为宿主,习惯了使用VMware感觉Hyper-V有点不好用。
本次使用最新的CentOS,以命令行运行,CentOS的安装就不在啰嗦了,网上一大把,也很简单;
在linux中运行以下代码,安装docker,如登录的用户不是root等管理员权限,则需要在命令前加sudo,后面将不再重复;
yum install docker
//安装完成后,输入以下代码查看是否安装正常
docker info
选择NetCore3.1,因为要做一个WebApi项目,所以选择API模板,当然这不重要;
选中"启用Docker支持“,这样可以自动生成Dockerfile文件,这个文件是用来生成Docker镜像;
如果没有选中"启用Docker支持“,也可在项目生成后,右击项目-添加-Docke支持,如下图;
选择Docker运行系统,代码编写阶段Dockerfile文件可以随意修改和删除,使用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/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["SamruoFrame.Service.Cache.Redis/SamruoFrame.Service.Cache.Redis.csproj", "SamruoFrame.Service.Cache.Redis/"]
COPY ["SamruoFrame.Core/SamruoFrame.Core.csproj", "SamruoFrame.Core/"]
RUN dotnet restore "SamruoFrame.Service.Cache.Redis/SamruoFrame.Service.Cache.Redis.csproj"
COPY . .
WORKDIR "/src/SamruoFrame.Service.Cache.Redis"
RUN dotnet build "SamruoFrame.Service.Cache.Redis.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "SamruoFrame.Service.Cache.Redis.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SamruoFrame.Service.Cache.Redis.dll"]
生成的内容一大堆,在不修改情况下使用VS自带的Docker运行没有问题,但部署时却有麻烦,简化一下就行了;
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
COPY . .
ENTRYPOINT ["dotnet", "SamruoFrame.Service.Cache.Redis.dll"]
Dockerfile文件默认在发布时不会复制到发布文件夹中,需要修改一下
程序以正常发布生成,使用”文件夹”模式,以上几个发布方式需要Azure,本文不涉及此内容(主要是没钱)
生成镜像有多种方式,我使用本地生成;
进入发布目录,运行 Powershell
使用命令行生成镜像
docker build -t samruo/redis:1.1 .
//语法:docker build [OPTIONS] PATH | URL | -
//--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
//需要注意的是 1:name不能用大写;2:语句最后必须加“ .” 且前面要有一个空格。
这里出现了一个错误信息:
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have ‘-rwxr-xr-x’ permissions. It is recommended to double check and reset permissions for sensitive files and directories.
经查是因为我在Windows下生成,但将使用在Linux下,所以有个目录权限问题。考虑到我的程序只用来做服务,且采用集群,不会在本地保存文件,理论上不会有此问题,就先使用这个方法。
为方便集群化部署,以及后继运维方便,将镜像放到仓库中是个好办法。实现Docker仓库的方法有很多,国内和国外都的,Docker Hub速度太慢,我使用阿里的镜像仓库,因为本身服务器是在阿里云。
首先要有个阿里云帐号;
登录后进入控制台,搜索”容器镜像服务“,首次使用需要开通服务,根据阿里云的使用经验,貌似使用容器镜像服务免费,还有个”弹性容器实例ECI“是需要收费的,其实就是个Docker,按秒计费的。
更新镜像需要2个步骤:
1、 登录阿里云Docker Registry
$ sudo docker login --username=【这里是阿里云登录帐号】 registry.cn-hangzhou.aliyuncs.com
在Linux中使用以上代码,提示密码并输入
$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:[镜像版本号]
正确执行命令后,镜像将出现在”镜像版本“之中;
版本更新只需要修改命令行后面的”镜像版本号“即可,非常简单。
到此,镜像仓库部署完成。
建立了镜像后在部署操作将非常简单。
执行以下命令前需要执行登录操作,见上节上传镜像,如已登录则无需执行。
//从Registry中拉取镜像,在一台服务器中,同一个版本的镜像只需要拉取一次即可
docker pull registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:[镜像版本号]
//部署镜像
//语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run --name samruo-redis-1 -d -p 5902:80 registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:1.1
// --name="nginx-lb": 为容器指定一个名称;
// -d: 后台运行容器,并返回容器ID;
// -p: 指定端口映射,格式为:主机(宿主)端口:容器端口;这里和80端口与Dockerfile文件中的EXPOSE 80对应;
在同一台宿主服务器上只要”主机(宿主)端口“不重复,可以部署多个同一镜像,不会相互干扰,这也将用于集群化需求。
成功执行后将只返回容器ID;
//查看镜像部署情况
docker ps -a
到此,netCore程序以容器形式部署在Linux中,可以使用 host:主机(宿主)端口 来访问服务了。
下一步将实验多个同一镜像实现服务发现和雪崩。
请参考微软出品的:ASP.NET Core 的 Docker 映像
Docker 教程