单独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/

相关推荐
yihuiComeOn11 小时前
【大数据高并发核心场景实战】 - 设计秒杀架构必知必会的那些事
java·后端·微服务·架构
了一梨11 小时前
Docker基础使用
linux·docker·容器
iナナ11 小时前
Java自定义协议的发布订阅式消息队列(一)
java·开发语言·spring·消息队列·生成消费者模型
一直都在57211 小时前
手写tomcat(2):Servlet原理和自定义tomcat
java·servlet·tomcat
Seven9711 小时前
数据结构——树
java
李贺梖梖11 小时前
day05 数组
java
古城小栈11 小时前
Jenkins 自动构建 搞起来
java·servlet·jenkins
又是忙碌的一天11 小时前
servlet的体系原理+tomcat原理
java·servlet·tomcat
一叶飘零_sweeeet11 小时前
Java 17 异步多线程视频上传实战
java·文件上传
百锦再11 小时前
.NET到Java的终极迁移指南:最快转型路线图
android·java·开发语言·python·rust·go·.net