目录
背景
最近在开发基于 Django 的电商网站,使用 Redis 进行商品信息的缓存,由于使用 Windows 进行开发,Redis 自身不支持 Windows系统,查阅了很多资料只有几种办法,要么使用 Github 上的旧版 Redis,要么使用 Win10 以上支持 WSL 的子系统,考虑到 Github 不能第一时间使用最新版,WSL 自身不稳定等因素,使用 Docker 部署 Rdis 镜像来解决 Windows 使用 Redis 的问题。
2022.7.30 更新
开发过程中发现 Docker 的另一种用法,通过在 Dokcer 中新建 Python 镜像容器,可以解决 Windows 环境中缺乏编译器等问题,直接使用文件映射和端口映射的方式,可以解决 Python 开发环境部署问题。
已知问题:
- 使用 Docker 进行环境部署无法直接通过 Pycharm 跳转代码错误位置。
- 无法使用断点调试功能,原因是命令行和 Pycharm 分离。
准备工作
开始部署
安装 Redis
Redis 直接下载安装,安装完毕后直接打开命令提示符,使用以下代码进行 Redis 的安装,也可以使用图形界面进行安装。
#在docker仓库搜索redis
docker search redis
#下载redis到本地仓库不加版本号默认是最新版
docker pull redis
#查看下载好的容器
docker images
如果下载成功,使用命令显示的效果如图
标签名称 | 标签意义 |
---|---|
REPOSITORY | 标签表示当前下载的镜像名称 |
TAG | 表示当前镜像的版本 |
IMAGE ID | 是 Docker 自身对镜像设置的 ID |
CREATED | 表示这个镜像是什么时候创建的 |
SIZE | 表示镜像大小 |
能够成功显示以上的内容,则代表已经成功安装 Redis,随后我们需要解压之前下载的 Redis 压缩包,将其中的 redis.config 文件解压出来并进行修改。
修改 Redis 配置文件
Redis 的默认配置文件中,只允许进行本地连接,同时以保护模式进行运行,不允许远程连接,在实际开发当中有许多不便,需要对配置文件当中的部分内容进行修改。
修改前 | 修改后 | 作用 |
---|---|---|
bind 127.0.0.1 | bind 0.0.0.0 | 允许外部连接 |
protected-mode yes | protected-mode no | 关闭保护模式 |
appendonly no | appendonly yes | 开启持久化 |
requirepass " " | requirepass 你需要设置的密码 | 设置密码 |
在这些配置当中,一些配置前面存在 # 号,将 # 删去才能使该配置生效
启动 Redis
修改完配置文件后,记录下配置文件所在的位置,我保存在桌面上,因此路径为
C:\Users\TOM\Desktop\redis.conf
接下来使用该路径进行 Redis 的启动,具体启动代码如下:
docker run -p 6379:6379 --name iredis -v C:\Users\TOM\Desktop\redis.conf:/etc/redis/redis.conf -v /home/docker/redis/data:/data -d redis:latest redis-server /etc/redis/redis.conf --appendonly yes
参数解析:
参数名 | 作用 |
---|---|
docker | 调用docker命令启动容器 |
run | 启动某个容器 |
-p 6379:6379 | 将容器内的 6379 端口与宿主机的 6379 端口进行映射 |
–name iredis | 该容器的名字命名为 iredis |
-v 修改的配置文件路径 : Docker 中的配置路径 | 将本地的配置文件与 Docker 中的配置文件进行映射替换 |
-v 本地持久化保存文件路径 : Docker 中默认持久化路径 | 替换持久化保存路径 |
-d | 后台运行,不需要的可以删去该参数 |
redis:latest | 运行 redis 镜像中 TAG 为 latest 的镜像 |
redis-server /etc/redis/redis.conf | 默认启动参数,这里的配置文件已经在前面被我们替换为桌面上的配置文件 |
–appendonly yes | 开启 AOF 实现数据持久化 |
成功启动后结果如图
如果去掉 -d 参数,则执行结果如图:
到这里已经完成了 Windows 下的 Docker 容器部署 Redis 的工作,接下来是在宿主机中使用 RDM 软件和 Django 进行连接。
远程连接
RDM 连接数据库
首先安装我们的 RDM 软件,安装完成后进行连接。
参数解析
参数名 | 作用 |
---|---|
Name | 给当前的链接取名,随便输入一个你能看懂的即可 |
Host | Redis 所在的 IP,我们使用本地的 Docker 部署,因此填写宿主机的 IP,本地即为 127.0.0.1 也可以填写 localhost,二者等效 |
Port | Docker 容器映射的端口号,即命令提示符中 -p 参数填写的后一个端口号,由于我们示范使用的是 -p 6379:6379 ,因此填写6379,如果自行指定了其他端口,填写你指定的端口 |
auth | 填写配置文件中 requirepass 参数的密码 |
填写完毕后先点击下方的 Test Connection 进行链接测试,弹出成功页面后再点击 OK 进行连接保存。
在左侧就可以看到成功连接了 Redis 数据库。
Django 连接数据库
折腾了半天,终于可以连接数据库了,Django 支持使用 Redis 进行缓存,这里我们需要下载对应的第三方库进行 Redis 的连接。
# 直接下载 django-redis
pip install django_redis
# 通过豆瓣源加速下载
pip install -i https://pypi.douban.com/simple django_redis
安装完成后打开项目中的 setting.py 文件进行配置
# redis配置
CACHES = {
# 设置名为 default 的链接
"default": {
# 设置缓存功能
"BACKEND": "django_redis.cache.RedisCache",
# 设置 redis 的链接路径
"LOCATION": "redis://default:redis@localhost:6379/0", # 安装redis的主机的 IP 和 端口
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {
"max_connections": 1000,
"encoding": 'utf-8'
},
# 添加 redis 的密码
"PASSWORD": "redis"
}
}
}
配置完成后,使用 django 自带的 shell 进行测试
# 启动 Django 自带的命令行
python .\manage.py shell
启动后进行测试
# 导入 django-redis 库
from django_redis import get_redis_connection
# 使用 dafult 配置进行连接
con = get_redis_connection('default')
# 测试是否连接成功
con.ping()
# 测试成功结果
>>> con.ping()
True
Docker 部署 Python 镜像
Docker 拉取对应镜像版本
# 拉取 Python38 版本镜像
docker pull rackspacedot/python38
# 查看下载结果
docker ps -a
|CONTAINER ID|IMAGE|COMMAND|CREATED|STATUS|PORTS|NAMES|
|e5cedc7e1e2d|python:3.8|"python3"|21 hours ago|Exited (137)|20 hours ago|
# 新建镜像容器,并配置文件目录映射
docker run -it -p 宿主机端口:容器端口 -v 宿主机目录:容器目录 --name 自定义的名字 镜像名称:镜像tag
docker run -it -p 8080:8080 -v c:\Destop\DjangoCode:/Code --name Python_Django python:3.8
# 启动镜像容器
docker start Python_Django
# 进入容器的交互命令终端
docker exec -it 容器id /bin/bash
docker exec -it e5cedc7e1e2d /bin/bash
Docker 容器的连接
双向连接
通过 Docker 的 network 命令创建一个网络,并将所有的容器加入到该网络中,网络中的容器可以通过容器 ID 或是容器名直接进行访问,官方文档地址
# 创建容器网络
docker network create [OPTIONS] NETWORK
docker netword create ContainNetwork
# 将容器加入网络
docker network connect [OPTIONS] NETWORK CONTAINER
dokcer network connect ContainNetwork reids
单向连接
单项连接使用的是 Docker 较早的配置 --link 参数,未来可能废弃,请注意使用
# 连接容器A和容器B,只能A访问B,B无法访问A,需在创建容器时就指定需要连接的关系
docker run 容器A --link 容器B
docker run Python_Django --link redis --link mysql # 可单向连接多个容器
至此完成了所有需要配置的内容,需要协助的朋友可以发站内信或是邮件到 xmutzgc@outlook.com 有看到会回消息,最近工作比较忙可能不及时。