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

目录

[二 安装Redis](#二 安装Redis)

[2.1 基本安装](#2.1 基本安装)

[2.1.1 下载Redis](#2.1.1 下载Redis)

[2.1.2 解压并安装Redis](#2.1.2 解压并安装Redis)

[2.1.3 编译Redis](#2.1.3 编译Redis)

[2.1.3 配置config文件](#2.1.3 配置config文件)

[2.1.4 配置redis服务](#2.1.4 配置redis服务)

[2.1.5 关闭redis服务](#2.1.5 关闭redis服务)

[2.2 Docker安装](#2.2 Docker安装)

[2.2.1 拉取镜像](#2.2.1 拉取镜像)

[2.2.2 查看镜像](#2.2.2 查看镜像)

[2.2.2 创建挂载目录](#2.2.2 创建挂载目录)

[2.2.3 创建配置文件](#2.2.3 创建配置文件)

[2.2.4 创建容器并启动Redis服务](#2.2.4 创建容器并启动Redis服务)

[2.2.5 从Docker中查看Redis服务](#2.2.5 从Docker中查看Redis服务)

[2.2.6 从Docker中使用redis客户端](#2.2.6 从Docker中使用redis客户端)

[三 发布系统](#三 发布系统)

[3.1 发布系统](#3.1 发布系统)

[3.1.1 DockerFile配置](#3.1.1 DockerFile配置)

​编辑

[3.1.2 发布系统](#3.1.2 发布系统)

[3.1.3 上传文件](#3.1.3 上传文件)

[3.1.3 创建镜像文件](#3.1.3 创建镜像文件)

[3.1.4 启动容器](#3.1.4 启动容器)

[3.1.5 查看docker中的文件](#3.1.5 查看docker中的文件)

[4.1 连接Docker中的redis](#4.1 连接Docker中的redis)

[4.1.1 修改配置文件](#4.1.1 修改配置文件)

[4.1.2 Docker容器间使用bridge进行通信](#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.cnf

COPY ./ ./

#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
相关推荐
tf的测试笔记2 小时前
测试团队UI自动化实施方案
运维·自动化
TDD_06282 小时前
【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
linux·运维·经验分享·centos
x66ccff2 小时前
vLLM 启动 GGUF 模型踩坑记:从报错到 100% GPU 占用的原因解析
linux
头孢头孢2 小时前
k8s常用总结
运维·后端·k8s
遇码3 小时前
单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
大数据·运维·分布式·开源·定时任务·dolphin·scheduler
William.csj3 小时前
Linux——开发板显示器显示不出来,vscode远程登录不进去,内存满了的解决办法
linux·vscode
爱编程的王小美3 小时前
Docker基础详解
运维·docker·容器
KeithTsui3 小时前
GCC RISCV 后端 -- 控制流(Control Flow)的一些理解
linux·c语言·开发语言·c++·算法
森叶3 小时前
linux如何与windows进行共享文件夹开发,不用来回用git进行拉来拉去,这个对于swoole开发者来说特别重要
linux·git·swoole
liulilittle3 小时前
Linux 高级路由策略控制配置:两个不同路由子网间通信
linux·网络·智能路由器