第一步

切换yum源:

第二步

1. 安装docker

2. 安装docker-compose

第三步

1. 把项目放到服务器上

比如: 在 home 目录下建一个 wwwroot文件夹,把项目放在里面

2. 在项目根目录下建 Dockerfile 文件

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

# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1

# 添加这两行
RUN apt-get update  
RUN apt-get install python3-dev default-libmysqlclient-dev -y 

# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code
# 更新 pip
RUN pip install pip -U -i https://mirrors.aliyun.com/pypi/simple/
# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt /code/
# 安装库 并使用阿里源安装
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 将当前目录复制到容器的 code 目录
ADD . /code/

名称

说明

FROM python:3.7

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

RUNWORKDIR

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

ADD requirements.txt /code/

意思是将宿主机当前目录(即 Dockerfile 所在目录)的 requirements.txt 文件复制到容器的 /code 目录中

ADD . /code/

把当前目录所有内容复制到容器 /code/ 目录,注意中间那个

3.在项目根目录下建 docker-compose.yml 文件

version: "3"

services:
  app:
    restart: always
    build: .
    command: bash -c "python3 manage.py collectstatic --no-input && python3 manage.py migrate && gunicorn --timeout=30 --workers=4 --bind :8000 django_app.wsgi:application"
    volumes:
      - .:/code
      - static-volume:/code/collected_static
    expose:
      - "8000"
    depends_on:
      - db
    networks:
      - web_network
      - db_network
  db:
    image: mysql:5.7
    volumes:
      - "./mysql:/var/lib/mysql"
    ports:
      - "3306:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=your_password
      - MYSQL_DATABASE=your_database
    networks:
      - db_network
  nginx:
    restart: always
    image: nginx:latest
    ports:
      - "8000:8000"
    volumes:
      - static-volume:/code/collected_static
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - app
    networks:
      - web_network

networks:
  web_network:
    driver: bridge
  db_network:
    driver: bridge

volumes:
  static-volume:

名称

说明

version

代表 docker-compose.yml 的版本,目前最新版为 3

restart

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

build

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

command

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

volumes

卷,这是个很重要的概念。宿主机和容器目录的映射。

ports

定义了宿主机和容器的端口映射;宿主机端口映射到本容器的端口 (宿主机:容器)

depends_on

意思是此容器需要等待 db 容器启动完毕才能够启动

image

从仓库拉取 MySQL 5.7镜像。可以自己定版本

environment

定义容器的环境变量,设置了 MySQL 的 root 用户的密码、数据库的名称。

your_password

你的数据库密码

your_database

你的数据库名称

4.修改Django的setting.py中配置

......
DEBUG = False
ALLOWED_HOSTS = ['*']
......
#数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_app',
        'USER': 'root',
        'PASSWORD': 'mypassword',
        'HOST': 'db', #注意 HOST 填写的是docker容器的名称,即 db 
        'PORT': '3306',
        'OPTIONS': {'charset': 'utf8'},
    }
}
......
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static') #不加这个,将无法访问静态文件
STATIC_URL = '/static/'

注意:请先确认没有其他程序占用了 3306 端口,比如宿主机安装的 MySQL。

5.运行docker

docker-compose up

等待安装环境…

docker下部署python环境 docker 部署 django_docker

第四步修改nginx (注意:前后端分离项目)

1.在项目根目录下新建文件夹

yum install nginx  #安装nginx

mkdir config    

cd config

mkdir nginx

2.进入容器nginx的目录

cd config/nginx/

3.编辑你的前端项目配置

vi your_name.conf

your_name.conf 是自己随便取的名字,只要是xxx.conf就行

upstream your_domain_name {
  ip_hash;
  server app:8000;
}

server {
  listen 8000;
  server_name localhost;

  location /static/ {
    autoindex on;
    alias /code/collected_static/;
  }

  location / {
    proxy_pass http://your_domain_name/;
  }
}

名称

说明

your_domain_name

你的域名,如果没有域名就用app

app

docker-compose中django项目定义的容器名字

保存退出编辑;

1.执行: nginx -s reload 重启nginx就好了
2.进入项目根目录 执行 docker-compose up (或者docker-compose up -d)

docker额外命令:

#docker容器停止运行:
docker-compose down

#docker容易后台运行
docker-compose up -d

#docker重构镜像
docker-compose build