欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 项目访问使用 docker bridge 网络模式(端口映射)配置详解

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

2025/2/26 20:38:58 来源:https://blog.csdn.net/qq_36833673/article/details/145821813  浏览:    关键词:项目访问使用 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:latestcontainer_name: nginxenvironment:TZ: Asia/Shanghaiports:- "80:80"- "443:443"- "8090:8090"volumes:# 配置文件映射- /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf# 页面目录- /usr/local/docker:/usr/share/nginx/htmlprivileged: truenetworks: - my_network# 如果定义了多个服务,自定义网络一定要放在配置文件末尾
networks:my_network:external: truedrive: 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.0container_name : ruoyi-adminports:- "9016:9016"environment:- SERVER_PORT=9016- TZ=Asia/Shanghairestart: alwaysnetworks:- my_networknetworks: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 将请求转发到后端服务。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词