docker部署Asp.Net Core Redis 容器之间通信

2022/7/30 2:23:55

本文主要是介绍docker部署Asp.Net Core Redis 容器之间通信,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

唉,搞了好几天天终于搞好了,各种采坑。

学习的路上哪有一马平川呢。。。

总结:

什么是Docker

  参考:https://www.cnblogs.com/yuxl01/p/16293799.html

        https://docs.docker.com/get-started/overview/

 

虚拟机

  我使用的是windows10,在win10中安装的Oracle VM VirtualBox虚拟机,在虚拟机中安装Ubuntu 20.04桌面版系统。

  安装Oracle VM VirtualBox虚拟机教程很多,要注意的一点就是,初次安装Ubuntu 20.04桌面版,界面很小,太难操作了,这个设置教程网上教程也多。

  这些安装软件、设置配置都要自己亲自操作一遍,去实践。

Ubuntu 20.04 中安装Docker

  参考:https://zhuanlan.zhihu.com/p/143156163

  当时,安装也踩了不少坑。总之要不断尝试,大不了,卸载了,重来。

Asp.net Core程序

  代码很简单,就是想实践下Docker容器部署,Docker容器中程序访问另一个Docker容器的程序

  代码地址:https://github.com/qiqiqiyaya/Learning-Case/tree/main/Redis/DistributedCache

Docker部署Redis

  1.搜索redis镜像

  命令docker search redis

  

   2.下载redis镜像

  命令 docker pull redis 未指定版本,默认下载最新版本

  

 

     我这里使用 volume 卷,不是挂载本地目录,将redis的配置、日志、持久化数据文件存储在 volume 卷中(不止这一种方式)。

  为什么这么做,纯粹就是想体验下。

  关于 卷 的介绍,使用可参考 https://www.cnblogs.com/edisonchou/p/docker_volumes_introduction.html ,必须跟着实践一遍,虽然啥也不懂,很快忘了,但是实践是必要的。

  2.1 创建卷

  查看docker中存在的 卷 , docker volume ls

  

  创建 卷 ,docker volume create 名称 ,例如:docker volume craete redisTest

  

  在磁盘中查看卷

  

   volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式

  

 

  点击进入_data文件,再进入_data文件(我这里直接点击进入,没搞啥命令)

  copy以个redis.conf,redis的配置文件进去。

  redis.conf配置文件下载地址 https://github.com/qiqiqiyaya/Learning-Case/blob/main/Redis/redis.conf (我的github仓库)

 

   

  3.运行一个redis容器

  查看正在运行的docker容器,docker container ls , 查看所有容器(运行与未运行)的容器 docker container ls -a

  

   如上图,我停止了所有运行的容器。

  使用卷volume,创建一个容器,docker run --name=redisTest2 -p 5003:6379 -v redisTest:/data -d  redis redis-server /data/redis.conf ,如下图,创建的名为redisTest2的运行redis服务的容器

  

  --name=redisTest2  创建一个名为 redisTest2的容器

  -p 5003:6379  将容器中redis服务的端口映射到主机的5003端口上

  -v redisTest:/data  使用刚才创建的卷 volume ,将主机上的卷映射到容器中的/data目录中,

  -d 后台运行容器并返回容器ID

  redis 这是redis镜像

  redis-server /data/redis.conf  ,redis服务启动使用指定目录下的redis配置文件

     容器创建完成后,查看主机上创建的卷redisTest目录下

  

     关于redis.conf中配置详情介绍,参考 https://www.cnblogs.com/liuhongfeng/p/4704443.html ,博客中具体介绍了redis配置。

  我这里在redis.conf配置中开启了日志,并将日志输出到 ./redis.log的文件中,将redis数据持久化保存在 ./redis.rdb 文件中。

  坑:redis部署在docker容器中,如果要被外部访问或其他容器访问,则需要开启redis远程访问,此时的redis已不再是本地访问的形式了

    被这里坑了好久天,不管怎么部署都访问不了redis,我都怀疑我自己是不是太傻了

    # bind 127.0.0.1  此行注释掉

    protected-mode no  改为 no

    requirepass 123456  添加密码

  4.创建Asp.Net Core程序镜像

  我的测试代码参考 https://github.com/qiqiqiyaya/Learning-Case/tree/main/Redis/DistributedCache

  代码中的Dockerfile只是用来创建镜像的,不含开发、调试。

  注意appsettings.json中的abortConnect=false

  将代码发布并copy到ubuntu系统中,我使用的虚拟机中部署的Ubuntu桌面版,先将发布的代码压缩成zip,如何鼠标一拖,就到了ubuntu系统中了,哈哈。。。

  

   修改appsettings.json配置文件,redis地址,改成刚才部署的redis容器映射到主机的端口

  

   

  

   或者将打开的终端定位到当前的文件夹目录中。

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

   

   

   如上图,创建的镜像完成

   5.创建并运行aspnet core程序的容器

   命令docker run --name=aspnetTest -p 5004:80 -d aspnettest , aspnettest 表示的镜像名称

   然后通过浏览器访问 http://localhost:5004/

  

  

  再次访问

   

 

  程序gg了,

  不急,看日志。命令 docker  logs aspnetTest  ,docker  logs  【容器名称或ID】

   或者这样的错误

  

  以上错误都是asp.net程序中redis连接配置有问题。 

     aspnet程序已经停止运行,访问redis报错。

  错误原因:创建镜像时,appsettings.json配置文件中设置的redis地址为 http://localhost:5003 ,对这个aspnetTest容器而言,容器就是一个虚拟的主机环境,http://localhost:5003就表示访问本虚拟主机的5003端口,哪必然是报错。 

  6.解决方法 

  第一种

    将appsettings.json中的redis改为redisTest2容器对应的ip地址,然后访问。这里其实涉及到docker容器通信的问题,第二种方法讲。

    查看之前部署的redis容器相关设置,命令 docker inspect redisTest2 , docker inspect 【容器ID或名称】 

    

    

    

    bridge ,docker通信中的一种方式,可以看到 redisTest2 容器的ip地址的172.17.0.2,redis的端口是6379。

    接下来进入到部署asp.net core 程序的容器中,docker container ls ,如果没有看到运行的 aspnetTest 容器,则输入 docker container ls -a 查看所有停止或正在运行的容器

    启动 aspnetTest 容器(容器不启动,进入不了容器内)  docker container start aspnetTest,docker container start 【容器名称或ID】, 表示启动容器。 docker container stop 【容器名称或ID】 表示停止运行的容器。一个更简单的命令  docker container restart 【容器名称或ID】,表示重启。

    启动 aspnetTest 容器,命令  docker exec -it aspnetTest bash , 表示进入到容器内的linux终端。

    

     如上图,就表示进入到了容器内的终端。输入 ls  查看此目录中的信息,可以看到appsettings.json配置文件。

    

    如何编辑appsettings.json配置文件 ,参考 https://stackoverflow.com/questions/31515863/how-to-run-vi-on-docker-container

    总结下来就是,下载一个编辑器,编辑文件。

    apt update

    apt install vim

    国内网慢一点,如果下载失败了,多尝试几次,会自动接着上次下载,或者可以将容器中的下载地址转到阿里什么的上面。

    下载vim好之后,在容器的终端中输入(这里的目录得是/app),vim appsettings.json。

    

    关于如何使用vim编辑器,自行搜索下。

    

    键盘 “ Delete ” 删除字符。  按键盘字母 i 插入字符,保存Ctrl + s 。退出插入字符状态,按ESC 键。退出编辑文本,按键盘中这几个键 “ :wq ” 。

    

    如上图,修改redis连接地址。

     

    一个小插曲,在 aspnetTest 容器中如何查看是否可访问redisTest2容器呢?

    输入命令 apt-get install iputils-ping 参考:https://stackoverflow.com/questions/39901311/docker-ubuntu-bash-ping-command-not-found

    下载失败什么的,多尝试下载几次。

    下载完后,在 aspnetTest 容器中的终端上输入命令 ping 172.17.0.2   , ping 【IP地址】,172.17.0.2 是刚才查看redisTest2容器的ip地址。

    

    如上图,aspnetTest 容器与 redisTest2容器 是可以通信的。

    退出aspnetTest 容器的终端,退出容器中的终端,按 Ctrl + D

 

 

       然后重启asp.net core 程序,docker container restart aspnetTest

    在此访问网站 http://localhost:5004/

    

     

     

 

 

     可以看到将值已经插入redis缓存中了,并且成功取出缓存值。

  查看redis容器中的redis服务

    docker exec -it redisTest2 bash ,进入到redisTest2容器终端内

    

 

    输入redis-cli 登录到redis服务上

 

     

 

 

     查看所有的键输入 keys * 

    

 

 

     此时显示未认证,这是在部署redis时,在配置文件中设置了密码 requirepass 123456

     

     输入auth 123456,进行认证,然后输入 keys * ,查看所有键。

    因为asp.net core程序中使用的是微软的redis包,例如插入的key为lrt1 ,是一个hash类型,不是简单的string类型

     输入命令 hgetall lrt1 查看hash中field与值

    

     未完明天继续写.....



这篇关于docker部署Asp.Net Core Redis 容器之间通信的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程