微信小程序蓝牙开发教程带你探索物联网的便捷与魅力
960
2022-11-17
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.net 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.net core的镜像 , 命令 docker build -t aspnettest . ,不要漏掉 “ . ” 这个 . 表示当前目录
如上图,创建的镜像完成
5.创建并运行aspnet core程序的容器
命令docker run --name=aspnetTest -p 5004:80 -d aspnettest , aspnettest 表示的镜像名称
再次访问
程序gg了,
或者这样的错误
以上错误都是asp.net程序中redis连接配置有问题。
aspnet程序已经停止运行,访问redis报错。
6.解决方法
第一种含asp.netcore的程序的容器使用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.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配置文件。
总结下来就是,下载一个编辑器,编辑文件。
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.net 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.net core程序成功插入值。
第二种 docker容器间使用bridge进行通信
1.重新创建一asp.net 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小时内删除侵权内容。