单独Docker部署和Docker Compose部署

一、背景

项目Spingboot java1.8、nginx、mysql通过docker的方式或dockerfile的方式进行部署,进阶用docker compose进行部署。

二、单独Docker部署方式

1. Spring Boot应用Dockerfile

复制代码
#Spring Boot应用Dockerfile
FROM openjdk:8-jre-alpine

# 安装必要的工具
RUN apk add --no-cache bash

# 设置工作目录
WORKDIR /app

# 复制jar包到容器中
COPY oss-0.0.1-SNAPSHOT.jar oss-0.0.1-SNAPSHOT.jar

# 创建非root用户
RUN addgroup -S spring && adduser -S spring -G spring
USER spring

# 暴露端口
EXPOSE 8080

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8180/actuator/health || exit 1

# 启动应用
ENTRYPOINT ["java", "-jar", "/app/oss-0.0.1-SNAPSHOT.jar"]

2. Nginx配置和Dockerfile

创建 nginx/nginx.conf

复制代码
# nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log /var/log/nginx/access.log main;
    sendfile on;
    keepalive_timeout 65;
    
    # 上游Spring Boot服务
    upstream springboot_app {
        server springboot-app:8180;
    }
    
    server {
        listen 80;
        server_name localhost;
        
        # 静态文件缓存
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
        
        # API代理
        location /api/ {
            proxy_pass http://springboot_app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
        
        # 应用代理
        location / {
            proxy_pass http://springboot_app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

创建 nginx/Dockerfile

复制代码
#nginx/Dockerfile
FROM nginx:alpine

# 复制自定义配置
COPY nginx.conf /etc/nginx/nginx.conf

# 暴露端口
EXPOSE 80

# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

3. 单独部署命令

复制代码
# 1. 构建Spring Boot应用镜像 切换到当前目录执行
docker build -t springboot-app .

# 2. 构建Nginx镜像 切换到当前目录执行
docker build -t my-nginx .

# 3. 创建网络
docker network create app-network

# 4. 启动MySQL容器
docker run -d --name mysql-db --network app-network -p 3306:3306  -e MYSQL_ROOT_PASSWORD=rootpassword -e MYSQL_DATABASE=myapp -e MYSQL_USER=appuser  -e MYSQL_PASSWORD=123456  -v mysql_data:/var/lib/mysql mysql:8.0.22

# 5. 启动Spring Boot应用容器
docker run -d --name springboot-app --network app-network -p 8080:8080 springboot-app

# 6. 启动Nginx容器
docker run -d --name nginx-proxy --network app-network -p 80:80 my-nginx

4.部署结果

java应用正常访问:

数据库可以正常访问:

5.相关命令

复制代码
1、查看容器
docker ps -a

2、查询镜像
docker images

3、停止容器
docker stop 容器名称

4、删除容器
docker rm 容器名称

# 拉取镜像
docker pull nginx:latest
 
# 运行容器
docker run -d -p 80:80 --name my-nginx nginx
 
# 停止容器
docker stop my-nginx
 
# 启动容器
docker start my-nginx
 
# 进入容器
docker exec -it my-nginx bash
 
# 构建镜像
docker build -t my-app:1.0 .
 
# 查看镜像
docker images

# 删除指定标签的镜像
docker rmi springboot-app:latest

# 或者
docker rmi my-nginx:1.0

# 使用镜像ID删除(更准确)
docker rmi <镜像ID>

# 查看网络
docker network ls

# 启动docker
systemctl start docker

# 查看docker状态
systemctl status docker

# 重新加载配置信息
systemctl daemon-reload

# 重启docker
systemctl restart docker

三、Docker Compose 部署流程方式

1、方式一、在有镜像的情况(之前构建的镜像)

步骤1:创建 docker-compose.yml

复制代码
services:
  mysql:
    image: mysql:8.0.22
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: 123456
      MYSQL_ROOT_HOST: '%'
    command: 
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  springboot-app:
    image: springboot-app:latest
    container_name: springboot-app
    environment:
      SERVER_PORT: 8180
    ports:
      - "8080:8180"
    depends_on:
      mysql:  # 关键修复:使用服务名 "mysql" 而不是 "mysql-db"
        condition: service_healthy
    networks:
      - app-network

  nginx:
    image: my-nginx:latest
    container_name: my-nginx
    ports:
      - "80:80"
    depends_on:
      - springboot-app
    networks:
      - app-network

volumes:
  mysql_data:

networks:
  app-network:
    driver: bridge

# 检查所有服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 测试应用访问
curl http://localhost/actuator/health
curl http://localhost:8080/actuator/health

# 测试数据库连接
docker-compose exec mysql mysql -u appuser -papppassword -e "SHOW DATABASES;"

2、常用 Docker Compose 命令

复制代码
# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 停止服务并删除数据卷(谨慎使用)
docker-compose down -v

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs [service-name]

# 重启特定服务
docker-compose restart springboot-app

# 缩放服务(如果有多个实例)
docker-compose up -d --scale springboot-app=2

# 停止单个服务
docker-compose stop mysql

# 停止多个特定服务
docker-compose stop springboot-app nginx

# 查看服务状态
docker-compose ps

# 停止特定容器
docker stop mysql-db

# 或者使用容器ID
docker stop <container-id>

# 重启单个服务
docker-compose restart mysql

# 强制重启(先停止再启动)
docker-compose restart --force mysql

# 查看所有服务状态
docker-compose ps

# 查看特定服务状态
docker-compose ps mysql

# 查看服务日志
docker-compose logs mysql
docker-compose logs -f mysql  # 实时查看日志

# 停止 MySQL 服务
docker-compose stop mysql

# 启动 MySQL 服务
docker-compose start mysql

# 停止并重新创建 MySQL 服务
docker-compose up -d --force-recreate mysql

# 进入 MySQL
docker-compose exec mysql bash

# 进入 Spring Boot
docker-compose exec springboot-app sh

# 进入 Nginx
docker-compose exec nginx sh

# 进入 Jenkins
docker-compose exec jenkins bash

# 查看所有运行中的容器
docker-compose ps

# 查看容器日志
docker-compose logs [service-name]

3、没有镜像的情况

复制代码
services:
  mysql:
    image: mysql:5.7
    container_name: mysql-db
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppassword
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10

  springboot-app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: springboot-app
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/myapp?useSSL=false&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: appuser
      SPRING_DATASOURCE_PASSWORD: apppassword
      SPRING_PROFILES_ACTIVE: docker
    ports:
      - "8080:8080"
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - springboot-app
    networks:
      - app-network

volumes:
  mysql_data:

networks:
  app-network:
    driver: bridge

3、安装可视化工具Portainer,在compose里面添加重启即可

复制代码
 portainer:
    image: portainer/portainer-ce:latest  # 使用社区版
    container_name: portainer
    restart: unless-stopped  # 容器退出时自动重启,除非手动停止
    ports:
      - "9000:9000"  # 将容器的9000端口映射到宿主机的9000端口
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock  # 挂载Docker套接字以管理Docker[citation:1][citation:3]
      - portainer_data:/data  # 持久化Portainer数据[citation:1]
    networks:
      - app-network  # 连接到同一网络,以便管理其他服务

volumes:
  mysql_data:
  jenkins_data:
  portainer_data:

效果:http://192.168.23.163:9000/

相关推荐
lkbhua莱克瓦242 小时前
Java练习——数组练习
java·开发语言·笔记·github·学习方法
趙卋傑2 小时前
常见排序算法
java·算法·排序算法
Slow菜鸟2 小时前
Java后端常用技术选型 |(四)微服务篇
java·分布式
武子康2 小时前
Java-168 Neo4j CQL 实战:WHERE、DELETE/DETACH、SET、排序与分页
java·开发语言·数据库·python·sql·nosql·neo4j
Filotimo_2 小时前
SpringBoot3入门
java·spring boot·后端
通往曙光的路上3 小时前
SpringIOC-注解
java·开发语言
一 乐3 小时前
校园墙|校园社区|基于Java+vue的校园墙小程序系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
TT哇3 小时前
【面经 每日一题】面试题16.25.LRU缓存(medium)
java·算法·缓存·面试
青云交3 小时前
Java 大视界 -- 基于 Java 的大数据联邦学习在跨行业数据协同创新中的实践突破
java·分布式计算·隐私保护·apache flink·大数据联邦学习·跨行业数据协同·安全通信