【Docker】定义和运行多容器应用程序
一、使用Compose部署WordPress
1、定义Compose项目
- 创建一个空的项目目录
mkdir mywordpress
- 在该目录文件下创建并编辑compose.yaml文件
services:db:# 使用支持多架构(AMD64/ARM64)的MariaDB镜像(官方10.6版本默认支持多架构)image: mariadb:10.6command: --default-authentication-plugin=mysql_native_password # 修正拼写错误(nysql→mysql,移除多余空格)volumes:- db_data:/var/lib/mysql # 数据持久化卷restart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=somewordpress # 根密码- MYSQL_DATABASE=wordpress # 数据库名(修正变量名:MYSQL DATABASE→MYSQL_DATABASE)- MYSQL_USER=wordpress # 数据库用户- MYSQL_PASSWORD=wordpress # 数据库密码expose:- 3306 # 内部暴露MySQL端口- 33060 # MySQL X协议端口wordpress:image: wordpress:latest # WordPress官方镜像默认支持多架构volumes:- wp_data:/var/www/html # WordPress数据卷ports:- "80:80" # 映射主机80端口到容器restart: alwaysenvironment:- WORDPRESS_DB_HOST=db # 数据库主机(关联db服务)- WORDPRESS_DB_USER=wordpress # 数据库用户(修正变量名:WORDPRESS DB USER→WORDPRESS_DB_USER)- WORDPRESS_DB_PASSWORD=wordpress # 数据库密码(修正变量名:WORDPRESS DB PASSWORD→WORDPRESS_DB_PASSWORD)- WORDPRESS_DB_NAME=wordpress # 数据库名(修正变量名:WORDPRESS DB NAME→WORDPRESS
volumes:db_data:wp_data:
2、启动Compose应用程序
- 拉取所需镜像
docker compose up -d

- 查看正在运行的容器
docker ps

可见上图中显示,docker compose up -d命令启动了两个容器。分别名为mywordpress-wordpress-1和mywordpress-db-1
- 查看当前容器网络
docker network ls

自动创建了名为mywordpress_default的桥接网络
- 查看当前卷
docker volume ls

自动创建了两个相应的卷
3、在Web浏览器中访问WordPress应用程序
- 查看docker主机ip地址
ip addr

可见,我的主机ip地址为192.168.58.131
- 在浏览器上访问该主机ip地址
http://主机ip地址
即可进入以下界面:

语言选择“简体中文”,之后点击继续。
进入以下界面之后,完成填写点击安装即可。

安装完成

登录:

- 停止和清理Compose应用程序
docker compose down --volumes

二、编写定义Compose文件
(1)编写定义单个服务的Compose文件
- 编写一个compose.yaml文件,并使用Compose部署MySQL8.0服务器,文件内容:
services:mysql: # 与services保持2个空格缩进(子项)image: mysql:8 # 与mysql保持2个空格缩进(孙项,共4个空格)container_name: mysql8ports:- "3306:3306" # 列表项与ports保持2个空格缩进(共6个空格)command:--default-authentication-plugin=mysql_native_password--character-set-server=utf8mb4--collation-server=utf8mb4_general_ci--explicit_defaults_for_timestamp=true--lower_case_table_names=1environment:- MYSQL_ROOT_PASSWORD=rootvolumes:- /etc/localtime:/etc/localtime:ro- mysql8-data:/var/lib/mysqlvolumes: volumes.mysql8-data: null
- 解析配置文件
docker compose config
- 启动该服务
docker compose up -d
- 停止并清理服务
docker compose down --volumes
(2)编写定义多个服务的Compose文件
1、定义项目组件
- 创建一个空的Compose项目文件
mkdir django-pg && cd django-pg
- 在该文件下创建并编辑Dockerfile
vi Dockerfile
# syntax=docker/dockerfile:1
# 从Python 3.10官方镜像开始构建(基于Debian,稳定且包含常用工具)
FROM python:3.10# 设置环境变量:
# - 防止Python写入.pyc文件(减少镜像体积)
# - 确保Python输出实时打印到控制台(便于容器日志查看)
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1# 在镜像中指定工作目录(后续命令默认在此目录执行)
WORKDIR /code# 先复制依赖清单(利用Docker层缓存,避免每次代码变动都重新安装依赖)
COPY requirements.txt /code/# 安装Python依赖:
# - --no-cache-dir:不缓存安装包,减小镜像体积
# - 可选:添加国内镜像源加速安装(如阿里云:-i https://mirrors.aliyun.com/pypi/simple/)
RUN pip install --no-cache-dir -r requirements.txt# 复制当前目录所有文件到工作目录
COPY . /code/
- 创建并编辑requirements.txt文件
vi requirements.txt
Django>=3.0,<4.0
psycopg2>=2.8
- 创建并编辑compose.yaml文件
vi compose.yaml
services:db:# 使用PostgreSQL官方镜像(适配Web应用的数据库需求)image: postgres:14container_name: postgres_dbvolumes:- postgres_data:/var/lib/postgresql/data/environment:# PostgreSQL环境变量(修正命名规范,替换乱码)- POSTGRES_DB=postgres # 数据库名- POSTGRES_USER=postgres # 用户名- POSTGRES_PASSWORD=postgres # 密码(生产环境需修改为强密码)restart: always # 容器异常时自动重启web:build: . # 从当前目录的Dockerfile构建Web应用镜像command: python manage.py runserver 0.0.0.0:8000 # 启动Web服务(修正空格)volumes:- .:/code # 本地代码挂载到容器(开发时实时同步代码)ports:- "8000:8000" # 端口映射(主机:容器,修正列表格式)environment:# Web应用连接数据库的环境变量(需与db服务的配置一致)- POSTGRES_NAME=postgres- POSTGRES_USER=postgres- POSTGRES_PASSWORD=postgres- DB_HOST=db # 数据库服务名(与db服务名一致)depends_on:- db # 确保db服务启动后再启动web(修正拼写:depends on→depends_on)restart: always# 定义持久化卷(存储数据库数据)
volumes:postgres_data:

2、创建Django项目
- 在django-pg目录下创建Django项目
docker compose run web django-admin startproject myexample .

- 查看项目目录
ls -l

3、为Django设置数据库连接
- 编辑项目目录中的myexample/settings.py文件
在文件开头新增import os
并将其中的“DATABASES”定义修改如下:
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,}
}
- 执行命令
docker compose up

