一、背景
项目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/
