一、开发环境
建议读者在学习前,自行安装好宝塔上的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
运行结果:
打开 Linux的终端,安装 Django 库:
pip install django
在一个你喜欢得位置(比如/home/)创建新的 Django 项目:
django-admin startproject django_app
进入项目根目录:
cd django_app
然后迁移数据:
python manage.py migrate
准备工作就搞定了。
运行结果:
注意: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。
第三步:根据镜像生成容器并运行,容器名为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
运行效果:
这时你应该可以看到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网站已经上线了,恭喜你!
其他:
在宿主机出现
安装django包:
conda install django
效果:
注意:宿主机与容器只能运行其中一个,宝塔面板要开放端口