第一步:配置Dockerfile
我们可以直接使用PyCharm自带的docker工具来创建dockerfile
但是请你记住,请把PyCharm自动生成的模版中的最后一行删掉,这会引发报错
ENTRYPOINT ["top", "-b"]
除了第一行代码比较有用以外,其他都没有什么作用,可以删掉
然后我们需要导入Python镜像,才能使用Python环境
FROM python:3.10-slim
如果Django版本不是特别古老的话,我建议使用3.10版本,-slim后缀的版本会自动配置好pip和环境变量
接下来,我们需要复制我们的项目文件
# 设置工作目录
WORKDIR /app
# 复制项目文件到容器中
COPY . /app/
也可以加上这行代码,但是实测没有效果,加不加都可以运行
# 设置环境变量
ENV PYTHONUNBUFFERED=1
然后就到了一个非常重要的环节,安装依赖库
为了方便,我们首先需要生成Python依赖文件requirements.txt
在终端执行以下指令,如果有虚拟环境,请在虚拟环境中执行:
pip freeze > requirements.txt
为了防止因为pip版本问题导致库安装失败,我们需要在dockerfile中写入:
#配置安装依赖
RUN python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
如果自己身在国内,强烈建议加上清华镜像源
然后我们在dockerfile中写入:
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
(另外,一般情况下,配置文件时用RUN命令来写希望运行的指令,在启动项目时,使用CMD来写希望运行的指令)
由于docker容器中的网络和宿主机的网络是分离的,所以我们需要dockerfile里加上一下代码,用于暴露端口:
#暴露8000端口
EXPOSE 8000
当然,我们在运行命令docker run后面也要加上-p参数来指定暴露端口到宿主机的位置,如:
docker run -it -p 127.0.0.1:9999:8080 [docker镜像的ID]
如果使用PyCharm自带的docker去构建运行运行时,需要更改dockerfile的运行配置,如图:
然后我们需要编写项目的启动命令,一般情况如下:
#运行项目
CMD python manage.py runserver 0.0.0.0:8000
(当然也可以用方括号的方式表示指令,这两者的运行效果是相同的)
如果你的项目使用了celery来实现异步或定时任务,可以使用&来隔开两个指令,达到同时运行两个指令的效果,如下:
#运行项目
CMD python manage.py runserver 0.0.0.0:8000 & celery -A ZSR_Token worker -l INFO & celery -A ZSR_Token beat -l info
(但是不建议在这里同时运行Redis服务,我自己实测没有成功,安装Redis始终都是失败的)
(另外,如果你的Django项目中使用了SQLite数据库,你无需为其专门配置,关闭容器后数据页不会丢失,这基本上可以满足你的基本需求,特殊情况另说)
第二步:关于Redis的特殊配置方法,使其与Django分别运行在两个不同的容器里
需要创建docker-compose.yml文件
在文件中写入以下代码:
# 使用 Compose 文件格式的第三版
version: '3'
# 定义两个服务:web 和 redis
services:
# web 服务是 Django 项目
web:
# 使用当前目录下的 Dockerfile 构建镜像
build: .
# 将容器的 8000 端口映射到主机的 8000 端口
ports:
- "8000:8000"
# 指定 web 服务依赖于 redis 服务,确保 redis 服务先启动
depends_on:
- redis
# redis 服务是 Redis 数据库
redis:
# 使用官方的 Redis 镜像
image: "redis:alpine"
# 将容器的 6379 端口映射到主机的 6379 端口
ports:
- "6379:6379"
# 设置映射,给Django连接
container_name: redis
请注意上面代码示例中的代码:
container_name: redis
这行代码非常重要,用于Django和Redis互相通信
然后,请在setting.py中更改Redis的路径,下面以celery的配置作为演示:
未使用docker时的Redis配置:
# celery配置内容
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://127.0.0.1:6379/0')
# 存储结果后端
CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://127.0.0.1:6379/7')
使用docker后的Redis配置:
# celery配置内容,在docker中使用
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://redis:6379/0')
# 存储结果后端
CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://redis:6379/7')
也就是说,我们把原来Redis的IP地址改成了container_name所定义的变量,即:
redis://127.0.0.1:6379/0
改为:
redis://redis:6379/0
这个方法在针对其他需要使用Redis的服务中也同样有效
第三步:构建镜像
请在此之前先启动Docker Desktop (仅限Windows系统)
以docker-compose.yml文件构建镜像命令:
docker-compose build
如果你希望使用PyCharm自带的docker去构建时,请点击行号上的图标。
如果你希望把这个镜像推送到Docker Hub 或其他 Docker 镜像仓库,请使用以下命令:
docker-compose push
以dockerfile文件构建镜像命令:
docker build -t [你想设置的镜像名称]:[版本号,如1.0] . #千万不要漏掉这个点!!!
如果使用PyCharm自带的docker去构建运行运行时,需要更改dockerfile的运行配置,如图:
第四步:运行镜像
请在终端执行以下指令:
docker run -it -p 127.0.0.1:[映射的宿主机端口]:[容器端口] [镜像ID]
(注:以docker-compose.yml文件构建镜像后会自动运行。如果镜像由外部导入,请分别运行每个所需的镜像)
(另外,如果需要暴露多个端口,请使用多个-p参数)
如果使用PyCharm运行,请根据图标指引运行
第五步:导出本地镜像
为了使别人更方便的使用网站,我们需要把本地镜像导出,发给别人
docker导出本地镜像由两种方法,这里只推荐save方法。因为export命令在第二台电脑运行时还需要附带指令,十分麻烦,更容易出现奇奇怪怪的问题。
请在终端执行命令:
docker save [镜像ID] > [随便一个文件名称].tar
其次,save还可以把多个镜像导出为一个文件,命令如下:
docker save -o [导出的文件名称].tar [第一个镜像的名称,即REPOSITORY里的内容]:[第一个镜像的版本号,即TAG里的内容] [第二个镜像名称]:[第二个镜像版本号] [...]:[...]
第六步:导入本地tar镜像
执行命令:
docker load < [文件名称].tar
如果你想运行导入的镜像,方法同第四步。