Docker Compose:多容器应用管理利器
Docker Compose 简介
Docker Compose 是 Docker 官方推出的用于定义和运行多容器 Docker 应用的工具。它允许用户通过一个 YAML 文件来配置应用所需的所有服务,然后使用单一命令创建并启动所有服务。
核心优势:
- 简化多容器配置:无需逐个运行docker run命令,通过配置文件集中管理
- 保持环境一致性:开发、测试和生产环境使用相同的配置
- 一键操作:单条命令即可启动、停止和重建整个应用栈
- 依赖管理:自动处理容器间的依赖关系和网络连接
与 Docker 命令行工具的关系:Docker Compose 建立在 Docker 命令行工具之上,它本质上是将复杂的 Docker 命令序列自动化,提供更简洁的操作方式,特别适合开发和测试环境使用。
编写 Compose 文件
Docker Compose 使用 YAML 格式的配置文件(默认名为docker-compose.yml)来定义应用的服务、网络和数据卷。
基本结构
一个典型的docker-compose.yml文件包含以下几个顶级元素:
- version:指定 Compose 文件格式的版本
- services:定义应用的各个服务(容器)
- networks:定义应用使用的网络
- volumes:定义应用使用的数据卷
服务配置常用参数
- image:指定容器使用的镜像
- build:指定 Dockerfile 路径,用于构建镜像
- ports:端口映射,格式为主机端口:容器端口
- environment:设置环境变量
- volumes:挂载数据卷或主机目录
- depends_on:指定服务间的依赖关系
- networks:指定服务加入的网络
- restart:设置容器重启策略
示例:Web 应用
以下是一个包含 Web 应用和数据库的多容器应用示例:
# 项目目录结构
project/
├── docker-compose.yml
├── webapps/ROOT/mysqltest.jsp # 存放你的JSP页面(建议放在webapps/ROOT下)
├── webapps/ROOT/lib/ # 新增lib目录
│ └── mysql-connector-java-8.0.29.jar # MySQL JDBC驱动
└── ...
# cat docker-compose.yaml
version: '3.8'
services:
# Tomcat服务
tomcat:
image: tomcat:9.0
container_name: web-tomcat
ports:
- "9080:8080" # 主机端口:容器端口
volumes:
- ./webapps:/usr/local/tomcat/webapps # 挂载本地Web应用到Tomcat
environment:
- TZ=Asia/Shanghai # 设置时区
- MYSQL_HOST=mysql # 关联MySQL服务名
- MYSQL_PORT=3306
depends_on:
- mysql # 确保MySQL先启动
restart: unless-stopped
networks:
- app-network
# MySQL服务
mysql:
image: mysql:8.0
container_name: web-mysql
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql # 数据持久化
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=root123 # root密码
- MYSQL_DATABASE=webappdb # 自动创建数据库
- MYSQL_USER=appuser # 应用用户
- MYSQL_PASSWORD=apppass123 # 应用用户密码
restart: unless-stopped
networks:
- app-network
command: --default-authentication-plugin=mysql_native_password # 兼容旧版认证
networks:
app-network:
driver: bridge
volumes:
mysql-data: # 命名卷,用于持久化MySQL数据
docker compose up -d //启动
浏览器测试:mysqltest.jsp
# cat docker-compose.yaml
version: '3.8'
services:
# Tomcat服务
tomcat:
image: tomcat:9.0
container_name: web-tomcat
ports:
- "9080:8080" # 主机端口:容器端口
volumes:
- ./webapps:/usr/local/tomcat/webapps # 挂载本地Web应用到Tomcat
environment:
- TZ=Asia/Shanghai # 设置时区
- MYSQL_HOST=mysql # 关联MySQL服务名
- MYSQL_PORT=3306
depends_on:
- mysql # 确保MySQL先启动
restart: unless-stopped
networks:
- app-network
# MySQL服务
mysql:
image: mysql:8.0
container_name: web-mysql
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql # 数据持久化
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=root123 # root密码
- MYSQL_DATABASE=webappdb # 自动创建数据库
- MYSQL_USER=appuser # 应用用户
- MYSQL_PASSWORD=apppass123 # 应用用户密码
restart: unless-stopped
networks:
- app-network
command: --default-authentication-plugin=mysql_native_password # 兼容旧版认证
networks:
app-network:
driver: bridge
volumes:
mysql-data: # 命名卷,用于持久化MySQL数据
[root@QPL-zabbix-pro tomcat]# vi webapps/ROOT/mysqltest.jsp
[root@QPL-zabbix-pro tomcat]# cat webapps/ROOT/mysqltest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<title>MySQL连接测试</title>
</head>
<body>
<h1>MySQL连接测试</h1>
<%
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 加载MySQL JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 构建JDBC连接URL
// jdbc:mysql://<服务名>.<命名空间>.svc.cluster.local:3306/<数据库名>
String url = "jdbc:mysql://mysql:3306/webappdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String username = "appuser";
String password = "apppass123";
// 建立数据库连接
conn = DriverManager.getConnection(url, username, password);
// 执行测试查询
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT 1 AS test_result");
if (rs.next()) {
out.println("<p style=\"color:green;\">连接MySQL成功!</p>");
out.println("<p>测试结果:" + rs.getInt("test_result") + "</p>");
}
} catch (ClassNotFoundException e) {
out.println("<p style=\"color:red;\">找不到MySQL JDBC驱动类:" + e.getMessage() + "</p>");
e.printStackTrace();
} catch (SQLException e) {
out.println("<p style=\"color:red;\">SQL异常:" + e.getMessage() + "</p>");
e.printStackTrace();
} catch (Exception e) {
out.println("<p style=\"color:red;\">连接出错:" + e.getMessage() + "</p>");
e.printStackTrace();
} finally {
// 关闭资源
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
%>
</body>
</html>
使用 Compose 命令
Docker Compose 提供了一系列命令来管理应用的生命周期:
默认docker内置了docker compose,使用默认的可以不考虑兼容性问题:
启动应用,选项-d:后台运行容器
docker compose up -d
选项--build:启动前重新构建镜像
docker compose up --build
停止并删除应用
docker compose down
- 选项-v:同时删除数据卷
docker compose down -v
查看应用状态
docker compose ps
查看应用日志
docker compose logs -f
- 查看特定服务的日志
docker compose logs -f tomcat //注意是服务,不是容器名
重启服务
docker compose restart
- 重启特定服务
docker compose restart tomcat
进入容器
docker compose exec tomcat bash
查看服务依赖关系
docker compose top
暂停 / 恢复服务
docker compose pause
docker compose unpause
检查配置文件
docker compose config
通过这些命令,开发者可以轻松管理复杂的多容器应用,大大简化了开发、测试和部署流程。Docker Compose 已成为现代容器化应用开发不可或缺的工具。
相关文章
- Spring Boot + MyBatis实战中那些“坑”与思考 — 以身份认证服务为例
- 一款免费开源的企业级 ERP 系统_企业开源软件
- 一篇教你通过Seata解决分布式事务问题
- Spring Boot 3 中整合 XXL-JOB 实现任务调度操作全解析
- 【推荐】一款开源免费、功能强大的短链接生成平台
- 你会不会使用 SpringBoot 整合 Flowable 快速实现工作流呢?
- Docker Compose:多容器应用管理利器
- Spring Boot3 配置 Druid 总踩坑?看完这篇让你少走 90% 弯路
- Spring Security在前后端分离项目中的使用
- Windows安装Nacos2.x_Windows安装U盘