netCore3.x 分布式开发学习笔记——Docker容器部署

前言:

许久没上CSDN,打开时发现被盗号,内容全清空了,真是荒废了…
乘过年有空学习下一直想尝试的分布式开发,我将使用最新版本的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

netCore3.x 分布式开发学习笔记——Docker容器部署_第1张图片

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

netCore3.x 分布式开发学习笔记——Docker容器部署_第2张图片

2、使用Visual Studio 2019 编写程序

netCore3.x 分布式开发学习笔记——Docker容器部署_第3张图片新建一个ASP.Net Core Web项目

netCore3.x 分布式开发学习笔记——Docker容器部署_第4张图片选择NetCore3.1,因为要做一个WebApi项目,所以选择API模板,当然这不重要;
选中"启用Docker支持“,这样可以自动生成Dockerfile文件,这个文件是用来生成Docker镜像;

如果没有选中"启用Docker支持“,也可在项目生成后,右击项目-添加-Docke支持,如下图;
netCore3.x 分布式开发学习笔记——Docker容器部署_第5张图片
选择Docker运行系统,代码编写阶段Dockerfile文件可以随意修改和删除,使用Docker调试或生成镜像时重新添加一个就行了。
netCore3.x 分布式开发学习笔记——Docker容器部署_第6张图片
生成的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文件默认在发布时不会复制到发布文件夹中,需要修改一下
netCore3.x 分布式开发学习笔记——Docker容器部署_第7张图片

3、编辑程序并生成镜像

程序以正常发布生成,使用”文件夹”模式,以上几个发布方式需要Azure,本文不涉及此内容(主要是没钱)
netCore3.x 分布式开发学习笔记——Docker容器部署_第8张图片
生成镜像有多种方式,我使用本地生成;
进入发布目录,运行 Powershell
netCore3.x 分布式开发学习笔记——Docker容器部署_第9张图片
使用命令行生成镜像

docker build -t samruo/redis:1.1 .

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

netCore3.x 分布式开发学习笔记——Docker容器部署_第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,按秒计费的。

第一步:创建命名空间
netCore3.x 分布式开发学习笔记——Docker容器部署_第11张图片
第二步:创建镜像仓库

netCore3.x 分布式开发学习笔记——Docker容器部署_第12张图片
仓库创建后,点击仓库名称进入详情页

netCore3.x 分布式开发学习笔记——Docker容器部署_第13张图片
阿里已经把需要使用到的命令都列出来了,良心啊

5、上传镜像和版本更新

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

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

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

在这里插入图片描述
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:[镜像版本号]

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

netCore3.x 分布式开发学习笔记——Docker容器部署_第14张图片
版本更新只需要修改命令行后面的”镜像版本号“即可,非常简单。
到此,镜像仓库部署完成。

6、在Linux的Docker中使用镜像

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

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

netCore3.x 分布式开发学习笔记——Docker容器部署_第15张图片

//部署镜像
//语法: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 教程

你可能感兴趣的:(Docker,netcore)