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

目录

二 安装Redis

2.1 基本安装

2.1.1 下载Redis

2.1.2 解压并安装Redis

2.1.3 编译Redis

2.1.3 配置config文件

2.1.4 配置redis服务

2.1.5 关闭redis服务

2.2 Docker安装

2.2.1 拉取镜像

2.2.2 查看镜像

2.2.2 创建挂载目录

2.2.3 创建配置文件

2.2.4 创建容器并启动Redis服务

2.2.5 从Docker中查看Redis服务

2.2.6 从Docker中使用redis客户端

三 发布系统

3.1 发布系统                                                                                                                    

3.1.1 DockerFile配置

​编辑

3.1.2 发布系统

3.1.3 上传文件

3.1.3 创建镜像文件

3.1.4 启动容器

3.1.5 查看docker中的文件

4.1 连接Docker中的redis

4.1.1 修改配置文件

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


二 安装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.mzph.cn/news/577245.shtml

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

相关文章

PortSwigger Access Control

lab1: Unprotected admin functionality 访问robots.txt 进了删除即可 lab2: Unprotected admin functionality with unpredictable URL 访问admin-d0qwj5 lab3: User role controlled by request parameter 发现Cookie中存在判断是否为admin lab4: User role can be modifie…

gitattributes配置文件的作用

0 Preface/Foreword 0.1 基本概念 Git版本管控工具功能强大,在使用过程中,在多人合作的项目开发过程中,经常会遇到提交代码时出现的warning提醒,尤其是换行符。 Linux/Unix/Mac OS操作系统的换行符使用LF符号(\n&am…

逆向P1P2总结

字节八位 word 16位 deword 32 位 00 00 00 e8 是存储32位信息的起点 不是程序运行的起点 为什么电脑有32位与64位之分 寻址宽度 以字节为单位 0xfffffff 1 就是最大容量 转为十进制为 4294967296 / 1024 (k)/1024 (kb)/ 1…

web功能实例 - Canvas裁剪工具

嗯,手撸官方文档2天,发现没啥用,尤其是动画,那种计算出来的,根本想不到。因此学着学了抱着要做个东西的想法,去网上找相关案例,最终做出了这个裁剪工具。 PS :先说一下思路: 核心实现有3个canvas图层, 其中一个负责图片的预览。另外2个叠加到…

【华为机试】2023年真题B卷(python)-发广播

一、题目 题目描述: 某地有N个广播站,站点之间有些有连接,有些没有。有连接的站点在接受到广播后会互相发送。 给定一个N*N的二维数组matrix,数组的元素都是字符’0’或者’1’。 matrix[i][j]‘1’,则代表i和j站点之间有连接,mat…

web前端游戏项目-辨色大比拼【附源码】

web前端游戏项目-辨色大比拼【附源码】 《辨色大比拼》是一个旨在测试和提升玩家颜色识别能力的在线游戏。在游戏中,玩家将通过辨识颜色来解谜并推进游戏进程。辨色大比拼也是一个寓教于乐的游戏,它不仅提供了一个有趣的辨色挑战,还能帮助玩…

leetcode2两数加和问题(链表)

题目思路: ①创建一个int类型的局部变量,用来存储两个结点的Val值。 ②判断该Val值与10求余(mod)后是否大于0,如果大于0, 则需要在下一个结点进位。 ③最关键的步骤:实现l1,l2结点数值相加后构建新的存储求和后的结点&#xff0…

IntelliJ IDEA插件

插件安装目录&#xff1a;C:\Users\<username>\AppData\Roaming\JetBrains\IntelliJIdea2021.2\plugins aiXcoder Code Completer&#xff1a;代码补全 Bookmark-X&#xff1a;书签分类 使用方法&#xff1a;鼠标移动到某一行&#xff0c;按ALT SHIFT D

修改PCIE 设备控制寄存器DevCtl2参数

如何修改PCIE 设备控制寄存器DevCtl2参数&#xff1f; 参考书籍&#xff1a;PCI_Express_Base_Spec 如图所示&#xff1a;输入Lspci -s 00&#xff1a;08&#xff1a;00 -vvv|grep - i deve 输出DevCap、DevCtl、DevCap2、DevCtl2参数&#xff0c;本节重点分析UEFI BIOS怎么设置…

FPGA分频电路设计(2)

实验要求&#xff1a; 采用 4 个开关以二进制形式设定分频系数&#xff08;0-10&#xff09;&#xff0c;实现对已知信号的分频。 类似实验我之前做过一次&#xff0c;但那次的方法实在是太笨了&#xff1a; 利用VHDL实现一定系数范围内的信号分频电路 需要重做以便将来应对更…

JUC并发编程 09——队列同步器AQS

目录 一.Lock接口 1.1Lock的使用 1.2Lock接口提供的 synchronized 不具备的主要特性 1.3Lock接口的所有方法 二.队列同步器(AQS) 2.1队列同步器的接口与示例 2.2AQS实现源码分析 ①同步队列 ②获取锁 ③释放锁 一.Lock接口 说起锁&#xff0c;你肯定会想到 synchron…

Android Studio 如何实现软件英文变中文教程

目录 前言 一、确认版本号 二、下载汉化包 三、汉化包安装 四、如何实现中英文切换 五、更多资源 前言 Android Studio是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发Android应用程序。默认情况下&#xff0c;Android Studio的界面和…

js中Math.min(...arr)和Math.max(...arr)的注意点

当arr变量为空数组时&#xff0c;这两个函数和不传参数时的结果是一样的 Math.max() // -Infinity Math.max(...[]) // -InfinityMath.min() // Infinity Math.min(...[]) // Infinity

如何编写高效清晰的嵌入式C程序

作为嵌入式工程师&#xff0c;怎么写出效率高、思路清晰的C语言程序呢? 要用C语言的思维方式来进行程序的构架构建 要有良好的C语言算法基础&#xff0c;以此来实现程序的逻辑构架 灵活运用C语言的指针操作 虽然看起来以上的说法很抽象&#xff0c;给人如坠雾里的感觉&…

内存之-LeakCanary

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用四、原理分析4.1 自动初始化4.1.1 初始化…

人工智能_机器学习074_SVM支持向量机_软间隔与优化目标函数构建_C参数由来_惩罚误差点的惩罚度---人工智能工作笔记0114

然后我们接着上一节再来看一下这里我们说有个 min_faces_per_person = 0 这个可以看到如果我们写上0,就意味着要加载所有的人脸图片,就会花费的时间久对吧 我们可以试试,这里我们 min_faces_per_person = 0 改成0然后 我们等一会加载完了以后,我们用 display(X.shape,faces.sh…

Jenkins安装与设置(插件安装失败,版本问题解决)

早期的使用docker安装jenkins的方法会出现插件无法安装的问题&#xff0c;是由于docker拉取的jenkins版本太低了 jdk安装 Linux系统安装JDK1.8 详细流程 maven安装&#xff1a; centos7下安装Maven 使用docker进行安装jenkins&#xff1a; 先把镜像和容器卸干净 docker ps -a…

vue data变量不能以“_”开头,否则会产生很多怪异问题

1、 比如给子组件赋值&#xff0c;子组件无法得到这个值&#xff08;也不是一直无法得到&#xff0c;设置后this.$forceUpdate() 居然可以得到&#xff09;&#xff0c; 更无法watch到 <zizujian :config"_config1"> </zizujian>this._config1 { ...…

短视频矩阵系统的崛起和影响

近年来&#xff0c;短视频矩阵系统已经成为了社交媒体中的一股新势力。这个新兴的社交媒体形式以其独特的魅力和吸引力&#xff0c;迅速吸引了大量的用户。这个系统简单来说就是将海量短视频整合在一个平台上&#xff0c;使用户可以方便地观看和分享好玩有趣的短视频。 短视频…

50个免费的 AI 工具,提升工作效率(附网址)

上次我们已经介绍了20个精选的提高工作效率的免费AI工具&#xff0c;但如果你觉得这些AI工具还不过瘾的话&#xff0c;想进一步成为职场中最了解AI的人&#xff0c;本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具&#xff0c;适用于想要制作令人…