当前位置:   article > 正文

Docker教程一之部署 django 项目_怎样用docker部署django项目

怎样用docker部署django项目

1. 介绍

  1. docker 和 virtualenv的区别:

virtualenv 创建的虚拟环境只是隔离了 Python 运行虚拟环境,允许不同的项目可以通过不同版本的程序包来运行,解决包依赖的问题。而 docker 的每个容器都是独立的,可以看做一个个小的 Linux 系统,每个容器之间由 docker 分配有独立的ip地址,并且容器之间相互隔离的更加彻底。

  1. docker 镜像 imagine 和容器 contains的关系

容器是镜像创建运行的实例,镜像是一个文件,容器是镜像的一个进程。可以将两者的关系看作是 python 的类和实例化对象

  1. docker 启动流程
    1. 创建镜像: docker pull
    2. 创建容器: docker run
    3. 进入容器:docker exec -it
  2. 宿主机和容器之间的通信

宿主机指的就是安装 docker 的系统(比如我们的电脑),有自己独立的 IP 和系统。容器有 docker 分配的ip地址。两者通过 docker ccp来进行通信

2. 安装

2.1 安装桌面版

我使用的是 docker 的桌面版,可以看做是可视化软件。以下是网址。按照自己的电脑来进行下载。
Download Docker Desktop | Docker
我以 Mac 电脑、docker desktop v4.11.0为例,下载完成以后可以看到以下画面
image.png

2.2 换源

我们默认下载东西的网址比较慢,可以通过换国内的网址源来达到加速的效果。

  1. 右上角点击⚙️图标进入 setting–>docker engine
  2. 将框里面的内容替换成我们的源,再点击右小角的Apply&Restart
{
  "debug": true,
  "experimental": false,
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

image.png

  1. 终端输入 docker info,最底部可以看到以下信息,就表示切换成功
 Registry Mirrors:
  https://docker.mirrors.ustc.edu.cn/
  https://hub-mirror.c.163.com/

  • 1
  • 2
  • 3
  • 4

3. 镜像

3.1 编写 dockerfile 文件

在需要部署的 django 目录下,新建一个Dockerfile文件。这个文件的作用相当于把多个需要执行的命令放在一个文件中,当创建镜像的时候 docker 会在当前目录自动寻找Dockerfile文件,再挨个执行里面的命令

# 从 docker 中拉取Python镜像的版本
FROM python:3.7

#镜像作者
MAINTAINER Songzi

#设置虚拟环境变量
ENV PYTHONUNBUFFERED 1

# 将 pip 源设置为国内的源
COPY pip.conf /root/.pip/pip.conf

# 在容器的指定目录下面创建项目的文件夹
RUN mkdir -p  /Code/BookPro

#设置容器的工作目录(也就是当前的 django 的位置)
WORKDIR /Code/BookPro

#使用 pip 安装依赖
RUN pip install -r requirements.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  1. 设置容器:RUN mkdir -p /Code/BookProWORKDIR /Code/BookPro都是在容器,也就是 docker 中创建的。前者是创建一个文件夹来放我们的项目,后者是指定项目的主目录。
  2. 设置 pip源(非必须):创建一个 pip.conf 文件(因为我们在 docker desktop 里面已经替换过镜像源了,所以这条可写可不写)
[global]
#国内源网址
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
#信任该域名,防止出现报错
trusted-host=mirrors.aliyun.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

目前我们的项目结构是这样的:
image.png

3.2 创建镜像

编写好Dockerfile以后,我们就可以开始创建镜像了。

# 进入django 目录
cd BookPro

sudo docker build -t book_img:v1 .
  • 1
  • 2
  • 3
  • 4
  1. sudo:提权,防止因为权限不够而报错
  2. docker build:创建镜像
  3. -t book_img:v1:设置镜像的名称为 book_img,版本为 v1
  4. .表示在当前目录下寻找Dockerfile文件

当我们输入以后,docker 会在当前目录下面自动寻找Dockerfile,并且依此的执行里面的命令。
image.png

(如果有遇到报错failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 3.7]: 403 Forbidden,则表示没有Python 的镜像,我们可以通过 docker pull先拉取 Python3.7 以后再进行镜像的创建。)

3.3 查看镜像

  1. 命令行查看:如果出现以上的内容,则表示 docker 镜像创建完成,我们可以通过docker images查看当前有哪些镜像。
    1. REPOSITORY:镜像名称
    2. TAG:版本
    3. IMAGE ID:镜像的 id,也是唯一的标识
    4. CREATED:创建时间
    5. SIZE:镜像大小

image.png

  1. docker desktop 桌面版查看

image.png

4. 容器

4.1 生成容器

sudo docker run -it -d --name book_pro -p 8000:8000 -v /Users/songzi/Code/BookPro:/Code/BookPro book_img:v1
  • 1
  1. sudo docker run:生成容器
  2. -it:-i表示以交互模式运行容器,-t表示为容器分配一个伪终端
  3. -d:创建容器以后自动运行(否则创建完成以后还需要通过 docker start book_pro来启动容器)
  4. –name:设置容器的名字,不指定的话 docker 将会为其分配一个随机名称
  5. -p:映射终端,将宿主机的 8000 端口映射到容器的 8000 中。这样当你在宿主机(比如当前电脑上)访问 8000,将会自动转到 book_pro 这个容器中
  6. -v:文件映射,会将我们宿主机/Users/songzi/Code/BookPro目录下的所有内容映射到容器的/Code/BookPro中。实现了文件共享
  7. book_img:v1:指定是从哪个镜像创建出来的容器

4.2 查看容器

  1. 命令行查看:可以通过docker ps 或者 docker ps -a命令行来查看,两者的区别在于-a会将停止的容器也会显示出来

image.png

  1. CONTAINER ID:容器 id

  2. IMAGE:镜像来源

  3. COMMAND:备注

  4. CREATED:创建时间

  5. STATUS:容器状态

  6. PORTS:映射端口关系

  7. NAMES:容器名称

  8. 通过 docker desktop 查看:

image.png

4.3 进入容器

到目前为止基本步骤都已经完成,我们只需要进入容器,然后就可以像操作正常终端一样启动容器即可。

docker exec -it book_pro /bin/bash
  • 1

image.png

  1. docker exec:进入 docker
  2. -it book_pro:需要进入的容器名称

4.4 启动 django

我们可以看到进入容器以后显示的目录为/Code/BookPro,也就是我们创建镜像时设置的目录。我们再通过ls查看目录,发现我们的 django 项目都在里面了。
image.png

然后我们就可以通过python manage.py runserver 0.0.0.0:8000来启动这个 django 项目了
image.png

此时我们在浏览器中输入 127.0.0.1:8000,就可以查看到当前项目啦!
image.png

(同时,因为我们采用的是文件路径映射的方式,所以当我们在本地修改 django 目录时,docker 中的容器也会自动同步哦。解决了 docker 容器和本地代码不同步的问题,实现了文件共享。)

是不是还不明白其中的原理,让我来一一解释:
一、怎么在宿主机和容器中实现文件共享?

  1. 首先 docker 创建book_img 镜像时,会通过RUN mkdir -p /Code/BookPro创建一个/Code/BookPro文件夹
  2. 然后,我们在创建容器时-v /Users/songzi/Code/BookPro:/Code/BookPro的命令会从我们本地宿主机中拉取文件过来
  3. 所以我们就能实现本地文件和容器的共享了,这样有个最大的好处就是当你在本地的 pycharm 中修改了代码,docker 会自动更新

二、为什么输入 127.0.0.1:8000 可以访问到容器的项目:

  1. 因为我们做了端口的映射,也就是创建容器时设置的-p 8000:8000。当我们访问宿主机本地的 IP127.0.0.1:8000时,我们会监测到 8000端口。将其转到我们 docker 容器的 8000中。所以访问的实际是我们 docker 中的链接
  2. 而我们在容器中启动 django 时,设置的 0.0.0.0就是为了最大的兼容宿主机的 IP 地址。

5. 常用命令

5.1 镜像

# 查看所有镜像
docker images

# 删除镜像 -f 强制删除
docker rmi [-f] image[,image...]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5.2 容器

# 查看启动容器
docker ps

# 查看所有容器
docker ps -a

# 启动容器
docker start 容器名称

# 停止容器
docker stop 容器名称

# 删除容器
docker rm 容器名称

# 查看容器 IP
sudo docker inspect book_pro | grep "IPAddress"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/553618
推荐阅读
相关标签
  

闽ICP备14008679号