用Docker作用开发环境,是每个应用都用单独的容器,还是在容器里安装所有再打包成一个Image呢?
另外,比如多个项目对mysql版本要求不一样,想快速切换,哪种更方便呢?例:
项目A是5.7、项目B是8.4等。当处理项目A问题时启动5.7,项目B启动8.4。
要把所有用到的服务+多版本都写在一个docker-compose里吗?依赖比较混乱,怎么做才能更方便启动服务且避免一次启动用不到的呢。
使用了docker-compose
用Docker作用开发环境,是每个应用都用单独的容器,还是在容器里安装所有再打包成一个Image呢?
另外,比如多个项目对mysql版本要求不一样,想快速切换,哪种更方便呢?例:
项目A是5.7、项目B是8.4等。当处理项目A问题时启动5.7,项目B启动8.4。
要把所有用到的服务+多版本都写在一个docker-compose里吗?依赖比较混乱,怎么做才能更方便启动服务且避免一次启动用不到的呢。
使用了docker-compose
使用 Docker 搭建开发环境时,管理多个容器和服务可以通过以下几种方式来实现高效和灵活性:
每个应用使用单独的容器:
多版本数据库管理:
mysql:5.7
,项目 B 使用 mysql:8.4
。docker-compose.yml
文件,指定所需的 MySQL 版本和其他服务。docker-compose
文件来快速切换 MySQL 版本。docker-compose 的使用:
docker-compose.yml
文件中。相反,为每个项目或一组相关服务创建一个单独的 docker-compose.yml
文件。docker-compose up -d mysql
只启动 MySQL 服务。.env
文件或环境变量来管理不同项目之间的配置差异,如数据库连接字符串等。其他管理技巧:
docker-compose.override.yml
或其他扩展文件来拆分和管理配置。docker-compose.yml
文件和其他 Docker 相关配置编写文档,并将其纳入版本控制系统,以便团队协作和版本追踪。综上所述,每个应用使用单独的容器是推荐的做法,而多版本数据库管理可以通过使用不同版本的 Docker 镜像和单独的 docker-compose.yml
文件来实现。避免将所有服务和多版本都写在一个 docker-compose.yml
文件中,而是采用多文件策略来管理不同项目的配置和依赖。
首先建议独立项目独立的 yml 文件
可以通过自己撰写一个脚本文件或者不同的脚本文件来决定访问哪个 docker compose yml
#!/bin/bash
SELF=$(basename "${0}")
SELF_DIR=$(realpath $(dirname "${0}"))
YML_PATH=$(realpath "${SELF_DIR}"/../yml)
if [ -z "${1}" ]; then
echo "Usage:"
echo "/opt/service/bin/myservice GROUP [COMMAND]"
echo "Example:"
echo "/opt/service/bin/myservice groupA ps"
echo "/opt/service/bin/myservice groupB up -d"
exit 1
fi
YML_NAME="${1}"
PROJECT_NAME=$(echo ${YML_NAME} | sed 's/[^a-zA-Z0-9_-]/_/g')
# 兼顾了 docker compose 和 docker-compose 两种情况
if docker compose version >/dev/null 2>&1; then
set -x
docker compose -f ${YML_NAME} -p ${PROJECT_NAME} "${@}"
else
set -x
docker-compose -f ${YML_NAME} -p ${PROJECT_NAME} "${@}"
fi
把这个脚本保存为 /opt/service/bin/myservice
yml 位于:/opt/service/yml
运行 /opt/service/bin/myservice groupA ps
相当于对应:docker compose -f /opt/service/yml/groupA.yml -p groupA ps
为了方便实用可以自行把 /opt/service/bin/
加入你的 PATH 环境变量
如果这个条件不具备,必须要把所有服务放到一个 yml 文件中,你可以考虑 docker compose 的 profile 特性:
https://docs.docker.com/compose/how-tos/profiles/
官网文档有例子:
services:
frontend:
image: frontend
profiles: [frontend]
phpmyadmin:
image: phpmyadmin
depends_on: [db]
profiles: [debug]
backend:
image: backend
db:
image: mysql
启动所有 debug 标记的服务(以及它们的依赖):docker compose --profile debug up -d
5 回答7.7k 阅读✓ 已解决
2 回答4.1k 阅读✓ 已解决
2 回答2.9k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
3 回答3k 阅读
1 回答1.7k 阅读✓ 已解决
1. 创建环境变量文件
创建两个环境变量文件,分别为
projectA.env
和projectB.env
:projectA.env
projectB.env
2. 修改
docker-compose.yml
文件使用环境变量来配置服务:
3. 创建启动脚本
编写一个shell脚本,根据项目需求启动相应的服务:
将这个脚本保存为
start_project.sh
,并赋予执行权限:4. 启动服务
使用脚本启动相应项目的服务:
或者: