如何使用Docker将.Net6项目部署到Linux服务器(二)

二 安装Redis

2.1 基本安装

2.1.1 下载Redis

进去Redis官网 http://www.redis.io/ 

历史版本下载地址:Index of /releases/ 

Redis中文文档地址:Redis文档中心 -- Redis中国用户组(CRUG)

Redis下载地址: Download | Redis 

我们选择复制链接,创建目录,进入该目录下载Redis

cd /usr/local
wget https://github.com/redis/redis/archive/7.2.3.tar.gz

 2.1.2 解压并安装Redis

        判断是否已经安装gcc

rpm -qa|grep gcc

        如果没有安装,则我们需要安装gcc

yum -y install gcc

        解压到我们创建的自定义目录

 mkdir redis_package
tar -zvxf /usr/local/7.2.3.tar.gz -C /usr/local/redis_package

   解压后,我们可以看到这样的文件

2.1.3 编译Redis

进入解压后的目录

cd /usr/local/redis_package/redis-7.2.3
make
make PREFIX=/usr/local/redis install

 这里多了一个关键字 PREFIX=

这个关键字的作用是编译的时候用于指定程序存放的路径

比如我们现在就是指定了redis必须存放在/usr/local/redis目录。假设不添加该关键字

Linux会将可执行文件存放在/usr/local/bin目录

库文件会存放在/usr/local/lib目录

配置文件会存放在/usr/local/etc目录

其他的资源文件会存放在usr/local/share目录

这里指定好目录也方便后续的卸载,后续直接rm -rf /usr/local/redis 即可删除redis。

如上,编译完成之后,会在src目录下多出几个可执行的shell脚本,其中就有最常用的redis-serverredis-cli;此时这些脚本就可以直接对Redis进行相关的操作

...
./redis-server                                 # 启动Redis服务
...
./redis-cli                                    # 启动Redis客户端
...

但是每次操作Redis的相关命令都要进入到安装目录下的src目录,这样很繁琐,所以我们可以make之后再执行make install

就会把make命令生成在src目录下的所有二进制文件复制一份放到/usr/local/bin目录下;又因为 /usr/local/bin在系统变量 PATH中;所有在任意的目录都可以执行Redis相关的脚本。

但是多数情况下,习惯在执行 make install 命令时指定Redis的安装目录,通常安装在 /usr/local/redis 下

OK,我们现在看到的/usr/local/redis/目录中只有一个bin文件,且bin目录的结构如下

此时代表我们的Redis已经安装完成

2.1.3 配置config文件

首先,我们先从编译后的Redis目录中Copy一份文件备份,防止我们在修改Config文件时出错。我们在Redis安装包中创建一个备份文件夹,将config文件备份至该文件夹

 

另外我们重新Copy一份redis.conf至redis目录中

修改redis.conf文件

1 默认daemonize no 改为 daemonize yes

 

2 默认protected-mode yes 改为 protected-mode no

 

3 默认bind 127.0.0.1 改为 直接注释掉(默认bind 127.0.0.1只能本机访问)或改成本机IP地址,否则影响远程IP连接

 

4 添加redis密码 改为 requirepass 你自己设置的密码,(010109为我们设置的密码)

 这里有一份Redis文件配置注解信息

1、daemonize 如果需要在后台运行,把该项改为yes
2、pidfile 配置多个pid的地址 默认在/var/run/redis.pid
3、bind 绑定ip,设置后只接受来自该ip的请求
4、port 监听端口,默认是6379
5、loglevel 分为4个等级:debug verbose notice warning
6、logfile 用于配置log文件地址
7、databases 设置数据库个数,默认使用的数据库为0
8、save 设置redis进行数据库镜像的频率。
9、rdbcompression 在进行镜像备份时,是否进行压缩
10、dbfilename 镜像备份文件的文件名
11、Dir 数据库镜像备份的文件放置路径
12、Slaveof 设置数据库为其他数据库的从数据库
13、Masterauth 主数据库连接需要的密码验证
14、Requriepass 设置 登陆时需要使用密码
15、Maxclients 限制同时使用的客户数量
16、Maxmemory 设置redis能够使用的最大内存
17、Appendonly 开启append only模式
18、Appendfsync 设置对appendonly.aof文件同步的频率(对数据进行备份的第二种方式)
19、vm-enabled 是否开启虚拟内存支持 (vm开头的参数都是配置虚拟内存的)
20、vm-swap-file 设置虚拟内存的交换文件路径
21、vm-max-memory 设置redis使用的最大物理内存大小
22、vm-page-size 设置虚拟内存的页大小
23、vm-pages 设置交换文件的总的page数量
24、vm-max-threads 设置VM IO同时使用的线程数量
25、Glueoutputbuf 把小的输出缓存存放在一起
26、hash-max-zipmap-entries 设置hash的临界值
27、Activerehashing 重新hash

 5 设置redis默认配置文件为redis.conf

cd /usr/local/redis
./bin/redis-server redis.conf
 2.1.4 配置redis服务

我们查看6379端口是否已经被占用

ps -ef|grep redis|grep -v grep

出现如下提示,则表示6379端口已经被redis占用 

 

客户端启动Redis,验证Redis是否启用成功 ( ckk_0821为redis密码)

./bin/redis-cli -a ckk_0821 -p 6379

出现如下提示,则表示Redis客户端打开成功 

 测试Redis是否可以正常使用,输入ping命令,返回PONG说明测试成功!

再次测试键值对的输入输出,若输入输出正常,则表示redis安装完成

127.0.0.1:6379> set key1 ckk
OK
127.0.0.1:6379> get key1
"ckk"
  2.1.5 关闭redis服务
shutdown
quit

2.2 Docker安装

2.2.1 拉取镜像

        拉取最新版本的Redis镜像

docker pull redis

        拉取指定版本的Redis镜像

docker pull redis:6.0.8

         拉取结果如下,表示镜像拉取成功

 2.2.2 查看镜像
docker image ls

2.2.2 创建挂载目录
cd /usr/local
mkdir -p /usr/local/docker/redis/conf
mkdir -p /usr/local/docker/redis/data
mkdir -p /usr/local/docker/redis/log
2.2.3 创建配置文件

从官网中下载Redis配置文件redis.conf,并将文件放置于/usr/local/docker/redis/conf/目录中,根据需求修改config文件。

修改以下配置:

  • 1)bind 127.0.0.1 :注释掉这部分,这是限制 redis 只能本地访问

  • 2)protected-mode no :默认是yes,开启保护模式,限制为本地访问

  • 3)requirepass 123456 :配置 redis 连接密码,默认是注释的

  • 4)dir ./ :更改本地redis数据库存放文件夹(可选)

  • 5)appendonly yes :redis 持久化,开启了这个 redis 就不会每次重启时自动清空了

 创建日志文件 

touch /usr/local/docker/redis/log/redis.log

修改日志文件的操作权限(最高权限,可写可读) 

chmod 777 /usr/local/docker/redis/log/redis.log
2.2.4 创建容器并启动Redis服务
docker run -p 6380:6380 --name forumredis --privileged=true \
-v /usr/local/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
-v /usr/local/docker/redis/log/redis.log:/log/redis.log \
redis:latest redis-server /usr/local/etc/redis/redis.conf

1)--name:给redis容器起一个名字;

2)-p:端口映射(宿主机端口:容器端口);

3)-v:挂载自定义配置(自定义配置:容器内部配置);

本命令共有两个挂载:

Linux 上自定义的 redis 配置(/docker/redis/conf/redis.conf)挂载到容器内 redis 应用的默认配置文件 /etc/redis/redis.conf;

Linux 上自定义的数据存放目录(/docker/redis/data)挂载到容器内 redis 应用的默认数据存放目录(/data)。

Linux 上自定义的日志存放目录(/docker/redis/log)挂载到容器内 redis 应用的默认日志存放目录(/log)。

这样 docker 容器内的 redis 应用会使用 Linux 上自定义的配置文件,docker 容器内的 redis 应用的数据会放到 Linux 上自定义的数据存放目录。

4)-d:后台运行;

5)redis-server --appendonly yes: 在容器执行 redis-server 启动命令,并打开 redis 持久化配置;

 2.2.5 从Docker中查看Redis服务
docker ps

 进入到启动的redis容器 

docker exec -it forumredis /bin/bash

 退出启动的redis容器

exit
    2.2.6 从Docker中使用redis客户端
docker exec -it forumredis redis-cli
# 可以指定端口
docker exec -it forumredis redis-cli -p 6380

  进入客户端之后,输入我们的密码

[root@iZ2ze6on3jy8afby5yaj0bZ ~]# docker exec -it forumredis redis-cli -p 6380
127.0.0.1:6380> auth 密码

   测试redis是否安装成功

127.0.0.1:6380> ping
PONG

  至此,在docker中的redis就安装完成了。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

三 发布系统

3.1 发布系统                                                                                                                     

3.1.1 DockerFile配置

添加DockerFile

目前.NET6支持添加DockerFile。我们先将Dockerfile文件属性复制到输出目录的方式调整为** 如果较新则复制**,方便我们部署。

我们来解析以下Dockerfile文件里面的内容与流程

 编辑DockerFile文件

dockerfile文件可以由系统自动生成,但是手动发布需要修改系统生成的dockerfile文件,因为手动发布已经生成了dll文件,不需要调用build命令再次生成。所以我们需要修改DockerFile,只需要保留程序入口以及运行端口指定就可以了。

具体文件如下 

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443#如果用system.sqlclient.dll访问数据库,需要加这一句
RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnfCOPY ./ ./#FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
#WORKDIR /src
#COPY ["FYSY.Demo/FYSY.Demo.csproj", "FYSY.Demo/"]
#COPY ["FYSY.Comm/FYSY.Comm.csproj", "FYSY.Comm/"]
#COPY ["FYSY.Domain/FYSY.Domain.csproj", "FYSY.Domain/"]
#COPY ["FYSY.Model/FYSY.Model.csproj", "FYSY.Model/"]
#RUN dotnet restore "FYSY.Demo/FYSY.Demo.csproj"
#COPY . .
#WORKDIR "/src/FYSY.Demo"
#RUN dotnet build "FYSY.Demo.csproj" -c Release -o /app/build
#
#FROM build AS publish
#RUN dotnet publish "FYSY.Demo.csproj" -c Release -o /app/publish /p:UseAppHost=false
#
#FROM base AS final
#WORKDIR /app
#COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FYSY.Demo.dll"]
 3.1.2 发布系统

在发布系统之前,我们需要对项目中的一些文件进行修改

在Startup里面,Configure下面需要做修改:

swagger默认是写在 if (env.IsDevelopment())判断语句里面的,代表使用编译器启动,才会进来。我们把swagger有关的写到外面去,不然发布以后,可能会看不到swagger的页面:

 

 切记,在发布系统时,目标运行时,一定要选择 可移植,不要选择liunx-64,否则会报错,报错内容为:

System.InvalidOperationException: Unable to resolve service for type '***.***.***' while attempting to activate '***.***.***'

  3.1.3 上传文件

首先我们需要新建一个目录

mkdir forum_manage

然后我们将已经发布后的文件上传到服务器该目录下。我这里使用的工具是xftp

打开发布后的目录后,选择发布后的文件进行上传。

3.1.3 创建镜像文件

创建镜像文件,文件上传后,进行文件所在目录,cd  文件目录 。然后使用以下命令 创建镜像文件  注意后面的 . 不能少

cd /root/forum_manage

创建一个asp.net core的镜像 , 命令 docker build -t aspnettest .  ,不要漏掉  “ . ”  这个 . 表示当前目录 

docker build -t 镜像名称:版本号 .

输出文件如下: 

3.1.4 启动容器

使用下面的命令启动容器

docker run -d -p 8030:80 --name 容器名称 --privileged=true --restart=always -e TZ=Asia/Shanghai -d 镜像名称:版本号

  其中8001是系统的端口号,80是容器 

 --restart=always 表示容器停止后自动重启(比如服务器重启了),如果运行容器时没有加这个参数,可以使用docker container update --restart=always 容器名字  来修改, 

-e TZ=Asia/Shanghai  表示指定容器的时区,以免.net core获取的时间不正确 

-v 是指定挂载目录/home/OnlineBusiness/dotnet_docker_test宿主机目录,

:后面的是docker应用内目录

docker Access to the path '/proc/1/map_files' is denied.问题原因及解决办法

原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:

  • 1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数:

docker run -i -t -v /soft:/soft --privileged=true 686672a1d0cc /bin/bash

  • 2.临时关闭selinux:

setenforce 0

  • 3.添加selinux规则,改变要挂载的目录的安全性文本

执行命令

docker ps

我们再查看一下日志文件:

docker logs forumapicontainer
 3.1.5 查看docker中的文件

要查看容器中的文件列表,可以使用 docker exec 命令。该命令用于在正在运行的容器中执行命令。

 docker exec forumapicontainer ls

要查看名为 forumapicontainer 的容器中 目录下的文件列表,可以执行以下命令:

docker  exec forumapicontainer  ls  /app

4.1 连接Docker中的redis

 4.1.1 修改配置文件

首先,如果连接Docker中的redis,我们需要先修改配置文件,配置文件中不可以再使用Ip地址而要使用Docker中redis中的dockerName

我们需要将此处的Ip地址修改为:

 

 4.1.2 Docker容器间使用bridge进行通信

创建 bridge

docker network create forumbridge

查看目前已经存在的network

docker network ls

使用bridge将redis跟我们的.Net程序通讯

docker network connect forumbridge forumapi
docker network connect forumbridge forumredis 

查看bridge详情信息

 docker network inspect forumbridge

 

在containers中我们可以看到forumapi以及forumredis已经加入同一个bridge;

重启我们的redis容器以及我们的Net容器

docker stop forumapi

我们停止之前已经创建的NetDocker

然后我们重新启动该ApiDocker

docker run -d -p 8030:80 --name forumapi --privileged=true --network=forumbridge -e TZ=Asia/Shanghai -d forumcontainer

切记,在这里启动Docker时,一定要指定NetWork,不然的话将会提示Redis连接不上 

docker restart forumredis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/224187.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux进阶之路】线程

文章目录 一、初始线程1.概念2.执行3.调度4.切换 二、线程控制1.创建2.等待3.分离4.退出5.取消 三、线程安全1.互斥1.1初始1.2理解1.3锁1.3.1概念1.3.2原理1.3.4死锁 2.同步2.1概念2.2原理 3.生产消费者模型 总结尾序 一、初始线程 1.概念 简单的概念: 线程就是一…

七、Class文件结构及深入字节码指

一、JVM语言的无关性与class类文件 不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石,也是语言无关性的基础。 Java 虚拟机不和任何语言绑定,它只与“Class 文件”这种特定的二进…

微服务架构<2>

在电商项目中,我们针对一些核心业务,比较复杂的业务需要做一些设计以及优化的过程首先我们针对于订单的模块拆分了2个子模块1.order-curr实时下单业务 2.order-his 做一些历史的订单归档我们的订单业务 >商品添加至购物车 >购物车结算--> 订单…

【Docker容器精解篇 】深入探索Docker技术的概念与容器思想

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《docker容器精解篇》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、Docker 的介绍1.1 Docker 的由来1.1.1 环境不一致1.1.2 隔离性1.1.3 弹性伸缩1.1.4 学习成本 1.2 Doc…

ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮

以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如:es6 想要系统学习: 大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏&…

MT3608 高效率1.2MHz2A升压转换器和MT3608L 高效率1.2MHz 2.5A升压转换器 MT3608L和MT3608的区别

MT3608是一个恒定的频率,6引脚SOT23电流模式升压转换器的小,低功耗应用的目的。该MT3608开关在1.2MHz,并允许微小的,低成本的电容器和电感器使用2毫米或更小的高度内部软启动浪涌电流的结果,并延长电池寿命。 …

Hive执行计划

Hive提供了explain命令来展示一个查询的执行计划,这个执行计划对于我们了解底层原理,Hive 调优,排查数据倾斜等很有帮助。 使用语法如下: explain query;在 hive cli 中输入以下命令(hive 2.3.7): explain select s…

springMVC-与spring整合

一、基本介绍 在项目开发中,spring管理的 Service和 Respository,SrpingMVC管理 Controller和ControllerAdvice,分工明确 当我们同时配置application.xml, springDispatcherServlet-servlet.xml , 那么注解的对象会被创建两次, 故…

U盘加密软件下载安装步骤

随着移动存储设备的普及,U盘已成为我们工作和生活中不可或缺的存储工具。然而,U盘丢失或被盗的风险也随之增加,如何保护U盘中的敏感数据成为了重要的问题。此时,U盘加密软件成为了解决这一问题的有效手段。 下面,我们…

SQLiteStudio安装指南

本博文源于笔者想要打开sqlite3的db文件,于是下载了SQLiteStudio,下载了它,sqlite3的文件随便查看,这里从零开始安装 文章目录 1、搜索官网网址2、开始下载3、开始安装4、开始使用5、总结 1、搜索官网网址 官网地址:…

VGG网络分析与demo实例

参考自 up主的b站链接:霹雳吧啦Wz的个人空间-霹雳吧啦Wz个人主页-哔哩哔哩视频这位大佬的博客 Fun_机器学习,pytorch图像分类,工具箱-CSDN博客 VGG 在2014年由牛津大学著名研究组 VGG(Visual Geometry Group)提出,斩获该年 Imag…

图片素材管理软件Eagle for mac提高素材整理维度

Eagle for mac是一款图片素材管理软件,支持藏网页图片,网页截屏,屏幕截图和标注,自动标签和筛选等功能,让你设计师方便存储需要的素材和查找,提供工作效率。 Eagle mac软件介绍 Eagle mac帮助你成为更好、…

使用Ubuntu22+Minikube快速搭建K8S开发环境

安装Vmware 这一步,可以参考我的如下课程。 安装Ubuntu22 下载ISO镜像 这里我推荐从清华镜像源下载,速度会快非常多。 下载地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.3/ 如果你报名了我的这门视频课程&#xf…

Linux之基础I/O

目录 一、C语言中的文件操作 二、系统文件操作I/O 三、文件描述符fd 1、文件描述符的引入 2、对fd的理解 3、文件描述符的分配规则 四、重定向 1、重定向的原理 2、重定向的系统调用dup2 五、Linux下一切皆文件 一、C语言中的文件操作 1、打开和关闭 在C语言的文…

LangChain 31 模块复用Prompt templates 提示词模板

LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…

Tofu5m目标识别跟踪模块 跟踪模块

Tofu5m 是高性价比目标识别跟踪模块,支持可见光视频或红外网络视频的输入,支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能,提供多机版与触控版管理软件,为二次…

Redux与React环境准备、实现counter(及传参)、异步获取数据

环境说明: 一:说明 在React中使用redux,官方要求安装两个其他插件:Redux Toolkit和react-redux 1. Redux ToolKit(RTK) - 官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式 (简化…

通过字符设备驱动点亮板子上的led灯

通过字符设备驱动点亮板子上的led灯 app: test.c char buf[3] 1 0 0 0 1 0 0 0 1 ------------------|------------------------ kernel: led_driver.c -------------------|------------------------ hardware: RGB_led 应用程序如何将数据传递给驱动(读写…

Kafka日志

位置 server.properties配置文件中通过log.dir指定日志存储目录 log.dir/{topic}-{partition} 核心文件 .log 存储消息的日志文件,固定大小为1G,写满后会新增一个文件,文件名表示当前日志文件记录的第一条消息的偏移量。 .index 以偏移…

计算机视觉基础(13)——深度估计

前言 本节是计算机视觉的最后一节,我们将学习深度估计。从深度的概念和度量入手,依次学习单目深度估计和双目/多目深度估计,需要知道深度估计的经典方法,掌握深度估计的评价标准,注意结合对极几何进行分析和思考。 一、…