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

news/2025/2/26 6:47:03

        在平常的开发工作中,我们经常需要部署项目。比如部署测试环境、生产环境等,使用 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 将请求转发到后端服务。


http://www.niftyadmin.cn/n/5868246.html

相关文章

mysql逻辑备份 mysqldump和mydumper实践

1.mysqldump mysqldump -uroot -pPassw0rd* testdb1 --single-transaction --set-gtid-purgedoff > 1.sql 注意:--single-transaction不会锁表,如果 不加这个参数会在全表上加S锁,不允许更新和删除,还有--set-gtid-purged…

网络安全考题

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 1。简述子网掩码的工作原理。 子网掩码也是一个32位地址,其作用是: 用于屏蔽IP地址的一部分以区分网络标识和主机标识,并说明该…

《论湖仓一体架构及其应用》审题技巧 - 系统架构设计师

软考论文写作框架 一、考点概述 “湖仓一体架构及其应用”这一论题,主要考察了考生对现代数据管理系统中湖仓一体架构的理解、应用及问题解决能力。随着5G、大数据、人工智能、物联网等技术的快速发展,企业数据的管理需求正发生深刻变化。传统的数据管…

深度学习进阶:构建多层神经网络

在上一篇文章中,我们从零开始构建了一个简单的两层神经网络,并通过异或问题(XOR)展示了神经网络的强大能力。今天,我们将进一步深入,构建一个更复杂的多层神经网络,并引入更多高级概念&#xff…

Kafka可视化工具EFAK(Kafka-eagle)安装部署

Kafka Eagle是什么? Kafka Eagle是一款用于监控和管理Apache Kafka的开源系统,它提供了完善的管理页面,例如Broker详情、性能指标趋势、Topic集合、消费者信息等。 源代码地址:https://github.com/smartloli/kafka-eagle 前置条件…

4.static关键字和const关键字的作用【高频】

1. static 关键字: 用static可以声明 静态变量,它存储在静态存储区中,它的生命周期 在整个程序运行期间 都存在。 静态局部变量: 参考之前 静态全局变量: 参考之前 类中的静态成员 在类中,被static声明…

React 源码揭秘 | hooks原理

上篇我们说了updateQueue的实现原理,这篇我们说一下hooks, fiberHooks实现可以在react-reconciler/fiberHooks.ts 找到。 老生常谈的问题,为什么hooks有顺序,hook函数怎么知道你在哪运行的hooks? 下面我们逐一讨论。…

kafka队列堆积的常见解决

1. 检查生产者是否正常工作 如果生产者速度太慢或者不稳定,可以通过增加生产者吞吐量来解决。 解决方案: 提高生产者的吞吐量:可以通过调整生产者配置来增加吞吐量。 设置生产者 acks 参数为 1 或 0(如果不需要严格的消息确认&…