首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-04-23 06:21
  • 4109
  • 5279
juejin.cn

下面这篇教程将会手把手演示如何使用 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. 进入该目录:
bash
代码解读
复制代码
cd compose-demo

三、编写 docker-compose.yml 文件

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

yaml
代码解读
复制代码
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 处于同一网络之中,容器之间可以通过 mysql、redis 进行互相访问(例如 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 客户端,可以在命令行执行:
css
代码解读
复制代码
mysql -h 127.0.0.1 -P 3306 -u root -p

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

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

同样输入密码 root123 进入 MySQL。

  • 查看数据库
ini
代码解读
复制代码
SHOW DATABASES;

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

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

2. 验证 Redis

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

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

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

arduino
代码解读
复制代码
set foo bar get foo # 结果应该为 "bar"
  • 方式二:进入容器内部
bash
代码解读
复制代码
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. 停止容器
arduino
代码解读
复制代码
docker compose stop

或只停止其中一个服务:

arduino
代码解读
复制代码
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 中更换映射端口,比如:
makefile
代码解读
复制代码
ports: - "3307:3306"

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

  1. 数据卷持久化
    • 默认配置中,我们将 MySQL 和 Redis 的数据都持久化到当前目录下的 mysql_data 和 redis_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 不仅可以更轻松地启动、停止和维护多个容器服务,也使得环境可移植性、部署一致性得到极大提升。以上仅是最基础的入门示例,更复杂或生产环境中可能还需要对网络、存储、权限、安全等方面做更详细的配置调整。

注:本文转载自juejin.cn的超爱吃士力架的文章"https://juejin.cn/post/7465924528452321291"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

143
阅读
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top