Django打包Docker镜像详解

第一步:配置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

如果你想运行导入的镜像,方法同第四步。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值