使用Docker Compose快速部署Java+Nginx+Redis

如何使用docker-compose快速搭建一个涵盖Java、MySQL、Nginx和Redis的完整开发环境。此设置特别适合开发团队,因为它允许快速部署和测试应用,同时确保环境一致性。

前提条件

在开始之前,请确保你的系统已安装以下软件:

  • Docker
  • Docker Compose

可以在Docker-Compose安装部署全指南-CSDN博客找到安装指南。

描述

  • project-root/: 这是项目的根目录,所有的服务配置文件和相关文件都存放在这里。
  • docker-compose.yaml: 这个文件包含了定义所有服务(如Nginx、Redis、Java应用)的Docker容器配置。
  • nginx/: 存放Nginx相关配置文件的目录。
    • nginx.conf: Nginx服务器的主配置文件。
    • conf.d/: 存放Nginx服务器额外配置文件的目录,如虚拟主机配置。
      • default.conf: 一个示例虚拟主机配置文件。
    • cert/: 存放SSL证书文件的目录。
    • logs/: Nginx的日志文件目录。
    • wwwroot/: 存放网站静态文件的目录。
    • ossfs/: 示例目录,可能用于存放对象存储挂载点。
  • redis/: 存放Redis配置文件的目录。
    • redis.conf: Redis的配置文件。
  • java/: 存放Java应用jar文件的目录。
    • pantum-system-1.0.0.jar: 系统服务的jar包。
    • pantum-finder-1.0.0.jar: 查找服务的jar包。
  • logs/: 存放应用日志文件的目录。
project-root/
│
├── docker-compose.yaml
│
├── nginx/
│   ├── nginx.conf
│   ├── conf.d/
│   │   └── default.conf
│   ├── cert/
│   ├── logs/
│   ├── wwwroot/
│   └── ossfs/
│
├── redis/
│   └── redis.conf
│
├── java/
│   ├── pantum-system-1.0.0.jar
│   └── pantum-finder-1.0.0.jar
│
└── logs/

准备配置文件

首先,我们需要准备docker-compose.yaml文件和Nginx的配置文件。请按照以下步骤准备这些文件。

1. 创建docker-compose.yaml

创建一个docker-compose.yaml文件,并填入以下内容:

version: "3.4"
services:
  #NGINX
  nginx: 
    image: registry.cn-beijing.aliyuncs.com/kfyz/nginx:1.21
    container_name: nginx
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.utf8
      - LC_ALL=en_US.utf8
    networks:
      app_net:
        ipv4_address: 172.16.40.9
    ports: 
      - "80:80"
      - "443:443"
    dns:
      - "114.114.114.114"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/cert:/etc/nginx/cert
      - ./nginx/wwwroot:/www/wwwroot/
      - ./dist:/www/wwwroot/dist
      - ./nginx/logs:/etc/nginx/logs
      - ./ossfs:/data/ossfs
    healthcheck:
      test: ["CMD-SHELL", "netstat -tunlp | grep 80 || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3
    depends_on:
      - system
      - finder

  #Redis
  redis: 
    image: registry.cn-beijing.aliyuncs.com/kfyz/redis:7.2
    container_name: redis
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.utf8
      - LC_ALL=en_US.utf8
    networks:
       app_net:
        ipv4_address: 172.16.40.10
    dns:
      - "114.114.114.114"
    volumes:
      - ./redis/redis.conf:/etc/redis/redis.conf
    command: ["redis-server","/etc/redis/redis.conf"]
    healthcheck:
      test: ["CMD-SHELL", "netstat -tunlp | grep 6379 || exit 1"]
      interval: 10s
      timeout: 10s
      retries: 3

  #system
  system:
    image: registry.cn-beijing.aliyuncs.com/kfyz/java:1.8
    container_name: system
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.utf8
      - LC_ALL=en_US.utf8
    networks:
      app_net:
        ipv4_address: 172.16.40.13
    ports:
      - "9001:9001"
    dns:
      - 114.114.114.114
    volumes:
      - ./java:/www/wwwroot/back
      - ./logs:/www/wwwroot/logs
      - ./nginx/wwwroot:/www/wwwroot/
      - ./ossfs:/www/wwwroot/userfiles
    command: 'java -Xms2048m -Xmx2048m -jar /www/wwwroot/back/pantum-system-1.0.0.jar --spring.profiles.active=prod > /www/wwwroot/logs/`date +%Y%m%d`_system.log'
    healthcheck:
      test: ["CMD-SHELL", "netstat -an |grep 9001 || exit 1"]
      interval: 2m
      timeout: 10s
      retries: 3
    depends_on:
      - redis

  #finder
  finder:
    image: registry.cn-beijing.aliyuncs.com/kfyz/java:1.8
    container_name: finder
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.utf8
      - LC_ALL=en_US.utf8
    networks:
      app_net:
        ipv4_address: 172.16.40.14
    ports:
      - "10810:10810"
    dns:
      - 114.114.114.114
    volumes:
      - ./java:/www/wwwroot/back
      - ./logs:/www/wwwroot/logs
      - ./nginx/wwwroot:/www/wwwroot/
      - ./ossfs:/www/wwwroot/userfiles
    command: 'java -Xms2048m -Xmx2048m -jar /www/wwwroot/back/pantum-finder-1.0.0.jar --spring.profiles.active=prod > /www/wwwroot/logs/`date +%Y%m%d`_finder.log'
    healthcheck:
      test: ["CMD-SHELL", "netstat -an |grep 10810 || exit 1"]
      interval: 2m
      timeout: 10s
      retries: 3
    depends_on:
      - redis

networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.40.0/24

2. 准备Nginx配置

nginx文件夹下创建nginx.confconf.d/default.conf,确保这些文件配置正确,以满足你的应用需求。

nginx.conf
user  nginx;
worker_processes  8;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server_names_hash_bucket_size 512;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 2048m;

    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;
    tcp_nopush     on;

    keepalive_timeout 1800;
    keepalive_requests 10000;
    tcp_nodelay on;

    send_timeout 180;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 126k;
    fastcgi_buffers 8 128k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 512k;
    fastcgi_intercept_errors on;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 4;
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
    gzip_vary on;
    gzip_proxied   expired no-cache no-store private auth;
    gzip_disable   "MSIE [1-6]\.";

    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;

    server_tokens off;
    include /etc/nginx/conf.d/*.conf;
}

default.conf
#后台服务
upstream system_api_server {
    server system:9001 max_fails=2 fail_timeout=30s;
    keepalive 1000;
}

#后台
server {
    listen 80;
    server_name xxxxxx;
    rewrite ^(.*)$ https://xxxxx$1 permanent;
}

server {
    listen 443 ssl;
    server_name xxxx;
    root "/www/wwwroot/dist";
    ssl_certificate   /etc/nginx/cert/xxxx_bundle.pem;
    ssl_certificate_key  /etc/nginx/cert/xxxx.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    client_max_body_size 2048m;
    access_log  /etc/nginx/logs/xxx.access.log main;
    #后台服务
    location ^~ /system-api {
        proxy_pass http://system_api_server;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:$server_port;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    proxy_ignore_client_abort   on;
    proxy_connect_timeout   18000;
        proxy_send_timeout      18000;
        proxy_read_timeout      18000;
        fastcgi_connect_timeout 3000;
        fastcgi_read_timeout 3000;
        fastcgi_send_timeout 3000;
        fastcgi_buffer_size 128k;
        fastcgi_buffers   8 128k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
    #后台前端页面
    location  / {
        try_files $uri $uri/ /index.html;
    } 
    error_log  /etc/nginx/logs/error.xxx_system-api.log debug;
}

启动服务

在准备好所有配置文件后,你可以通过以下命令来启动所有服务:

docker-compose up -d

该命令将在后台启动定义在docker-compose.yaml文件中的所有服务。

验证服务状态

要查看服务的状态,可以运行:

docker-compose ps -a 

此命令会列出所有服务的状态,确保它们都正确运行。

访问应用

根据你的Nginx配置,你应该能够通过配置的域名或IP地址加端口号访问你的应用。例如,如果你配置了Nginx监听80端口,那么就可以直接通过浏览器访问。

总结

通过本教程,你已经学会了如何使用Docker Compose来快速部署一个包含Java、Nginx和Redis的环境。这种方法不仅能加快开发和部署过程,还能保证环境的一致性,帮助团队高效地协作。如需进一步定制你的环境,可以根据实际需求调整docker-compose.yaml和相关配置文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值