
示例工程【免费下载链接】awesome-composeAwesome Docker Compose samples项目地址https://gitcode.com/gh_mirrors/aw/awesome-compose点击查看免费下载本指南完整演示如何使用 Docker Compose 编排并运行一个 Django PostgreSQL 应用从编写Dockerfile、requirements.txt与docker-compose.yml到通过docker compose run生成 Django 项目、连接 PostgreSQL 数据库、启动开发服务器并优雅地停用清理。读完本文你将掌握 Compose 双服务web db编排的核心套路并能对照本仓库中的真实样例官方快速入门文档与 awesome-compose 的 Django 样例立即落地实践。前置条件安装 Docker Compose本指南假设你已经安装好 Docker Compose现代 Docker Desktop 与 Docker Engine 均内置docker compose插件命令。若尚未安装请参考官方安装指引完成安装。文档中所有命令均以docker compose新版插件语法为准老版本用户可使用等效的docker-compose形式。定义项目组件三个关键文件启动一个 Compose Django 项目你需要准备三个文件Dockerfile镜像构建定义、requirements.txtPython 依赖清单、docker-compose.yml或docker-compose.yaml服务编排定义两种扩展名均可。创建一个空的项目目录该目录将作为应用镜像的构建上下文build context。此目录只应包含构建该镜像所需的资源避免将无关文件带入镜像构建过程。编写 Dockerfile在项目目录中创建Dockerfile内容如下# syntaxdocker/dockerfile:1 FROM python:3 ENV PYTHONDONTWRITEBYTECODE1 ENV PYTHONUNBUFFERED1 WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/这个Dockerfile基于 Python 3 官方基础镜像通过四条指令完成定制ENV PYTHONDONTWRITEBYTECODE1禁止 Python 在运行时生成__pycache__字节码文件避免容器文件系统中出现不必要的缓存文件ENV PYTHONUNBUFFERED1关闭 stdout/stderr 缓冲让日志实时输出到 Docker 日志流便于docker compose logs与docker compose up前台跟踪调试WORKDIR /code将容器工作目录切换为/codeCOPY requirements.txt /code/配合RUN pip install -r requirements.txt先复制依赖清单并安装充分利用 Docker 层缓存——只要requirements.txt不变后续重建镜像时这一层不会失效COPY . /code/最后才复制项目源码这是“依赖先行、源码在后”的经典分层策略。仓库样例中的进阶版 Dockerfile本仓库 django/app/Dockerfile 提供了另一个带多阶段构建与开发环境增强的版本核心思路一致但更精细# syntaxdocker/dockerfile:1.4 FROM --platform$BUILDPLATFORM python:3.7-alpine AS builder EXPOSE 8000 WORKDIR /app COPY requirements.txt /app RUN pip3 install -r requirements.txt --no-cache-dir COPY . /app ENTRYPOINT [python3] CMD [manage.py, runserver, 0.0.0.0:8000] FROM builder as dev-envs RUN EOF apk update apk add git EOF ...它额外演示了三个实用技巧使用--platform$BUILDPLATFORM支持跨平台构建用EXPOSE 8000声明容器监听端口通过--no-cache-dir减小镜像体积。其中ENTRYPOINT [python3]CMD [manage.py, runserver, 0.0.0.0:8000]的组合等价于在 Compose 文件中用command覆盖默认启动命令的效果。编写 requirements.txt创建requirements.txt写入 Django 与 PostgreSQL 驱动依赖Django3.0,4.0 psycopg22.8该文件被Dockerfile中的RUN pip install -r requirements.txt命令消费。psycopg2是 Django 连接 PostgreSQL 的关键驱动缺了它django.db.backends.postgresql引擎将无法工作。仓库样例 django/app/requirements.txt 采用了锁版本的写法Django3.2.13 environs7.3.1environs用于从环境变量解析配置对应样例 example/settings.py 中env(SECRET_KEY, ...)、env.bool(DEBUG, True)、env.list(ALLOWED_HOSTS, ...)的用法——生产环境推荐锁定版本以保证可复现性。编写 docker-compose.yml创建docker-compose.yml写入双服务编排services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DBpostgres - POSTGRES_USERpostgres - POSTGRES_PASSWORDpostgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 environment: - POSTGRES_NAMEpostgres - POSTGRES_USERpostgres - POSTGRES_PASSWORDpostgres depends_on: - db该 Compose 文件定义了db与web两个服务各自承担独立职责服务镜像/构建关键配置职责dbimage: postgres官方镜像挂载./data/db数据卷持久化数据注入POSTGRES_DB/POSTGRES_USER/POSTGRES_PASSWORD三个环境变量初始化数据库提供 PostgreSQL 数据库webbuild: .当前目录构建端口映射8000:8000挂载项目目录到/code设置同名数据库连接变量depends_on: db保证启动顺序运行 Django 应用几点需要特别注意command覆盖镜像默认命令python manage.py runserver 0.0.0.0:8000显式指定启动命令。0.0.0.0让 Django 开发服务器监听容器内所有网络接口否则容器外将无法访问。端口映射方向8000:8000的格式是「宿主机端口:容器端口」宿主机端口可改如8080:8000容器端口需与runserver监听端口一致。数据卷持久化./data/db:/var/lib/postgresql/data把 PostgreSQL 数据文件保存在宿主机data/db目录容器删除后数据不丢失。depends_on只保证启动顺序不保证数据库已就绪。生产环境应配合健康检查或应用侧重试机制避免 Django 在 PostgreSQL 尚未初始化完成时启动而报连接错误。注意command中使用的开发服务器runserver仅适用于本地开发演示切勿用于生产环境。生产部署应改用 gunicorn/uwsgi 等 WSGI 服务器并配合 Nginx。创建 Django 项目docker compose run在项目根目录执行docker compose run利用web服务的镜像与配置在容器内运行django-admin startprojectsudo docker compose run web django-admin startproject composeexample .执行过程说明由于web镜像尚不存在Compose 会先根据docker-compose.yml中的build: .从当前目录构建镜像随后在容器中执行django-admin startproject composeexample .生成一套完整的 Django 项目文件manage.py、composeexample/包等。命令中的.表示在当前目录即挂载进容器的/code生成项目。处理文件属主问题命令完成后列出项目内容$ ls -l drwxr-xr-x 2 root root composeexample drwxr-xr-x 3 root root data -rw-rw-r-- 1 user user docker-compose.yml -rw-rw-r-- 1 user user Dockerfile -rwxr-xr-x 1 root root manage.py -rw-rw-r-- 1 user user requirements.txtLinux 用户容器默认以 root 用户运行因此django-admin生成的文件属主为 root需要修正属主sudo chown -R $USER:$USER composeexample manage.py关键提醒不要修改data目录PostgreSQL 数据目录的权限Postgres 以自身用户启动目录权限被改动会导致数据库无法启动。Mac / Windows 用户文件共享机制下你应该已经拥有所有文件属主执行ls -l确认即可$ ls -l total 32 -rw-r--r-- 1 user staff 145 Feb 13 23:00 Dockerfile drwxr-xr-x 6 user staff 204 Feb 13 23:07 composeexample -rw-r--r-- 1 user staff 159 Feb 13 23:02 docker-compose.yml -rwxr-xr-x 1 user staff 257 Feb 13 23:07 manage.py -rw-r--r-- 1 user staff 16 Feb 13 23:01 requirements.txt连接数据库改写 settings.py编辑composeexample/settings.py将默认的DATABASES ...替换为以下配置# settings.py import os [...] DATABASES { default: { ENGINE: django.db.backends.postgresql, NAME: os.environ.get(POSTGRES_NAME), USER: os.environ.get(POSTGRES_USER), PASSWORD: os.environ.get(POSTGRES_PASSWORD), HOST: db, PORT: 5432, } }各配置项与 Compose 文件的对应关系如下ENGINE指定 PostgreSQL 后端需要psycopg2驱动支持NAME/USER/PASSWORD从web服务注入的环境变量读取值来自docker-compose.yml中db与web服务共同的POSTGRES_*环境变量由官方 postgres 镜像约定HOST必须写db这是 Compose 默认网络中的服务名Django 在容器内通过服务名解析到db容器的 IP而不是localhostPORT为 PostgreSQL 默认端口5432。仓库样例的配置方式本仓库 django/app/example/settings.py 走的是「environs SQLite 开发库」路线默认使用django.db.backends.sqlite3将数据写入db.sqlite3并通过env封装读取SECRET_KEY、DEBUG、ALLOWED_HOSTS等环境变量方便按环境切换配置。两种方式分别对应“Compose 快速入门PostgreSQL”与“轻量开发样例SQLite”可根据实际需求选用。启动应用docker compose up从项目顶层目录运行$ docker compose up djangosample_db_1 is up-to-date Creating djangosample_web_1 ... Creating djangosample_web_1 ... done Attaching to djangosample_db_1, djangosample_web_1 db_1 | The files belonging to this database system will be owned by user postgres. db_1 | This user must also own the server process. db_1 | db_1 | The database cluster will be initialized with locale en_US.utf8. db_1 | The default database encoding has accordingly been set to UTF8. db_1 | The default text search configuration will be set to english. ... web_1 | July 30, 2020 - 18:35:38 web_1 | Django version 3.0.8, using settings composeexample.settings web_1 | Starting development server at http://0.0.0.0:8000/ web_1 | Quit the server with CONTROL-C.日志中的关键信号db_1输出 PostgreSQL 首次初始化的信息数据库 cluster、UTF8 编码、英文全文检索配置web_1输出 Django 版本、使用的 settings 模块以及开发服务器监听地址。当看到Starting development server at http://0.0.0.0:8000/时应用已在宿主机8000端口就绪Docker DesktopMac/Windows浏览器访问http://localhost:8000Linux 主机访问宿主机 IP 的8000端口。应看到上文的 Django 欢迎页“The install worked successfully! Congratulations!”。注意Windows 10 用户某些平台上浏览器可能无法访问页面此时需在settings.py中编辑ALLOWED_HOSTS将 Docker 主机名或 IP 加入列表。演示场景可临时设置为ALLOWED_HOSTS [*]该值绝不安全仅限开发演示。生产环境请务必配置为具体的域名/IP 白名单参考 Django 官方ALLOWED_HOSTS文档。验证运行中的容器另开一个终端窗口用docker ps或docker container ls查看运行状态$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES def85eff5f51 django_web python3 manage.py... 10 minutes ago Up 9 minutes 0.0.0.0:8000-8000/tcp django_web_1 678ce61c79cc postgres docker-entrypoint... 20 minutes ago Up 9 minutes 5432/tcp django_db_1输出印证了两个服务并存django_web_1运行 Django 开发服务器并映射0.0.0.0:8000-8000/tcpdjango_db_1运行 PostgreSQL仅暴露5432/tcp未映射到宿主机只在 Compose 内部网络可达。仓库样例 django/README.md 提供了对应的精简验证结果单容器django_web0.0.0.0:8000-8000/tcp映射可作为最小化部署的对照参考。停止与清理Ctrl-C 与 docker compose down停止应用有两种方式方式一前台 Ctrl-C。在启动docker compose up的终端中按Ctrl-CGracefully stopping... (press CtrlC again to force) Killing test_web_1 ... done Killing test_db_1 ... done方式二优雅关闭docker compose down。切换到另一个终端在项目顶层目录执行$ docker compose down Stopping django_web_1 ... done Stopping django_db_1 ... done Removing django_web_1 ... done Removing django_web_run_1 ... done Removing django_db_1 ... done Removing network django_defaultdocker compose down会依次停止并移除容器同时删除 Compose 自动创建的django_default网络。需要注意的是默认情况下down不会删除数据卷PostgreSQL 数据仍保留在./data/db中再次up时数据依然存在。若想连同数据卷一并清理可使用docker compose down -v谨慎使用会永久删除数据库数据。应用关闭后可以安全删除整个 Django 示例项目目录如rm -rf django完成清理。仓库内更轻量的 Django 样例对照如果你想快速体验一个“无数据库”的最小 Django 容器化方案可直接查看仓库中的 django 样例属于 Awesome Compose 系列。其 compose.yaml 只定义一个web服务services: web: build: context: app target: builder ports: - 8000:8000配合 app/manage.py入口脚本设置DJANGO_SETTINGS_MODULEexample.settings后调用execute_from_command_line与 SQLite 默认配置一条docker compose up -d即可在http://localhost:8000看到 Django 应用运行。该样例与本指南的 PostgreSQL 版本互补一个展示“多服务 数据库编排”的完整链路一个展示“单服务 镜像多阶段构建”的最小闭环。更多 Compose 学习资源Docker Compose 总览与安装指南Docker Compose 入门教程Compose 命令行参考Compose 文件参考以上官方资料可帮助你进一步掌握服务编排、网络、卷与健康检查等进阶能力本仓库的 官方文档样例总览 还提供了 Rails/PostgreSQL、WordPress 等更多 Compose 快速入门场景分别为 official-documentation-samples/rails/README.md 与 official-documentation-samples/wordpress/README.md可以横向对比不同技术栈的 Compose 编排范式。赞分享示例工程【免费下载链接】awesome-composeAwesome Docker Compose samples项目地址https://gitcode.com/gh_mirrors/aw/awesome-compose点击查看免费下载相关推荐使用 Docker 容器化部署 Litestar 应用从 Dockerfile 编写到 Docker Compose 多服务编排实战使用 Docker 容器化部署 Litestar 应用从 Dockerfile 编写到 Docker Compose 多服务编排实战 本文是一份围绕 Lite后端Web框架使用 Docker 与 Docker Compose 容器化部署 PostGraphile 与 PostgreSQL 实战指南使用 Docker 与 Docker Compose 容器化部署 PostGraphile 与 PostgreSQL 实战指南 本文是一份面向 V5 版本的完整后端API网关从Docker Compose到Containerd多容器应用迁移实战指南从Docker Compose到Containerd多容器应用迁移实战指南 你是否还在为Docker Compose的性能瓶颈和资源占用而烦恼本文将带你一文云原生容器运行时上一篇3分钟掌握电话号码定位神器快速查找手机归属地的终极指南下一篇location-to-phone-number智能号码定位解决方案揭秘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考