如何使用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
相关推荐
运维&陈同学3 分钟前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!4 分钟前
【Linux】进程状态
linux·运维
hzyyyyyyyu17 分钟前
内网安全隧道搭建-ngrok-frp-nps-sapp
服务器·网络·安全
明明跟你说过32 分钟前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
Komorebi.py2 小时前
【Linux】-学习笔记05
linux·笔记·学习
Mr_Xuhhh2 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
中云DDoS CC防护蔡蔡3 小时前
微信小程序被攻击怎么选择高防产品
服务器·网络安全·微信小程序·小程序·ddos
HPC_fac130520678164 小时前
以科学计算为切入点:剖析英伟达服务器过热难题
服务器·人工智能·深度学习·机器学习·计算机视觉·数据挖掘·gpu算力
yaoxin5211235 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip