【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、停止并清理服务

三、谢谢观看!

相关推荐
summer_west_fish2 小时前
K8S Base: CrashLoopBackOff
云原生·容器·kubernetes
傲世(C/C++,Linux)2 小时前
Linux系统编程——进程通信之有名管道
android·linux·运维
雷工笔记2 小时前
计算机更换硬盘并新装系统
运维·学习
权泽谦2 小时前
从 Linux 到 Docker:一条通向 DevOps 的进阶之路
linux·docker·devops
运维成长记3 小时前
11月份运维面试题
运维
Radan小哥3 小时前
Docker学习笔记---day001
笔记·学习·docker
yuanManGan3 小时前
走进Linux的世界:进程优先级
linux·运维·服务器
一叶知秋yyds3 小时前
linux 系统查看进程占用物理内存大小方法
linux·运维·服务器
DreamLife☼3 小时前
Docker-玩转 Docker 镜像:从拉取、构建到发布
docker·pull·镜像·commit·unionfs·分层·hun