docker 多服务只暴露一个客户端
业务场景
docker部署多个服务时候,当为了安全考虑 部署了多个服务,数据库,缓存库,文件服务器啥的,如果全都暴露的话可能会增加资源侵入的风险,所以只需要挂载一个客户端端口给外部访问即可,其他服务均在内网,保障资源安全
docker 网络
可以把容器们都放在同一网络下,由于docker 容器ip不固定,所以使用容器名,让同一网络可以根据容器名字进行访问
#minio \
docker run -p 9000:9000 -p 9090:9090 \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=tskradmin" \
-v /home/docker/minio/data:/data \
-v /home/docker/minio/config:/root/.minio \
minio/minio:latest server /data
# 创建一个 Docker 网络
docker network create app-network
# 启动 MySQL 容器并连接到 Docker 网络
#挂载sql
#docker cp ./mdm.sql mysql-container:/home.mdm.sql
#创建数据库
#CREATE DATABASE mdm;
#USE mdm;
#SOURCE /home.mdm.sql;
#docker exec -it mysql-container sh -c "mysql -u root -p2383560016 < /mdm.sql"
docker run -d \
--name mysql-container \
--network app-network \
-e MYSQL_ROOT_PASSWORD=2383560016 \
--restart unless-stopped \
mysql:8.0.23
# 启动 Redis 容器并连接到 Docker 网络
docker run -d \
--name redis \
--network app-network \
-v /home/docker/redis/data:/data \
redis:latest \
redis-server --appendonly yes
#后端
docker run -id --name=backend-service --network app-network app
docker run -id -p 7979:4000 --name=fornt-service --network app-network vue
上面的脚本中只有文件服务,和前端服务是挂载端口暴露给外网的,目的是给用户下载和访问服务得途径,其他服务 全部在同一网络桥下
docker network inspect app-network
查看网络下多少容器
此时容器之间就可以采用容器名进行通信并且 外网无法访问
后端配置文件
spring:
data:
redis:
database: 1
host: redis
port: 6379
# password: tskrdevadmin
timeout: 6000ms # 连接超时时长(毫秒)
datasource:
dynamic:
hikari: # Hikari 连接池全局配置
connection-timeout: 30000 # 等待连接池分配链接的最大时长(毫秒),超过这个时长还没有可用的连接则发生 SQLException,默认:30 秒
minimum-idle: 2 # 最小空闲连接数
maximum-pool-size: 10 # 最大连接数
idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10 分钟
max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认: 30 分钟
connection-test-query: SELECT 1
primary: master
datasource:
master:
# MySQL8
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:// mysql-container:3306/mdm?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: root
password: 2383560016
# 达梦
# driver-class-name: dm.jdbc.driver.DmDriver
# url: jdbc:dm://192.168.3.19:5236/maku_boot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
# username: maku_boot
# password: 12345678
# PostgreSQL
# driver-class-name: org.postgresql.Driver
# url: jdbc:postgresql://192.168.3.19:5432/postgres
# username: postgres
# password: 123456
mqtt:
host: tcp://localhost:1883
username: maku
password: maku
clientId: maku_boot_service_dev
default-topic: topic_default
后端服务均采用服务名通信
对应得前都要由于反向代理或者负载均衡,所以需要修改nginx配置文件
nginx文件
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 1024M;
#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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 4000;
server_name 域名;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 配置代理,解决跨域问题
location /api/ {
rewrite ^/api/(.*)$ /$1 break; # 去掉 /api 前缀
proxy_pass http://backend-service:8080/;
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;
}
}
前端得axios配置
vite env.production文件
//就是前端部署地址 确保请求成功达到nginx转发给内网得后端
VITE_API_URL=http://服务器:7979/api