当前位置: 首页 > news >正文

如何使用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

相关文章:

  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • HttpURLConnection发送各种内容格式
  • mysql怎么只允许指定IP访问
  • 书生·浦语大模型实战营——两周带你玩转微调部署评测全链路
  • Jenkins的邮箱配置和插件下载
  • PHP数组定义和输出
  • 【深度学习-目标检测】03 - Faster R-CNN 论文学习与总结
  • Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建
  • 【操作系统】探究进程奥秘:显示进程列表的解密与实战
  • 前端性能优化三十一:花裤衩模板webpack DllPlugin
  • 【JVM】虚拟机栈与本地方法栈
  • redis—String字符串
  • 【unity学习笔记】3.常用结构体
  • MyBatis——MyBatis的缓存
  • TrustZone之与非安全虚拟化交互
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Bytom交易说明(账户管理模式)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • javascript 总结(常用工具类的封装)
  • JS变量作用域
  • spring boot下thymeleaf全局静态变量配置
  • vuex 学习笔记 01
  • windows下如何用phpstorm同步测试服务器
  • 诡异!React stopPropagation失灵
  • 基于遗传算法的优化问题求解
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 离散点最小(凸)包围边界查找
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何实现 font-size 的响应式
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​你们这样子,耽误我的工作进度怎么办?
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Git) gitignore基础使用
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (原)Matlab的svmtrain和svmclassify
  • (转)重识new
  • ***通过什么方式***网吧
  • .NET大文件上传知识整理
  • .Net的DataSet直接与SQL2005交互
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /*在DataTable中更新、删除数据*/
  • @font-face 用字体画图标
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [Android]Tool-Systrace
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [CareerCup] 14.5 Object Reflection 对象反射