如何使用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.conf
和conf.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
和相关配置文