Docker Compose:多容器应用管理利器

Docker Compose:多容器应用管理利器

编程文章jaq1232025-08-23 4:43:404A+A-

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 已成为现代容器化应用开发不可或缺的工具。

点击这里复制本文地址 以上内容由jaq123整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

苍茫编程网 © All Rights Reserved.  蜀ICP备2024111239号-21