docker 部署django服务

前期准备
操作服务器:centos7.9

软件安装

  • Docker:学习 Docker 当然要安装 Docker 软件了(免费的社区版),安装方法见官方文档(推荐),或者我的博文docker 安装
  • Docker-compose:这是 Docker 官方推出的用于编排、运行多个容器的工具,安装方法见官方文档(推荐),或者我的博文docker-compose 安装。本教程大部分内容都与它有关。
  • Python3:教程部署的是 Django 项目,若是在服务器本地创建则需要 Python3(包括 python 的包管理工具 pip),若Django项目已经有了,可以上传到你要部署的指定目录下,可以不用在本地上安装python3。

创建 Django 项目
(若有个人其他的django服务,也可以直接拿来部署)

  • 安装django依赖库
$ pip install django
  • 可以创建一个目录,进入目录中创建django项目
$ mkdir /opt/project
$ cd /opt/project

$ django-admin startproject django_app
  • 进入项目根目录
cd django_app
  • 然后迁移数据:
$ python manage.py makemigrations
$ python manage.py migrate

以上,准备工作就搞定了。

用Docker构建项目

1、确认 Docker 已经正确安装了,运行以下指令:

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
...
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
...

Hello from Docker!
This message shows that your installation appears to be working correctly.

终端将打印出如上图所示的欢迎语句。docker run hello-world 指令的含义是:用名称为 hello-world 的镜像构建一个容器并运行。如果本地上没有这个 hello-world 的镜像, Docker 会自动从仓库搜索并下载同名的镜像。

2、用 docker images 查看本地已有的镜像

$ docker images

REPOSITORY      TAG        IMAGE ID           CREATED           SIZE
hello-world     latest     fce289e99eb9       9 months ago      1.84kB

表列分别为镜像名、版本、ID 号、创建时间、大小。

3、查看本地已有的容器:

$ docker ps -a

CONTAINER ID   IMAGE        ..   CREATED         ..
38cb03a96dca   hello-world  ..   2 minutes ago   ..

4、其他基础指令

docker rmi [images ID]  # 删除此 ID 的镜像
docker container stop [container ID]  # 停止此 ID 的容器
docker container start [container ID]  # 启动此 ID 的容器
docker container rm [container ID]  # 删除此 ID 的容器

正式部署django服务
1、进入django项目的根目录(与manage.py同级),生成requirements.txt依赖清单

$ pip freeze > requirements.txt

2、Dockerfile

创建并编写Dockerfile(django根目录下)

# 从仓库拉取 带有 python 3.7 的 Linux 环境
FROM python:3.7

# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1

# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code
# 更新 pip
RUN pip install pip -U
# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt /code/
# 安装库
RUN pip install -r requirements.txt
# 将当前目录复制到容器的 code 目录
ADD . /code/
  • 理解这些 Docker 指令的关键在于,一定要牢记容器里的环境和外界(宿主机)是隔离的,它两是完全不一样的。换句话说,要搞清楚哪些操作是针对宿主机、哪些操作是针对容器。
  • FROM python:3.7 指令从仓库拉取一个包含 python 3.7 的 Linux 操作系统环境(Linux 版本为 Debian)。
  • RUNWORKDIR 指令都是针对容器的,功能是在容器里创建目录、并将其设置为工作目录。注意宿主机是没有这个目录的。
  • ADD 指令出现了两次。ADD requirements.txt /code/ 意思是将宿主机当前目录(即 Dockerfile 所在目录)的 requirements.txt 文件复制到容器的/code目录中。ADD . /code/意思是把当前目录所有内容复制到容器/code/目录,注意中间那个点。

3、Docker-compose
确认 docker-compose 是否安装成功

$ docker-compose -v
docker-compose version 1.24.1, build 4667896b

项目根目录创建 docker-compose.yml 并写入

version: "3"
services:
  app:
    restart: always
    build: .  # '点'代表当前目录
    command: "python3 manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
  • version 代表 docker-compose.yml 的版本,目前最新版为 3,不需要改动它。

其中定义了一个名叫 app 的容器。后面的内容都是 app 容器的相关配置:

  • restart :除正常工作外,容器会在任何时候重启,比如遭遇 bug、进程崩溃、docker 重启等情况。

  • build :指定一个包含 Dockerfile 的路径,并通过此 Dockerfile 来构建容器镜像。注意那个 "." ,代表当前目录。

  • command :容器运行时需要执行的命令。这里就是我们很熟悉的运行开发服务器了。

  • volumes :卷,这是个很重要的概念。前面说过容器是和宿主机完全隔离的,但是有些时候又需要将其连通;比如我们开发的 Django 项目代码常常会更新,并且更新时还依赖如 Git 之类的程序,在容器里操作就显得不太方便。所以就有卷,它定义了宿主机和容器之间的映射:"." 表示宿主机的当前目录,":" 为分隔符,"/code" 表示容器中的目录。即宿主机当前目录和容器的 /code 目录是连通的,宿主机当前目录的 Django 代码更新时,容器中的 /code 目录中的代码也相应的更新了。这有点儿像是在容器上打了一个洞,某种程度上也是实用性和隔离性的一种妥协。

  • ports :定义了宿主机和容器的端口映射。容器的隔离不止环境,甚至连端口都隔离起来了。但 web 应用不通过端口跟外界通信当然不行,因此这里定义将宿主机的 8000 端口映射到容器的 8000 端口,即访问宿主机的 8000 端口就是访问到了容器的 8000 端口,但要确保端口没有被其他程序占用。

(注:如果你是在虚拟机里部署,想要让外部可以访问的话,可以将runserver 0.0.0.0:8000改成runserver [虚拟机IP]:8000runserver 0:8000。记得开发防火墙指定端口,或直接把防火墙关掉!!!)

5、以上完成后,目录结构为:

django_app
  - docker-compose.yml
  - Dockerfile
  - requirements.txt
  - manage.py
  - django_app
  - db.sqlite3

6、启动容器服务

$ docker-compose up

7、打开浏览器,输入本地 IP 端口 127.0.0.1:8000,就可以查看到相关页面或路由了
django_web

8、按 Ctrl + C 即可停止开发服务器运行。

9、停止服务器后实际上容器还存在,只是停止运行了而已。删除容器输入:

$ docker-compose down

10、想后台运行容器,输入:

$ docker-compose up -d

11、如果你需要重新构建镜像,则输入命令:

$ docker-compose build

12、启动和停止已有的容器:

$ docker-compose start
$ docker-compose stop

13、docker删除镜像

docker image rm [镜像id]

完成!!!

内容转载:Docker-Django本地部署

posted @ 2024-08-16 15:48  二月雪  阅读(14)  评论(0编辑  收藏  举报