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


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

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

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

   2.下载redis镜像

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

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

 

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

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

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

  2.1 创建卷

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

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

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

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

  在磁盘中查看卷

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

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

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

 

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

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

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

 

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

  3.运行一个redis容器

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

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

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

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

  docker部署Asp.Net Core   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目录下

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

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

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

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

    被这里坑了好久天,不管怎么部署都访问不了redis,我都怀疑我自己是不是太傻了docker部署Asp.Net Core   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系统中了,哈哈。。。

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

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

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

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

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

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

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

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

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

   如上图,创建的镜像完成

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

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

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

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

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

  再次访问

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

 

  程序gg了,

  不急,看日志。命令 docker  logs aspnetTest  ,docker  logs  【容器名称或ID】docker部署Asp.Net Core   Redis 容器之间通信

   或者这样的错误

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

  以上错误都是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或名称】 

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

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

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

    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终端。

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

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

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

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

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

    apt update

    apt install vim

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

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

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

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

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

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

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

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

     docker部署Asp.Net Core   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地址。

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

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

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

 

 

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

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

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

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

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

 

 

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

  查看redis容器中的redis服务

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

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

 

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

 

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

 

 

     查看所有的键输入 keys * 

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

 

 

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

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

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

    因为asp.net core程序中使用的是微软的redis包,例如插入的key为lrt1 ,是一个hash类型,不是简单的string类型docker部署Asp.Net Core   Redis 容器之间通信

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

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

     未完明天继续写…..

原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/277675.html

(0)
上一篇 2022年7月29日
下一篇 2022年7月29日

相关推荐

发表回复

登录后才能评论