1.确保已经安装并配置好了 Docker

2.在 demo 项目的根目录中创建一个名为 Dockerfile 的文件,文件内容如下:

FROM python:3.9

# 设置 Python 环境变量
ENV PYTHONUNBUFFERED 1

# 安装 MySQL 客户端库
RUN apt-get update && apt-get install -y default-libmysqlclient-dev

# 创建项目目录并设置工作目录
RUN mkdir /app
WORKDIR /app

# 复制项目依赖文件并安装依赖
COPY requirements.txt /app/
RUN pip install -r requirements.txt

# 复制项目文件
COPY . /app/

# 设置环境变量
ENV DB_HOST=db
ENV DB_NAME=database_name
ENV DB_USER=user_name
ENV DB_PASSWORD=user_password

# 运行 Django 项目
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

该 Dockerfile 从 Python 3.9 镜像开始构建,设置了 PYTHONUNBUFFERED 环境变量,并将工作目录设置为 /app。然后安装依赖包并将整个项目复制到容器的 /app 目录中。

3.在项目根目录中创建一个名为 requirements.txt 的文件,并在其中列出所有 Django 项目的依赖项,例如:

Django==3.2.4
psycopg2-binary==2.8.6

可以根据项目需要添加或删除依赖项。
如果该项目依赖mysql,还需要创建一个 docker-compose.yml 文件,来定义如何启动 Docker 容器。
这个文件可以放在和 Dockerfile 文件相同的目录下:

version: '3'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: mysecretpassword
      MYSQL_DATABASE: database_name
      MYSQL_USER: user_name
      MYSQL_PASSWORD: user_password
    volumes:
      - db-data:/var/lib/mysql

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  db-data:

在这个配置文件中,我们定义了两个服务:db 和 app。db 服务使用 Docker Hub 上的 MySQL 8.0 镜像,并设置了一些环境变量和数据卷。app 服务使用你的 Django 镜像,并将容器的 8000 端口映射到主机的 8000 端口。同时,我们设置了一些环境变量,用于连接到 MySQL 数据库。最后,我们定义了一个数据卷,用于持久化 MySQL 数据库的数据。

在这个配置文件中,我们将 DB_HOST 环境变量设置为 db,这意味着 Django 容器将连接到 db 服务中的 MySQL 数据库。我们还设置了一些其他的环境变量,包括数据库名称、用户名和密码。这些环境变量将在 Django 容器启动时被传递给应用程序,以便它可以连接到 MySQL 数据库。

最后,我们定义了一个名为 db-data 的数据卷,它将 MySQL 数据库的数据持久化存储在本地主机上。这个数据卷可以确保即使 Docker 容器被删除或重新创建,数据库的数据也可以得到保留。

4.修改settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': '3306',
    }
}

5.使用以下命令来构建和运行 Docker 容器:

docker-compose up --build

6.进入容器

#进入docker-compose.yml文件所在目录
docker-compose exec web bash

或者:

docker exec -it <container_name> bash

执行:

python manage.py runserver 0.0.0.0:8000

7.在本地浏览器中输入 http://localhost:8000/ 访问的 Django 应用程序
在 docker inspect 命令的输出中,容器的IP地址可以在 Networks 字段下找到,其中 NetworkSettings.Networks 是容器的网络设置,IPAddress 则是容器的IP地址。
可以使用以下命令来获取容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <CONTAINER_NAME>

然后就可以使用 http://$IP:8000/ 来访问django了

docker-compose up --build 和 docker build 的区别如下:

docker-compose up --build 会构建并启动一个由 docker-compose.yml 文件定义的多个服务容器的应用程序。如果镜像不存在,docker-compose 会自动构建镜像。如果镜像已经存在,它将不会重复构建。此命令还会创建所需的网络和卷。

docker build 只会构建一个 Docker 镜像,并在当前目录中查找 Dockerfile。它不会启动容器,也不会创建网络或卷。

因此,如果要构建并启动一个多容器应用程序,应使用 docker-compose up --build。如果只需要构建一个 Docker 镜像,则应使用 docker build 命令。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐