【Docker】定义和运行多容器应用程序

一、使用Compose部署WordPress

1、定义Compose项目

  • 创建一个空的项目目录
powershell 复制代码
mkdir mywordpress
  • 在该目录文件下创建并编辑compose.yaml文件
powershell 复制代码
services:
  db:
    # 使用支持多架构(AMD64/ARM64)的MariaDB镜像(官方10.6版本默认支持多架构)
    image: mariadb:10.6
    command: --default-authentication-plugin=mysql_native_password  # 修正拼写错误(nysql→mysql,移除多余空格)
    volumes:
      - db_data:/var/lib/mysql  # 数据持久化卷
    restart: always
    environment:
      - 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: always
    environment:
      - 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应用程序

  • 拉取所需镜像
powershell 复制代码
docker compose up -d
  • 查看正在运行的容器
powershell 复制代码
docker ps

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

  • 查看当前容器网络
powershell 复制代码
docker network ls

自动创建了名为mywordpress_default的桥接网络

  • 查看当前卷
powershell 复制代码
docker volume ls

自动创建了两个相应的卷

3、在Web浏览器中访问WordPress应用程序

  • 查看docker主机ip地址
powershell 复制代码
ip addr

可见,我的主机ip地址为192.168.58.131

  • 在浏览器上访问该主机ip地址

http://主机ip地址

即可进入以下界面:

语言选择"简体中文",之后点击继续。

进入以下界面之后,完成填写点击安装即可。

安装完成

登录:

  • 停止和清理Compose应用程序
powershell 复制代码
docker compose down --volumes

二、编写定义Compose文件

(1)编写定义单个服务的Compose文件

  • 编写一个compose.yaml文件,并使用Compose部署MySQL8.0服务器,文件内容:
powershell 复制代码
services:
  mysql:  # 与services保持2个空格缩进(子项)
    image: mysql:8  # 与mysql保持2个空格缩进(孙项,共4个空格)
    container_name: mysql8
    ports:
      - "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=1
    environment:
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - mysql8-data:/var/lib/mysql
 
volumes:  
  volumes.mysql8-data: null
  • 解析配置文件
powershell 复制代码
docker compose config
  • 启动该服务
powershell 复制代码
docker compose up -d
  • 停止并清理服务
powershell 复制代码
docker compose down --volumes

(2)编写定义多个服务的Compose文件

1、定义项目组件

  • 创建一个空的Compose项目文件
powershell 复制代码
mkdir django-pg && cd django-pg
  • 在该文件下创建并编辑Dockerfile
powershell 复制代码
vi Dockerfile
powershell 复制代码
# 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文件
powershell 复制代码
vi requirements.txt
powershell 复制代码
Django>=3.0,<4.0
psycopg2>=2.8
  • 创建并编辑compose.yaml文件
powershell 复制代码
vi compose.yaml
powershell 复制代码
services:
  db:
    # 使用PostgreSQL官方镜像(适配Web应用的数据库需求)
    image: postgres:14
    container_name: postgres_db
    volumes:
      - 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项目
powershell 复制代码
docker compose run web django-admin startproject myexample .
  • 查看项目目录
powershell 复制代码
ls -l

3、为Django设置数据库连接

  • 编辑项目目录中的myexample/settings.py文件
    在文件开头新增import os
    并将其中的"DATABASES"定义修改如下:
powershell 复制代码
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,
    }
}
  • 执行命令
cpp 复制代码
docker compose up

4、停止并清理服务

三、谢谢观看!

相关推荐
CDN36010 分钟前
CDN 无法播放音视频?流媒体回源与 Range 配置修复
运维·音视频
剑锋所指,所向披靡!14 分钟前
linux的目录结构
linux·运维·服务器
zt1985q16 分钟前
本地部署 Home Assistant 高级自动化 AppDaemon 并实现外部访问
运维·服务器·网络·网络协议·自动化
志栋智能18 分钟前
轻量级部署:低成本实现混合云环境自动化巡检
运维·网络·人工智能·自动化
结衣结衣.27 分钟前
【Linux】命名管道的妙用:实现进程控制与实时字符交互
linux·运维·开发语言·学习·操作系统·交互
IMPYLH35 分钟前
Linux 的 groups 命令
linux·运维·服务器·bash
星辰_mya1 小时前
数据库运维与数据安全:备份恢复、日志分析与故障排查
运维·数据库·后端·面试·架构师
何中应1 小时前
MindMap问题
运维·服务器·xmind
何中应1 小时前
Grafana如何设置中文界面
运维·数据分析·grafana
不才小强1 小时前
Linux网络调试工具:curl与抓包实战
linux·运维·网络