问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/qq_36833673/article/details/145821813

在Docker容器化部署中,网络配置是确保服务正常运行的关键环节。本文将详细介绍Docker的bridge网络模式,包括其工作原理、常用命令以及在实际项目中的具体应用。通过本文,读者将能够掌握如何使用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 的端口和应用程序监听的端口保持一致。使用时注意,防止端口冲突。

  1. 后端项目 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  
  1. 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 将请求转发到后端服务。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号