docker 多服务只暴露一个客户端

业务场景

docker部署多个服务时候,当为了安全考虑 部署了多个服务,数据库,缓存库,文件服务器啥的,如果全都暴露的话可能会增加资源侵入的风险,所以只需要挂载一个客户端端口给外部访问即可,其他服务均在内网,保障资源安全

docker 网络

可以把容器们都放在同一网络下,由于docker 容器ip不固定,所以使用容器名,让同一网络可以根据容器名字进行访问

bash 复制代码
#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

上面的脚本中只有文件服务,和前端服务是挂载端口暴露给外网的,目的是给用户下载和访问服务得途径,其他服务 全部在同一网络桥下

bash 复制代码
 docker network inspect app-network

查看网络下多少容器

此时容器之间就可以采用容器名进行通信并且 外网无法访问

后端配置文件

yaml 复制代码
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文件

js 复制代码
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文件

js 复制代码
//就是前端部署地址 确保请求成功达到nginx转发给内网得后端
VITE_API_URL=http://服务器:7979/api
相关推荐
pk_xz12345622 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强24 分钟前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock2 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
昌sit!5 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林6 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
A ?Charis8 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision8 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge8 小时前
Docker篇(Docker Compose)
运维·docker·容器
李启柱8 小时前
项目开发流程规范文档
运维·软件构建·个人开发·设计规范