使用docker-compose构建管理MySQL和redis

258 阅读8分钟

下面这篇教程将会手把手演示如何使用 Docker Compose 来同时构建和管理 MySQL 与 Redis。本文将从零开始,介绍从安装所需环境到编写 docker-compose.yml 文件再到启动、测试的全过程,并在文末给出一些常见的注意事项和排错思路。


一、环境准备

  1. 安装 Docker
    • 针对不同操作系统(Windows、macOS、Linux),可以参考Docker 官方文档进行安装。
    • 安装完成后,可在命令行终端输入以下命令,检查 Docker 是否安装并启动成功:
docker version

如果成功显示 Docker 的版本信息,就说明安装成功。

  1. 安装 Docker Compose
    • 如果使用的是 Docker Desktop(Windows 或 macOS),通常已经自带了 Docker Compose。
    • 如果是在 Linux 上,需要另外安装 Docker Compose。一般可以通过包管理器或官方安装脚本进行安装。
    • 验证 Docker Compose 安装是否成功,可以执行:
docker compose version

docker-compose version

注意:Docker 版本更新后,可能使用 docker compose 命令,而早期版本是 docker-compose,两者在使用时略有不同,但本质功能一致。)

  1. 确认安装结果
    • 确保以下命令都可成功执行且能看到版本输出:
docker version
docker compose version

docker-compose version

二、创建项目目录

  1. 在本地新建一个目录(文件夹),用于存放我们的 docker-compose.yml 文件以及一些额外的配置文件(如果需要)。
    • 例如,我们创建一个名为 compose-demo 的文件夹。
  1. 进入该目录:
cd compose-demo

三、编写 docker-compose.yml 文件

compose-demo 目录下,新建一个名为 docker-compose.yml 的文件,内容示例如下(可根据需求自行修改):

version: "3.8"  # 指定 Docker Compose 文件格式版本

services:
  mysql:
    image: mysql:8.0  # 使用 MySQL 8.0 官方镜像
    container_name: demo-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123  # 设置root用户密码
      MYSQL_DATABASE: demo_db       # 初始化时自动创建一个名为 demo_db 的数据库
      MYSQL_USER: demo_user         # 初始化用户
      MYSQL_PASSWORD: demo_pass     # 初始化用户密码
    ports:
      - "3306:3306"  # 将容器的3306端口映射到宿主机的3306端口
    volumes:
      - ./mysql_data:/var/lib/mysql  # 将容器中的MySQL数据存储目录挂载到宿主机目录(持久化数据)
    networks:
      - mynet

  redis:
    image: redis:6.0  # 使用 Redis 6.0 官方镜像
    container_name: demo-redis
    restart: always
    ports:
      - "6379:6379"  # 将容器6379端口映射到宿主机6379端口
    volumes:
      - ./redis_data:/data         # 挂载Redis的数据目录(持久化数据)
    command: ["redis-server", "--appendonly", "yes"]  # 默认开启appendonly模式
    networks:
      - mynet

networks:
  mynet:
    driver: bridge

文件内容详解

  1. version: "3.8"
    • 表示使用 Docker Compose 配置文件的 3.8 版本格式。
  1. services
    • services 节点下定义了多个服务(MySQL、Redis),它们会同时被启动且放在同一个网络中,可通过服务名互相访问。
  1. mysql 服务
    • image: mysql:8.0
      使用官方的 mysql:8.0 镜像,如果对版本有其他需求可自行替换。
    • container_name: demo-mysql
      容器名称,可自定义。
    • restart: always
      如果容器意外停止或服务器重启后会自动重启容器。
    • environment
      • MYSQL_ROOT_PASSWORD: 设置数据库 root 用户的登录密码。
      • MYSQL_DATABASE: 指定初始化时自动创建的数据库名称。
      • MYSQL_USER / MYSQL_PASSWORD: 指定一个新用户及其密码,默认会在初始化时自动创建。
    • ports: - "3306:3306"
      将容器的 3306 端口映射到宿主机的 3306 端口,以便在宿主机用 mysql -h 127.0.0.1 -P 3306 -u root -p 进行访问。
    • volumes: - ./mysql_data:/var/lib/mysql
      将容器内部的 /var/lib/mysql 挂载到宿主机当前目录下的 mysql_data 文件夹,用于数据持久化。如果不设置,一旦容器删除,容器内部的数据也会丢失。
  1. redis 服务
    • image: redis:6.0
      使用官方的 redis:6.0 镜像,同样可以根据需要调整版本。
    • container_name: demo-redis
      容器名称,可自定义。
    • ports: - "6379:6379"
      将容器的 6379 端口映射到宿主机的 6379 端口,默认端口用于 Redis 连接。
    • volumes: - ./redis_data:/data
      将 Redis 的 /data 目录挂载到宿主机当前目录下的 redis_data 文件夹,方便持久化存储。
    • command: ["redis-server", "--appendonly", "yes"]
      指定容器启动时执行的命令,这里开启 appendonly 持久化模式。
    • restart: always
      同 MySQL,一旦重启或异常退出会自动拉起。
  1. networks
    • 定义了一个名为 mynet 的网络,使 MySQL 和 Redis 处于同一网络之中,容器之间可以通过 mysqlredis 进行互相访问(例如 redis 容器可通过 mysql:3306 访问 MySQL 服务)。

四、启动 Docker Compose

  1. 确保在 compose-demo 目录下(即包含 docker-compose.yml 的路径)。
  2. 执行启动命令:
docker compose up -d

如果是早期 Docker Compose 版本,可以使用:

docker-compose up -d
    • -d 参数表示后台运行(detached mode)。
  1. 等待容器拉取镜像并启动。可以使用以下命令查看容器运行状态:
docker ps

或者查看日志:

docker compose logs -f

(早期版本则使用 docker-compose logs -f


五、测试与验证

1. 验证 MySQL

  • 方式一:通过宿主机的 MySQL 客户端
    如果本地已经安装了 MySQL 客户端,可以在命令行执行:
mysql -h 127.0.0.1 -P 3306 -u root -p

输入在 docker-compose.yml 中指定的 root 密码(上例中是 root123),如果能正常登录说明容器内的 MySQL 已经可用。

  • 方式二:进入容器内部
docker exec -it demo-mysql bash
# 然后在容器内执行
mysql -u root -p

同样输入密码 root123 进入 MySQL。

  • 查看数据库
SHOW DATABASES;

应该能看到 demo_db(由于在 docker-compose.yml 中指定了 MYSQL_DATABASE: demo_db)。

直接用第三方可视化界面连接也行

2. 验证 Redis

直接用第三方可视化界面连接也行

  • 方式一:通过宿主机的 redis-cli
    如果本地安装了 redis-cli,可以直接:
redis-cli -h 127.0.0.1 -p 6379

然后执行一些命令进行测试,比如:

set foo bar
get foo  # 结果应该为 "bar"
  • 方式二:进入容器内部
docker exec -it demo-redis bash
# 容器内部若没有redis-cli,需要在Dockerfile里安装或使用指定带cli的镜像
# 也可以在镜像中通过redis自带的 CLI 进行访问
redis-cli
# 测试读写
set foo bar
get foo

六、常见操作

  1. 查看容器日志
docker compose logs -f mysql
docker compose logs -f redis

可实时查看 MySQL 或 Redis 容器的日志输出。

  1. 停止容器
docker compose stop

或只停止其中一个服务:

docker compose stop mysql
  1. 重启容器
docker compose restart
  1. 移除容器
docker compose down

这会停止并移除所有在 docker-compose.yml 中定义的容器。如果希望同时删除数据卷(注意数据会丢失),可加上 -v 参数:

docker compose down -v

七、注意事项

  1. 端口冲突
    • 如果宿主机上已经有其他进程占用了 3306 或 6379 端口,需要在 docker-compose.yml 中更换映射端口,比如:
ports:
  - "3307:3306"

这样 MySQL 就映射到宿主机的 3307 端口。

  1. 数据卷持久化
    • 默认配置中,我们将 MySQL 和 Redis 的数据都持久化到当前目录下的 mysql_dataredis_data 文件夹。必须保证当前用户对这些文件夹拥有读写权限,否则可能会造成容器启动错误或权限问题。
    • 如果仅作测试,可以不做数据持久化,但生产环境中一定要设置数据挂载路径以防数据丢失。
  1. 密码安全
    • 本文示例中仅作演示,实际环境中应设置较复杂的 root 密码与用户密码。
    • 切勿将敏感信息直接硬编码在 docker-compose.yml,建议使用环境变量文件(如 .env)或其他安全方式管理密码。
  1. 网络配置
    • Compose 会默认创建一个桥接网络(bridge),上例中命名为 mynet,容器之间可以通过服务名相互访问。
    • 如果要与外部或其他网络通信,可根据需要在 docker-compose.yml 文件中新增更多网络配置。
  1. MySQL 配置调优
    • 如果对 MySQL 有特定配置需求,比如 charset、collation、最大连接数等,可以通过挂载配置文件的方式或使用环境变量进行自定义。
  1. Redis 配置调优
    • 同样可以通过挂载 redis.conf 配置文件、设置持久化策略(RDB 或 AOF 或混合)等方式来满足不同场景的需求。

八、总结

通过以上步骤,我们就可以使用一份简单的 docker-compose.yml 文件来同时管理 MySQL 和 Redis。使用 Docker Compose 不仅可以更轻松地启动、停止和维护多个容器服务,也使得环境可移植性、部署一致性得到极大提升。以上仅是最基础的入门示例,更复杂或生产环境中可能还需要对网络、存储、权限、安全等方面做更详细的配置调整。