当前位置: 首页 > news >正文

项目访问使用 docker bridge 网络模式(端口映射)配置详解

        在平常的开发工作中,我们经常需要部署项目。比如部署测试环境、生产环境等,使用 docker 方式部署很便捷,可以有效的减少同样的代码换环境运行的问题。docker 常见的网络模式有 host、bridge 等。host 模式直接共享宿主机的网络栈,容器之间没有进行网络隔离,容器内的应用监听的端口会直接映射到主机的端口上,无需进行端口映射,网络安全性相对较差。bridge 是 docker 默认的网络模式 ,docker 守护进程会建立 docker0 的虚拟网桥,容器会连接到这个网桥上,并获得一个独立的 IP 地址,容器之间及容器与外部网络之间都通过 docker0 网桥进行通信,需要进行网络地址转换 (NAT)。今天,我们总结下 bridge 桥接模式的用法。

     一:概述

        bridge 模式为 docker 默认的网络模式,docker 会创建一个 docker0 的虚拟网桥。主要用于连接宿主机和容器之间的网络通信。通过创建虚拟的桥接设备,将物理网络接口与虚拟网络网络接口连接起来,进行网络隔离,使得容器的访问更加的安全。在同一 bridge 网络中,容器可以通过 IP 地址或者容器名互相访问,每个容器有独立的 IP 地址,网络内部有 DNS 解析服务,将容器名解析到对应的 IP 地址,实现通过容器名访问。

     二:docker 网络命令

        1:查看所有的网络:docker network ls

        

        2:创建网络:docker network create my_network

        

        3:删除网络:docker network rm my_network

        

        4:查看网络详细信息:docker network inspect my_network

        

        5:将容器连接到网络:docker network connect my_network my_container

        

        6:将容器与某个网络的连接断开:docker network disconnect my_network my_container

        

        7:删除未使用的网络:docker network prune

     三:nginx 端口映射

        在 docker-compose.yml 文件中进行端口映射,配置使用 my_network 自定义网络,如下:

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    environment:
      TZ: Asia/Shanghai
    ports:
      - "80:80"
      - "443:443"
      - "8090:8090"
    volumes:
      # 配置文件映射
      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      # 页面目录
      - /usr/local/docker:/usr/share/nginx/html
    privileged: true
    networks: 
      - my_network

# 如果定义了多个服务,自定义网络一定要放在配置文件末尾
networks:
  my_network:
    external: true
    drive: bridge

       ports 端口相关配置命令解释:

       指将容器的端口映射到宿主机端口上,格式为:宿主机端口:容器端口,80 端口映射为 http 方式访问默认端口,443 端口为 https 方式访问默认端口。8090 一般为自定义的端口映射。通过 ports 端口映射,浏览器等可以通过宿主机的 IP 和端口访问容器内的服务。如果没有 ports 映射,容器内的服务只能在 Docker 网络内部访问,外部网络无法访问。通过 ports 端口映射,可以灵活便捷的管理端口。浏览器能访问的端口必须在 ports 中定义,否则外部网络无法访问容器内的服务。如果不需要外部网络访问,仅容器之间互相通信,可以不配置 ports,使用 Docker 内部网络即可。

     四:后端服务端口配置

        1:Dockerfile 配置

# 使用OpenJDK 17基础镜像
FROM openjdk:17
RUN mkdir -p /ruoyi/logs
# 切换工作目录
WORKDIR /ruoyi
# 配置环境变量
ENV SERVER_PORT=9016 \
    LC_ALL=C.UTF-8 \
    JAVA_OPTS=""
# 暴露应用端口
EXPOSE 9016
# 添加应用Jar包到容器中
ADD ruoyi-admin.jar ./app.jar
# 设置容器的启动命令,支持暴露两个端口
ENTRYPOINT ["java", \
           "-Dserver.port=${SERVER_PORT}", \
           "-jar", "app.jar"]

       端口配置相关命令解释:

        ENV SERVER_PORT=9016:如果项目中是动态获取监听端口,那么需要在 Dockerfile 中进行配置是必要的,如果在应用程序中已经硬编码了监听端口,那么在 Dockerfile 中 ENV SERVER_PORT=9016 设置就没有实际意义。

        EXPOST 端口1 端口2:这个暴露的端口其实是一种指导作用,EXPOSE 并不会真正的将端口暴露给外部网络,容器内的应用程序是否监听该端口,宿主机能否访问该端口,要通过其他配置实现,实际是指导告诉镜像的使用人员应用程序可能监听了这些端口。一般为了使用清晰和方便端口管理,建议EXPOSE 的端口和应用程序监听的端口保持一致。使用时注意,防止端口冲突。

         2:后端项目 docker-compose.yml 配置文件

services:
  ruoyi-admin:
    image: ruoyi-admin:v1.0
    container_name : ruoyi-admin
    ports:
      - "9016:9016"
    environment:
      - SERVER_PORT=9016
      - TZ=Asia/Shanghai
    restart: always
    networks:
      - my_network

networks:
 my_network:
   external: true

       3:nginx.conf 配置

user  nginx;
worker_processes  auto;

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 {
        listen 8090;
        server_name localhost;

	    charset utf-8;

        location / {
           # 容器之间通过 IP 互相访问
           proxy_pass http://172.24.0.2:9016;
           # 容器之间通过 容器名称 互相访问
           proxy_pass http://ruoyi-admin:9016;
           index index.html index.htm;
        }
    }
}

        注意:

        在自定义 docker 网络中,每个容器之间网络是隔离的。localhost 在每个容器中都指向容器自身的网络接口。当用 localhost 转发时,会转发到 nginx 容器自身,而不是后端服务。在这种情况下,应该使用容器在 docker 内的 IP 地址或者 容器名称进行互相通信。

        当网络模式为 host 模式时,共享主机的网络栈,容器和宿主机共享相同的 IP 地址和端口。容器内的 localhost 即 宿主机的 localhost。那么在 nginx 文件中配置 http://localhost:端口号 时,就可以转发到对应的后端服务。nginx 容器和后端服务都在同一网络环境下,localhost 能够指向宿主机上的对应端口。

     五:测试

        启动 nginx、启动 java 项目,输入 nginx 监听的端口或者 后端服务docker-compose.yml 中定义的端口映射,访问成功,页面如下:

     六:总结

       如果是开发环境,可以直接使用 host 网络模式,直接共享宿主机的网络栈,使用起来更加的方便,减少端口管理问题。

        如果是测试环境或者生产环境,建议使用自定义网络模式,不同的容器在不同的网络模式中,可以保证容器访问的安全,与外部网络互相隔离。容器内部之间可以通过 docker 内部网络 IP 地址或者容器名称进行互相通信。使用自定义网络模式,一定要注意端口映射,端口管理相对复杂。

       network_mode 和 networks 都是 docker 网络配置相关。network_mode 直接指定网络模式,支持 bridge、host、none 等模式。只支持一种网络模式。networks 支持自定义网络、多网络配置,支持 bridge、overlay 等驱动,支持一个容器加入多个网络。

       使用自定义网络,如果后端服务没有暴露端口,那么要确保 nginx、后端服务等容器在同一个 docker 网络中,这样在浏览器中能访问 nginx 监听的端口转发到后端服务。使用自定义网络,就是为了网络隔离,容器一般情况下不给外部暴露端口。如 mysql 服务 和 后端服务没有在同一个自定义网络中,但是ports 主要就是将容器内的端口映射到宿主机的端口,允许外部网络访问容器内的服务。后端项目如果没有定义 ports,外部网络无法直接访问后端服务,nginx 可以通过容器名称访问后端服务。nginx 定义了 ports,将宿主机的端口映射到容器的端口上,外部网络可以访问 nginx,nginx 将请求转发到后端服务。

相关文章:

  • 全域旅游景区导览系统:赋能智慧旅游生态,破解行业核心难题
  • 外发抄板SCH与PCB检查系列
  • React七Formik
  • 2025.2.25学习内容
  • 【python随手记】——读取文本文件内容转换为json格式
  • 【机器学习】梯度下降法及使用一元二次方程模拟使用梯度下降法的代码实现
  • 45.matlab产生正弦叠加信号
  • 系统运维方案,系统运维的主要工作内容和运维检查单等资料,设备监控,设备运维检查(Word)
  • Redis 中有序集合(Sorted Set)的使用方法
  • java进阶学习IO流
  • 大厂都在用的前端换肤方案:多品牌适配 + 夜间模式全解析
  • Vue 3 零基础入门:从计数器应用开始你的工程化之旅 - 深入理解 Vue 3 响应式系统
  • 详解 torch.triu:上三角矩阵的高效构造(中英双语)
  • Linux 之 Centos 安装Consul
  • maven Problem shading JAR的几个解决方案
  • java进阶学习脑图
  • deepseek_v3_base和deepseek_r1_zero和deepseek_r1
  • 【深入浅出:Core-JS Legacy 的降级兼容指南】
  • Filter-入门
  • uni-app 登录成功后自动跳转至登录前页面(H5\微信小程序)
  • 装饰网站banner/百度一下首页版
  • 万网怎么建立网站/搜索量用什么工具查询
  • the7.3 wordpress/windows优化工具
  • 女生做网站推广/永久8x的最新域名
  • 陕西服装网站建设/软文网站推荐
  • 整形医院网站建设/网店推广方案策划书