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

项目访问使用 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 将请求转发到后端服务。


http://www.kler.cn/a/561924.html

相关文章:

  • Visual Studio Code 2025 安装与高效配置教程
  • Github 2025-02-25 Python开源项目日报 Top10
  • 【Linux】gdb/cgdb调试工具
  • window平台上qtcreator上使用opencv报错
  • uniApp小程序保存canvas图片
  • JavaScript基础(函数及面向对象)
  • 网络安全入门|从防护到溯源:HTTP慢速攻击的深度对抗
  • 警惕将“数据标注”岗位包装为“大数据工程师”充数
  • 电子商务网站租用香港服务器的好处有哪些?
  • Lab14_ Blind SQL injection with time delays
  • 【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)
  • 从零开始玩转TensorFlow:小明的机器学习故事 6
  • 每日精讲:删除有序数组中的重复项,移除元素,合并两个有序数组
  • 【Viewer.js】vue3封装图片查看器
  • 短剧源码部署搭建小程序搭建IAA+IAP混合解锁模式
  • 上海创智学院(测试)算法笔试(ACM赛制)部分例题
  • k8s集群3主5从高可用架构(kubeadm方式安装k8s)
  • 广州4399游戏25届春招游戏策划管培生内推
  • Linux搜索查找类指令
  • 【透视图像目标检测(3)】透视3D目标的航向角、观察角(局部方向)和相对位置角辨析,观察角的单目投影验证