一、开发环境

建议读者在学习前,自行安装好宝塔上的docker插件。

二、软件安装

  • Docker:学习 Docker 当然要安装 Docker 软件了(免费的社区版),安装方法见官方文档
  • Docker-compose:这是 Docker 官方推出的用于编排、运行多个容器的工具,安装方法见官方文档。本教程大部分内容都与它有关。
  • Python3:教程部署的是 Django 项目,那 Python3 是当然要有的了(包括 python 的包管理工具 pip)。

 三、创建 Django 项目

创建虚拟环境:

conda create --name myenv

把好几个服务放在一个容器里_腾讯云

四、激活自己创建的虚拟环境

cd /home/anconda3/envs/myenv

source activate myenv

运行结果:

把好几个服务放在一个容器里_把好几个服务放在一个容器里_02

打开 Linux的终端,安装 Django 库:

pip install django

在一个你喜欢得位置(比如/home/)创建新的 Django 项目:

django-admin startproject django_app

进入项目根目录:

cd django_app

然后迁移数据:

python manage.py migrate

准备工作就搞定了。

运行结果:

把好几个服务放在一个容器里_腾讯云_03

注意:Django默认ALLOWED_HOSTS = []为空,在正式部署前你需要修改settings.py, 把它设置为服务器实际对外IP地址,否则后面部署会出现错误,这个与docker无关。即使你不用docker部署,ALLOWED_HOSTS也要设置好的。

五、Dockerfile

第一步:编写Dockerfile,内容如下:

Docker 允许通过文本格式的配置文件来构建镜像,默认名称为 Dockerfile。因此在项目根目录新建文件 Dockerfile,写入:

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

# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1

# 添加 Debian 清华镜像源
RUN echo \
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\
    > /etc/apt/sources.list

# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code
# 添加 pip 清华镜像源
RUN pip install pip -U -i https://pypi.tuna.tsinghua.edu.cn/simple
# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt /code/
# 安装库,添加 pip 清华镜像源
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 将当前目录复制到容器的 code 目录
ADD . /code/

理解这些 Docker 指令的关键在于,一定要牢记容器里的环境和外界(宿主机)是隔离的,它两是完全不一样的。换句话说,要搞清楚哪些操作是针对宿主机、哪些操作是针对容器

FROM python:3.7 指令从仓库拉取一个包含 python 3.7 的 Linux 操作系统环境。

RUN 和 WORKDIR 指令都是针对容器的,功能是在容器里创建目录、并将其设置为工作目录。注意宿主机是没有这个目录的。

ADD 指令出现了两次。ADD requirements.txt /code/ 意思是将宿主机当前目录(即 Dockerfile 所在目录)的 requirements.txt 文件复制到容器的 /code 目录中。ADD . /code/ 意思是把当前目录所有内容复制到容器 /code/ 目录,注意中间那个

目前项目依赖的唯一库就是 Django,所以在项目根目录创建 requirements.txt 并写入:

django==2.2.3

前面不是已经安装过 Django 了吗,为什么这里还要安装?原因是前面是在宿主机安装的,容器里是没有 Django 的!

所以目前的文件结构如下:

django_app
  - Dockerfile
  - requirements.txt
  - manage.py
  - django_app
  - db.sqlite3

第二步:使用当前目录的 Dockerfile 创建镜像,标签为 django_docker_img:v1。

进入Dockerfile所在目录,输入如下命令:

# 根据Dockerfile创建名为django_docker_img的镜像,版本v1,.代表当前目录
 sudo docker build -t django_docker_img:v1 .
 
 # 查看镜像是否创建成功, 后面-a可以查看所有本地的镜像
 sudo docker images

这是你应该可以看到有一个名为django_docker_img的docker镜像创建成功了,版本v1。

把好几个服务放在一个容器里_docker_04

第三步:根据镜像生成容器并运行,容器名为mysite1, 并将宿主机的8000端口映射到容器的8000端口。
步骤一:docker提供了数据持久化的方式,让docker内数据修改更加便利,容器创建的时候做好目录映射,直接修改宿主机文件,容器内的文件会相应变化。

步骤二:当我们修改容器内的/code文件夹时,直接修改宿主机/root/django_app配置即可

docker run -v <宿主机路径>:<容器路径> <镜像名称>
# 如成功,根据镜像创建mysite1容器并运行。宿主机8000:容器8000。-d表示后台运行。
 sudo docker run -it -d --name mysite1 -p 8000:8000 -v /root/django_app:/code django_docker_img:v1
 
 # 查看容器状态,后面加-a可以查看所有容器列表,包括停止运行的容器
 sudo docker ps
 
 # 进入容器,如果复制命令的话,结尾千万不能有空格。
 sudo docker exec -it mysite1 /bin/bash

运行效果:

把好几个服务放在一个容器里_centos_05

这时你应该可以看到mysite1容器开始运行了。使用sudo docker exec -it mysite1 /bin/bash即可进入容器内部。

第四步:进入容器内部后,执行如下命令

python3 manage.py makemigrations
 python3 manage.py migrate
 python3 manage.py runserver 0.0.0.0:8000

这时你打开Chrome浏览器输入http://your_server_ip,你就可以看到你的Django网站已经上线了,恭喜你!

其他:

在宿主机出现

把好几个服务放在一个容器里_centos_06


安装django包:


conda install django

效果:

把好几个服务放在一个容器里_docker_07

注意:宿主机与容器只能运行其中一个,宝塔面板要开放端口