前言:

许久没上,打开时发现被盗号,内容全清空了,真是荒废了…
乘过年有空学习下一直想尝试的分布式开发,我将使用最新版本的netCore3.1为开发语言(c#),若干netCore开源框架做负载平衡、API网关等,使用Docker做程序的部署。
因先要先解决技术上的问题,开发过程会跳跃进行,以后再做整理
开干…

本文涉及知识点:

CentOS

Docker

NetCore 3.1

因为我使用Visual Studio编写代码,所以需要安装Docker Desktop,登录官网下载安装一个即可,没什么难度;倒是Docker Desktop需要Hyper-V做为宿主,习惯了使用VMware感觉Hyper-V有点不好用。

1、在CentOS中安装Docker

本次使用最新的CentOS,以命令行运行,CentOS的安装就不在啰嗦了,网上一大把,也很简单;

在linux中运行以下代码,安装docker,如登录的用户不是root等管理员权限,则需要在命令前加sudo,后面将不再重复;
yum install docker

docker 部署 ollama_Docker

//安装完成后,输入以下代码查看是否安装正常
docker info

docker 部署 ollama_docker 部署 ollama_02

2、使用Visual Studio 2019 编写程序

docker 部署 ollama_docker 部署 ollama_03

新建一个ASP.Net Core Web项目

docker 部署 ollama_docker_04

选择NetCore3.1,因为要做一个WebApi项目,所以选择API模板,当然这不重要;

选中"启用Docker支持“,这样可以自动生成Dockerfile文件,这个文件是用来生成Docker镜像;如果没有选中"启用Docker支持“,也可在项目生成后,右击项目-添加-Docke支持,如下图;

docker 部署 ollama_Docker_05


选择Docker运行系统,代码编写阶段Dockerfile文件可以随意修改和删除,使用Docker调试或生成镜像时重新添加一个就行了。

docker 部署 ollama_Redis_06


生成的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生成的DockerFile文件会放在项目目录中,使用命令行生成镜像,需要手动将此文件复制到上层目录中(解决方案目录),否则在执行docker build会产生"文件或目录不在"的错误.

Dockerfile文件默认在发布时不会复制到发布文件夹中,需要修改一下

docker 部署 ollama_docker 部署 ollama_07

3、编辑程序并生成镜像

程序以正常发布生成,使用”文件夹”模式,以上几个发布方式需要Azure,本文不涉及此内容(主要是没钱)

docker 部署 ollama_Redis_08


生成镜像有多种方式,我使用本地生成;

进入发布目录,运行 Powershell

docker 部署 ollama_c#_09


使用命令行生成镜像

docker build -t samruo/redis:1.1 .

//语法:docker build [OPTIONS] PATH | URL | -
//--tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
//需要注意的是 1:name不能用大写;2:语句最后必须加“ .” 且前面要有一个空格。

docker 部署 ollama_c#_10


这里出现了一个错误信息:

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下,所以有个目录权限问题。考虑到我的程序只用来做服务,且采用集群,不会在本地保存文件,理论上不会有此问题,就先使用这个方法。

4、将镜像放到阿里仓库

为方便集群化部署,以及后继运维方便,将镜像放到仓库中是个好办法。实现Docker仓库的方法有很多,国内和国外都的,Docker Hub速度太慢,我使用阿里的镜像仓库,因为本身服务器是在阿里云。

首先要有个阿里云帐号;
登录后进入控制台,搜索”容器镜像服务“,首次使用需要开通服务,根据阿里云的使用经验,貌似使用容器镜像服务免费,还有个”弹性容器实例ECI“是需要收费的,其实就是个Docker,按秒计费的。

第一步:创建命名空间

docker 部署 ollama_docker_11


第二步:创建镜像仓库

docker 部署 ollama_Docker_12


仓库创建后,点击仓库名称进入详情页

docker 部署 ollama_Redis_13


阿里已经把需要使用到的命令都列出来了,良心啊

5、上传镜像和版本更新

更新镜像需要2个步骤:
1、 登录阿里云Docker Registry

$ sudo docker login --username=【这里是阿里云登录帐号】 registry.cn-hangzhou.aliyuncs.com

在Linux中使用以上代码,提示密码并输入

docker 部署 ollama_Redis_14


2、将镜像推送到Registry

$ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:[镜像版本号]
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:[镜像版本号]

正确执行命令后,镜像将出现在”镜像版本“之中;

docker 部署 ollama_c#_15


版本更新只需要修改命令行后面的”镜像版本号“即可,非常简单。

到此,镜像仓库部署完成。

6、在Linux的Docker中使用镜像

建立了镜像后在部署操作将非常简单。
执行以下命令前需要执行登录操作,见上节上传镜像,如已登录则无需执行。

//从Registry中拉取镜像,在一台服务器中,同一个版本的镜像只需要拉取一次即可
docker pull registry.cn-hangzhou.aliyuncs.com/samruo_docker/redis:[镜像版本号]

docker 部署 ollama_Redis_16

//部署镜像
//语法: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对应;

docker 部署 ollama_Redis_17


在同一台宿主服务器上只要”主机(宿主)端口“不重复,可以部署多个同一镜像,不会相互干扰,这也将用于集群化需求。

成功执行后将只返回容器ID;

//查看镜像部署情况
docker ps -a

docker 部署 ollama_c#_18

到此,netCore程序以容器形式部署在Linux中,可以使用 host:主机(宿主)端口 来访问服务了。

下一步将实验多个同一镜像实现服务发现和雪崩。

参考

请参考微软出品的:ASP.NET Core 的 Docker 映像Docker 教程