Sign inSign up

d10g/django-blog

By d10g

•Updated about 3 years ago

A Simple Blog App Example Using Django + sqlite3

Image
Web servers
0

59

d10g/django-blog repository overview

⁠使用 Django 开发一个简单的 Blog 程序

资料:

https://www.w3schools.com/django/index.php⁠

⁠一、Blog 程序 已在 Windows 中 PyCharm 完成开发,数据库使用 sqlite3

打开CMD,切换到项目根目录,即 manage.py 所在路径,使用pip freeze > requirements.txt生成 requirements.txt 文件。

使用绑定挂载开发测试:docker run -dp 8000:8000 -w /app -v "%cd%:/app" python:3.10 sh -c "pip install --upgrade pip && pip install -r requirements.txt && python3 manage.py runserver 0.0.0.0:8000"

⁠二、构建 Docker 镜像

⁠.dockerignore
  • 在 docker CLI 将上下文发送到 docker 守护进程之前,它会在上下文的根目录中查找一个名为 .dockerignore 的文件。如果此文件存在,CLI 会修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将大型或敏感文件和目录发送到守护程序。
  • 这是一个示例 .dockerignore 文件:
# comment
*/venv
*/temp*
*/*/temp*
temp?
  • 由于在 PyCharm 中的 venv文件夹不与 manage.py 在同一级目录,因此不需要添加 .dockerignore 文件
⁠Dockerfile
  • Docker 可以通过读取 Dockerfile 中的指令(instruction)来自动构建镜像,Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用以组装镜像的所有命令。
  • Docker 是按顺序在 Dockerfile 中运行指令,Dockerfile 必须以 FROM 指令开头,FROM 指令指定您正在构建的父镜像,注释 ( #) 和指令(例如RUN) 之前的前导空格会被忽略,但不鼓励使用。一个 Dockerfile 中只能有一个 CMD 指令。如果您列出多个 CMD,则只有最后一个 CMD 才会生效。
  • 在 PyCharm 项目中与 manage.py 同级目录下创建 Dockerfile 文件,内容如下
# syntax=docker/dockerfile:1
FROM python:3.10
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]

Dockerfile 从 Python 3 父镜像开始。通过添加新的 code 目录来修改父镜像。通过安装 requirements.txt 文件中定义的 Python 要求进一步修改父镜像。

Dockerfile 包含以下指令:

  • FROM 指令初始化一个新的构建阶段并为后续指令设置基本镜像。
  • ENV 指令将环境变量 <key> 设置为值 <value>。 与命令行解析一样,引号和反斜杠可用于在值中包含空格。
  • WORKDIR 指令为 Dockerfile 中任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。
  • COPY 指令从 <src> 复制新文件或目录,并将它们添加到路径 <dest> 的容器文件系统中。
  • RUN 指令将在当前镜像之上的新层中执行任何命令并提交结果。生成的提交镜像将用于 Dockerfile 中的下一步。
  • CMD 指令的主要目的是为执行容器提供默认值。
  • 在某些平台 (Windows 10) 上,您可能需要在 settings.py 内部进行编辑并将 Docker 主机名或 IP 地址添加到 ALLOWED_HOSTS 列表中。出于演示目的,您可以将值设置为:ALLOWED_HOSTS = ['*'],这个值对于生产使用是不安全的。

  • 构建镜像

docker build --tag django-blog .

  • 运行容器

docker run -dp 8000:8000 django-blog

-d: 这个选项表示以后台(detached)模式运行容器,即在后台运行容器并立即返回控制台。

-p <host_port>:<container_port>:这个选项指定了一个端口映射规则,将容器内的 <container_port> 映射到宿主机的 <host_port>。这样一来,宿主机上的服务就可以通过 <host_port> 访问到容器内的服务。

  • 如果有Bind for 0.0.0.0:8000 failed: port is already allocated.报错,运行docker container ls找到CONTAINER ID值,结束掉该容器docker stop 5a831d354744

⁠三、共享应用程序(即推送 Docker 镜像到 Docker Hub)

⁠1. 创建一个 repo
  • 登录 Docker Hub 网页,单击 Create repository 按钮。对于 repo 名称,使用 django-blog。确保 Visibility(可见性) 为 Public。
  • 创建成功后您可以看到一个 Docker 命令示例 docker push d10g/django-blog:tagname。此命令将 Docker 镜像推送到此 repo。
⁠2. 推送 Docker 镜像
  • 使用 CLI 登录 Docker Hub

docker login -u d10g

  • 使用该 docker tag 命令为 django-blog 镜像指定一个新名称

docker tag django-blog d10g/django-blog:v2023.6.30

  • 推送命令,如果你不指定 tagname ,Docker 将使用一个名为 latest 的标签名

docker push d10g/django-blog:v2023.6.30

⁠四、在新实例上运行镜像

  • 删除之前推送的镜像,并在终端中,启动新推送的应用程序。

docker run -dp 8000:8000 --name django-blog d10g/django-blog:v2023.6.30

注:Import JSON Data 的口令是 123456,后台登录的用户名和密码都是 admin

Tag summary

Content type

Image

Digest

sha256:3f4d1fbe4…

Size

351.7 MB

Last updated

about 3 years ago

docker pull d10g/django-blog:v2023.6.30