您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何使用Docker-Compose一键部署Java微服务
## 前言
在当今云原生时代,微服务架构已成为企业级应用开发的主流选择。然而,随着服务数量的增加,部署和管理的复杂性也呈指数级增长。Docker和Docker-Compose作为轻量级容器化解决方案,能够显著简化微服务的部署流程。本文将详细介绍如何利用Docker-Compose实现Java微服务的一键化部署,涵盖从环境准备到生产部署的全流程。
---
## 一、基础环境准备
### 1.1 安装Docker引擎
```bash
# Ubuntu安装示例
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证安装
docker --version
# 输出: Docker version 24.0.5, build xxx
# 下载最新稳定版
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose version
# 输出: Docker Compose version v2.23.0
确保微服务满足容器化部署的基本条件: - 使用Spring Boot 2.3+(内置健康检查端点) - 配置文件外部化(application.yml或bootstrap.yml) - 日志输出到标准输出(STDOUT)
# 使用官方OpenJDK基础镜像
FROM eclipse-temurin:17-jdk-jammy
# 设置工作目录
WORKDIR /app
# 复制构建产物
COPY target/my-service-0.0.1.jar app.jar
# 暴露端口
EXPOSE 8080
# 健康检查配置
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
# 构建阶段
FROM maven:3.8.6-eclipse-temurin-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# 运行时阶段
FROM eclipse-temurin:17-jre-jammy
WORKDIR /app
COPY --from=builder /build/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
version: '3.8'
services:
user-service:
build:
context: ./user-service
dockerfile: Dockerfile
ports:
- "8081:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- redis
- mysql
order-service:
image: registry.example.com/order-service:1.0.0
ports:
- "8082:8080"
env_file:
- .env.order
redis:
image: redis:7.0-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 10
volumes:
redis_data:
mysql_data:
networks:
backend:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
services:
payment-service:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
services:
inventory-service:
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
创建wait-for.sh
脚本:
#!/bin/sh
until curl -fs http://$1:$2/actuator/health >/dev/null 2>&1; do
>&2 echo "$1 is unavailable - sleeping"
sleep 2
done
>&2 echo "$1 is up - executing command"
exec "$@"
在compose中引用:
command: ["./wait-for.sh", "mysql", "3306", "--", "java", "-jar", "app.jar"]
services:
logstash:
image: docker.elastic.co/logstash/logstash:8.9.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.9.0
kibana:
image: docker.elastic.co/kibana/kibana:8.9.0
ports:
- "5601:5601"
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
services:
auth-service:
read_only: true
security_opt:
- no-new-privileges:true
user: "1000:1000"
deploy:
update_config:
parallelism: 2
delay: 10s
order: start-first
secrets:
db_password:
file: ./secrets/db_password.txt
services:
db:
environment:
DB_PASSWORD: /run/secrets/db_password
secrets:
- db_password
microservices/
├── docker-compose.yml
├── gateway-service/
│ ├── Dockerfile
│ └── target/*.jar
├── product-service/
│ ├── Dockerfile
│ └── src/main/resources/application.yml
└── .env
# 构建并启动所有服务
docker-compose up -d --build
# 查看服务状态
docker-compose ps
# 查看实时日志
docker-compose logs -f
# 扩展服务实例
docker-compose up -d --scale user-service=3
# 执行数据库迁移
docker-compose run --rm flyway migrate
# 环境清理
docker-compose down -v --remove-orphans
netstat -tulnp | grep 8080
lsof -i :8080
docker inspect --format='{{json .State}}' container_id
docker logs container_id --tail 100
docker stats
docker exec -it container_id jcmd 1 VM.native_memory
通过Docker-Compose实现Java微服务的一键化部署,开发者可以: 1. 将部署时间从小时级缩短到分钟级 2. 保证环境一致性,消除”在我机器上能跑”的问题 3. 轻松实现水平扩展和版本回滚
建议进一步结合CI/CD流水线实现自动化部署,并考虑Kubernetes方案应对更大规模的微服务集群管理。
最佳实践提示:定期执行
docker system prune
清理无用资源,使用docker scan
进行安全扫描,保持基础镜像版本更新。 “`
注:本文实际约4500字,完整版可根据需要扩展具体章节的细节内容或添加更多实用案例。建议配合具体项目的Docker化实践进行调优。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。