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

网友投稿 806 2022-11-17

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

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

总结:

什么是Docker

虚拟机

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

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

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

Ubuntu 20.04 中安装Docker

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

Asp- Core程序

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

Docker部署Redis

1.搜索redis镜像

命令docker search redis

2.-redis镜像

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

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

2.1 创建卷

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

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

在磁盘中查看卷

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

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

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配置中开启了日志,并将日志输出到 ./redis.log的文件中,将redis数据持久化保存在 ./redis.rdb 文件中。

# bind 127.0.0.1  此行注释掉

protected-mode no  改为 no

requirepass 123456  添加密码

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

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

注意appsettings.json中的abortConnect=false

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

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

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

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

如上图,创建的镜像完成

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

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

再次访问

程序gg了,

或者这样的错误

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

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

6.解决方法

第一种含asp-core的程序的容器使用docker分配的redis容器的IP进行访问

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

查看之前部署的redis容器的详情信息,命令 docker inspect redisTest2 , docker inspect 【容器ID或名称】

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

接下来进入到部署asp- 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配置文件。

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

apt update

apt install vim

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

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

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

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

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

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

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

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

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

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

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

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

查看redis容器中的redis服务

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

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

查看所有的键输入 keys *

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

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

如下图输入命令 hgetall lrt1 查看hash中field与值,可以看到,asp- core程序成功插入值。

第二种 docker容器间使用bridge进行通信

1.重新创建一asp- core的容器,docker run --name=aspnetTest2 -p 5005:80 -d aspnettest  ,换一个端口 ,aspnettest 镜像。

2.将名为aspnetTest的容器停止,docker container stop aspnetTest

3.进入redis容器中,到redis服务上删除所有缓存,docker exec -it redisTest2 bash 进入名为redisTest2的容器。命令 redis-cli 使用cli工具连接redis服务。命令 auth 123456 ,进行认证。命令 keys * 查看所有键,del 键 键 ,del lrt1 lrt2,删除这两个缓存。

退出redis-cli 或 容器终端,键盘Ctrl  +  D。

4.创建一个 bridge 桥,并连接redisTest2、aspnetTest2容器。

a.查看docker中的网络 ,命令 docker network ls

b.创建 bridge ,命令 docker network create mybridge

c.命令 docker network ls ,如下图,至此bridge创建完成

d.将bridge连接到redisTest2、aspnetTest2容器上,使aspnetTest2容器与redisTest2容器通信。如下图,使用bridge方式通信,可以将redisTest2的ip地址直接写成此容器的名称,bridge在容器之间提供了自动DNS解析,将redisTest解析成redisTest容器对应的ip地址,这如果容器重启ip地址变更,这种方式就可以很好应对了。

e.连接redisTest2、aspnetTest2。如下图所示,  命令  docker network connect 【网络名称】 【容器名称或ID】

f.查看bridge详情信息,命令 docker network inspect mybridge ,查看详情信息,如下图,可以看到redisTest2、aspnetTest2容器加入到了同一个bridge中,redisTest2、aspnetTest2容器Ip网段也是一样的。

5.进入到aspnetTest2容器中修改配置文件。 docker exec -it aspnetTest2 bash

在修改appsettings.json文件前要- vim 编辑器,关于如何-,上文中以提到了,这里不重复,往上翻。

-好vim ,命令修改 vim appsettings.json,修改成这样,如下图

退出 vim  ,退出容器终端。

6.查看容器映射到主机的端口,

此时,还未将值插入到redis中。

成功在redis中插入缓存数据

至此docker容器间使用bridge进行通信例子完成。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:MySQl的内部存储代码
下一篇:Python的日期和时间详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~