
只读模板包含运行应用所需的代码、运行时、库和配置。 代码、运行时、库和配置 各有什么作用你描述的正是 Docker 中的镜像Image。它是容器的静态蓝图将应用运行所需的一切打包在一起确保了“一次构建到处运行”。下面为你详细解释这四个组成部分各自的作用 代码这是你亲手编写的应用程序本身是镜像的核心。作用它定义了应用的具体业务逻辑和功能。没有代码镜像就只是一个空壳。例子一个 Python 的app.py文件、一个 Java 的.jar包或者一个网站的 HTML/CSS/JavaScript 文件。⚙️ 运行时这是执行你代码所必需的基础环境或引擎。作用它为代码提供了一个可以“跑起来”的平台。不同的编程语言需要不同的运行时。例子运行 Python 代码需要Python 解释器。运行 Java 代码需要Java 虚拟机。运行 Node.js 代码需要Node.js 环境。 库这是你的代码在运行时所依赖的第三方软件包或模块。作用它让开发者不必“重复造轮子”可以直接调用别人写好的、经过验证的功能极大地提高了开发效率。例子一个 Python Web 应用可能需要Flask或Django库来处理网页请求。一个数据分析脚本可能需要NumPy或Pandas库来进行数学计算。 配置这是用于设定应用行为和环境变量的文件。作用它告诉应用“如何启动”以及“在什么环境下运行”让同一份代码可以灵活地适应不同场景如开发、测试、生产环境。例子数据库的连接地址和密码。应用启动时监听的端口号如 80 或 8080。日志记录的级别如 debug 或 info。日志记录的级别如 debug 或 info。 一个生动的比喻你可以把 Docker 镜像想象成一个精心打包的“旅行套装”代码就是你旅行者是这次出行的主体。运行时就是你的身体是你能够行动的基础。库就是你带的衣服、洗漱包、充电宝等工具它们让你能应对各种情况而不需要到了目的地再重新购买。配置就是你的行程单和地图它告诉你去哪里、怎么走、住哪家酒店。这个“旅行套装”镜像打包好后无论你去到哪里任何支持 Docker 的服务器都可以立刻开箱即用完全不用担心当地没有适合你的衣服或找不到路环境不一致问题。Docker容器是什么自律进度追踪器一文看懂Docker从基础到精通成长型动力永动机Docker入门先搞懂这3个核心概念和常用命令小吴日记Docker工作原理原来是这么一回事成长轨迹观察站Docker入门先搞懂镜像和容器自我升级进度条容器与镜像之间有什么关系成长晾晒篓一文看懂Docker面试核心知识点求职能量仓7篇来源一个 Python 的 app.py 文件、一个 Java 的 .jar 包这两个文件虽然一个是 Python 的源代码一个是 Java 的编译产物但在容器化部署的语境下它们的角色其实非常相似——都是那个需要被运行的“核心应用”。我们可以用一个形象的比喻来理解它们的区别 形象的比喻如果把运行程序比作一场音乐会Python 的 app.py 就像是【乐谱】【演奏家】它通常是源代码文本文件。它需要 Python 解释器演奏家一边阅读乐谱一边实时演奏给听众CPU听。这就是为什么 Python 被称为解释型语言。Java 的 .jar 包就像是【录制好的唱片】它是编译后的字节码二进制文件。它不能直接发声必须放入唱机Java 虚拟机中唱机读取唱片内容并播放。这就是为什么 Java 被称为编译型语言编译成字节码。 核心区别对比表格特性 Pythonapp.py Java.jar包文件本质 源代码人类可读的文本 压缩包包含编译后的 .class 字节码运行方式 解释执行 虚拟机执行启动命令 python app.py java -jar app.jar修改代码 修改后通常可直接生效热重载 修改后必须重新编译打包才能生效依赖管理 依赖库如 Flask通常需单独安装 依赖库通常已打包在 JAR 内部Fat Jar 在 Docker 镜像中的处理差异当你把它们放进 Docker 镜像时处理方式也有所不同Python (app.py) 的处理基础镜像选择包含 Python 环境的镜像如 python:3.9。复制文件把 app.py 和 requirements.txt依赖清单复制进镜像。安装依赖运行 pip install 安装第三方库。启动告诉 Docker 运行 python app.py。Java (.jar) 的处理基础镜像选择包含 Java 环境的镜像如 openjdk:11。复制文件把编译好的 .jar 包直接复制进镜像。安装依赖通常不需要因为依赖都在 JAR 包里了。启动告诉 Docker 运行 java -jar app.jar。总结app.py 是原材料Docker 需要帮你准备好厨房Python环境和调料依赖包然后现场烹饪。.jar 是半成品/成品Docker 只需要帮你准备好微波炉JVM放进去加热一下就能吃。Node.js 环境其实很简单你可以把它理解为一个“让 JavaScript 代码跳出浏览器在服务器或电脑上独立运行的软件包”。就像 Python 需要 Python 解释器一样Node.js 环境就是 JavaScript 的“发动机”。为了让你更直观地理解我为你拆解了它的核心构成和两种常见的存在形式 核心构成它里面有什么一个标准的 Node.js 环境主要包含以下三个部分V8 引擎 (心脏)这是 Google Chrome 浏览器使用的 JavaScript 引擎。Node.js 把它拿过来赋予了 JavaScript 极高的运行速度。它负责把你的代码“翻译”成机器能懂的指令。运行时库 (手脚)在浏览器里JS 只能操作网页比如点击按钮、修改文字。但在 Node.js 环境里它长出了“手脚”可以读写电脑文件、操作数据库、监听网络端口。npm (工具箱)这是 Node.js 自带的包管理器。它像一个巨大的“应用商店”你可以从中下载别人写好的工具包比如处理 Excel 的库、搭建网站的框架极大地提高开发效率。 两种常见的“环境”形态根据你之前的提问关于 Docker 和镜像理解 Node.js 环境的两种形态非常重要传统本地环境形态你直接在 Windows、Mac 或 Linux 系统上下载安装包.msi 或 .pkg进行安装。特点Node.js 成为了你操作系统的一部分。缺点容易产生“依赖冲突”。比如项目 A 需要 Node 14项目 B 需要 Node 18在同一台电脑上切换版本比较麻烦通常需要 nvm 等工具。容器化环境形态这就是你之前提到的“镜像”。比如 node:18-alpine 这个镜像它就是一个打包好的 Node.js 环境。特点它把 Node.js 运行时、npm 工具和操作系统的基础库如 Alpine Linux打包在一起。优势隔离且一致。无论你在哪里运行这个容器里面的 Node.js 版本和配置都是完全一样的不会出现“在我电脑上能跑在服务器上跑不了”的问题。 总结Node.js 环境 V8 引擎 系统级 API npm 包管理器如果你写 Python你需要安装 Python 解释器。如果你写 Java你需要安装 JDK/JRE。如果你写 Node.js你就需要安装 Node.js 环境。它的作用就是给 JavaScript 代码提供一个“家”让它不仅能画网页还能干后端服务器的活儿。Docker 提供多种网络驱动 驱动 用途 bridge 默认网络容器间通信 host 共享宿主机网络命名空间 overlay 跨主机通信Swarm 集群 macvlan 为容器分配 MAC 地址 none 禁用网络搜索一下Docker 原生提供bridge、host、overlay、macvlan、none五种核心网络驱动适配单机、跨主机、性能、物理网络直连、完全隔离等不同场景。一、核心网络驱动总览表格驱动用途与核心特性典型场景bridge默认网络创建虚拟网桥如docker0容器获独立私有 IP同一网桥内可通信通过 NAT 访问外部单机多容器通信、开发测试、常规微服务部署host共享宿主机网络命名空间容器无独立 IP直接使用宿主机 IP / 端口无 NAT 开销性能敏感服务如 Nginx、代理、需占用宿主机知名端口overlay跨主机容器通信Swarm 集群基于 VXLAN 封装构建跨节点虚拟网络Docker Swarm 集群、多主机容器化应用、跨节点服务发现macvlan为容器分配独立 MAC 地址使其在网络中表现为物理设备直连物理网络、无 NAT需容器直连物理网络、遗留系统、网络性能要求极高场景none完全禁用网络容器无网卡、无法通信仅本地进程运行安全隔离、离线计算、仅本地文件 / 进程操作二、各驱动详细说明1. bridge桥接原理Docker 自动创建docker0虚拟网桥容器通过 veth pair 接入网桥获私有子网 IP默认172.17.0.0/16。通信同网桥容器可直接通信访问外部需 NAT暴露端口用-p映射。示例bash运行# 启动容器默认 bridge docker run -d --name web nginx # 查看容器 IP docker inspect -f {{.NetworkSettings.IPAddress}} web2. host主机原理容器与宿主机共享网络命名空间无独立网络栈端口与宿主机直接冲突。优势网络性能接近物理机无 NAT 转发损耗。示例bash运行docker run -d --name host-nginx --network host nginx3. overlay覆盖原理基于 VXLAN 封装跨多 Docker 主机构建统一虚拟网络支持 Swarm 服务发现与负载均衡。适用多节点集群、跨主机容器互通。示例Swarm 模式bash运行# 创建 overlay 网络 docker network create -d overlay my-overlay # 启动服务并接入 overlay docker service create --name web --network my-overlay nginx4. macvlan原理绑定宿主机物理网卡如eth0为容器分配 MAC 与物理网段 IP直连物理网络。注意需物理交换机支持多 MAC混杂模式。示例bash运行docker network create -d macvlan \ --subnet192.168.1.0/24 \ --gateway192.168.1.1 \ -o parenteth0 my-macvlan docker run -d --name macvlan-nginx --network my-macvlan nginx5. none无网络特性容器无网卡、无 IP仅本地进程 / 文件操作完全网络隔离。示例bash运行docker run -it --rm --network none busybox三、驱动选型建议单机开发 / 测试优先bridge默认简单易用、隔离性好。性能优先、单机服务选host无 NAT 损耗。多主机集群Swarm用overlay跨节点透明通信。直连物理网络、遗留系统选macvlan性能接近物理机。最高安全隔离、离线任务用none完全断网。Docker 提供多种网络驱动 驱动 用途 bridge 默认网络容器间通信 host 共享宿主机网络命名空间 overlay 跨主机通信Swarm 集群 macvlan 为容器分配 MAC 地址 none 禁用网络搜索一下Docker 原生提供 bridge、host、overlay、macvlan、none 五种核心网络驱动适配单机、跨主机、性能、物理网络直连、完全隔离等不同场景。一、核心网络驱动总览表格驱动 用途与核心特性 典型场景bridge 默认网络创建虚拟网桥如 docker0容器获独立私有 IP同一网桥内可通信通过 NAT 访问外部 单机多容器通信、开发测试、常规微服务部署host 共享宿主机网络命名空间容器无独立 IP直接使用宿主机 IP / 端口无 NAT 开销 性能敏感服务如 Nginx、代理、需占用宿主机知名端口overlay 跨主机容器通信Swarm 集群基于 VXLAN 封装构建跨节点虚拟网络 Docker Swarm 集群、多主机容器化应用、跨节点服务发现macvlan 为容器分配独立 MAC 地址使其在网络中表现为物理设备直连物理网络、无 NAT 需容器直连物理网络、遗留系统、网络性能要求极高场景none 完全禁用网络容器无网卡、无法通信仅本地进程运行 安全隔离、离线计算、仅本地文件 / 进程操作二、各驱动详细说明1. bridge桥接原理Docker 自动创建 docker0 虚拟网桥容器通过 veth pair 接入网桥获私有子网 IP默认 172.17.0.0/16。通信同网桥容器可直接通信访问外部需 NAT暴露端口用 -p 映射。示例bash运行# 启动容器默认 bridgedocker run -d --name web nginx# 查看容器 IPdocker inspect -f {{.NetworkSettings.IPAddress}} web2. host主机原理容器与宿主机共享网络命名空间无独立网络栈端口与宿主机直接冲突。优势网络性能接近物理机无 NAT 转发损耗。示例bash运行docker run -d --name host-nginx --network host nginx3. overlay覆盖原理基于 VXLAN 封装跨多 Docker 主机构建统一虚拟网络支持 Swarm 服务发现与负载均衡。适用多节点集群、跨主机容器互通。示例Swarm 模式bash运行# 创建 overlay 网络docker network create -d overlay my-overlay# 启动服务并接入 overlaydocker service create --name web --network my-overlay nginx4. macvlan原理绑定宿主机物理网卡如 eth0为容器分配 MAC 与物理网段 IP直连物理网络。注意需物理交换机支持多 MAC混杂模式。示例bash运行docker network create -d macvlan \--subnet192.168.1.0/24 \--gateway192.168.1.1 \-o parenteth0 my-macvlandocker run -d --name macvlan-nginx --network my-macvlan nginx5. none无网络特性容器无网卡、无 IP仅本地进程 / 文件操作完全网络隔离。示例bash运行docker run -it --rm --network none busybox三、驱动选型建议单机开发 / 测试优先 bridge默认简单易用、隔离性好。性能优先、单机服务选 host无 NAT 损耗。多主机集群Swarm用 overlay跨节点透明通信。直连物理网络、遗留系统选 macvlan性能接近物理机。最高安全隔离、离线任务用 none完全断网。以后台守护进程模式启动一个 Nginx 容器并且让它直接使用宿主机的网络栈而不是 Docker 默认的桥接网络。这就好比这个容器“借用”了你电脑或服务器的网卡和 IP它不再拥有独立的网络环境。 命令拆解为了让你更清楚每个参数的作用我为你拆解了这条命令表格参数含义作用docker run运行容器创建并启动一个新的容器。-d后台运行容器启动后在后台运行不会占用当前的命令行窗口Detached 模式。--network host使用宿主机网络这是关键点。容器不再拥有独立的 IP而是直接使用宿主机的 IP 和端口。nginx镜像名称指定要运行的镜像是 Nginx。 这条命令的特殊之处Host 模式当你加上--network host后会发生以下变化没有网络隔离容器就像运行在宿主机上的一个普通进程一样。无需端口映射你不需要也不能使用-p 80:80这样的参数。如果 Nginx 默认监听 80 端口它会直接占用宿主机的 80 端口。你可以直接通过宿主机IP:80访问 Nginx。性能更高因为没有经过 Docker 的网桥docker0和 NAT网络地址转换网络传输效率几乎等同于原生应用延迟更低。⚠️ 注意事项与潜在风险虽然这条命令看起来很方便但有几个坑你需要注意端口冲突如果宿主机的 80 端口已经被其他程序比如你原本就装了一个 Apache占用了这个容器就会启动失败报错“Address already in use”。安全性降低容器失去了网络隔离保护。如果 Nginx 被攻破攻击者能更容易地接触到宿主机的其他网络服务。平台限制--network host主要在Linux系统上完美工作。在 Windows 或 macOS 上由于 Docker 是运行在虚拟机里的这个参数的效果会大打折扣或受到限制。 总结这条命令适合对网络性能要求极高或者需要容器直接暴露端口且不想配置繁琐端口映射的场景例如某些高性能网关、监控代理。如果你是初学者或做普通 Web 开发通常建议使用默认的 Bridge 模式即去掉--network host改用-p 8080:80一台机器上跑 10 个 Nginx分别映射为 8081, 8082...8090 内部端口 都是80 可以完全可以这正是 Docker 容器化部署最核心的优势之一。你描述的这种场景——“外部端口不同内部端口相同”不仅是允许的而且是部署微服务和多实例应用时的标准做法。 映射关系一览表我们可以用一张表来清晰地展示这种“多对一”的映射关系表格容器名称容器内部端口 (Container Port)宿主机外部端口 (Host Port)访问地址Nginx 1808081http://localhost:8081Nginx 2808082http://localhost:8082Nginx 3808083http://localhost:8083...80......Nginx 10808090http://localhost:8090 为什么这样可以行得通这背后的原理其实很好理解主要归功于 Docker 的网络隔离机制独立的“小房间”网络命名空间每一个 Docker 容器启动时Docker 都会给它分配一个独立的网络命名空间。你可以把每个容器想象成一个独立的房间。在每个房间里都可以有一个“80号插座”端口。因为房间是隔离的所以房间 A 的“80号插座”和房间 B 的“80号插座”互不干扰。它们都认为自己独占了 80 端口。唯一的“大门”宿主机 IP宿主机就是这栋大楼的公共走廊。在公共走廊上门牌号宿主机端口必须是唯一的。你不能有两个房间都叫“8081号房”那样邮递员数据包就不知道信该送给谁了。所以我们将外部的 8081、8082 等端口分别“接线”到各个房间内部的 80 端口上。帮我分析一下图片内容这张图片是VMware 虚拟网络编辑器的截图它展示了你当前 VMware 软件中配置的三种虚拟网络VMnet0、VMnet1、VMnet8的详细状态。下面我为你逐行解读这些信息帮助你理解它们各自的用途VMnet0桥接模式类型桥接模式 / 自动桥接含义这是“桥接模式”。在这种模式下你的虚拟机就像物理网络中的一台独立电脑。效果虚拟机会直接连接到你物理机的网卡比如你的Wi-Fi或网线并从路由器那里获取一个独立的IP地址。它和你的物理机处于同一网段局域网内的其他设备如手机、其他电脑可以直接访问这台虚拟机。主机连接已连接说明物理机的网卡已经与这个虚拟网络建立了连接。DHCP已启用VMware 会自动为这个网段分配 IP 地址。子网地址192.168.11.0这意味着如果你的虚拟机使用 VMnet0它的 IP 地址会是192.168.11.x格式。VMnet1仅主机模式类型仅主机...含义这是“仅主机模式”。这是一种封闭的网络环境。效果虚拟机只能和你的物理机主机互相通信无法访问外网局域网内的其他设备也无法访问它。常用于搭建一个安全的、不联网的测试环境。主机连接已连接DHCP已启用子网地址-图片中显示为短横线可能表示未配置或未分配子网或者界面未显示完全通常仅主机模式也会有子网比如192.168.56.0。VMnet8NAT 模式类型NAT 模式含义这是最常用的一种模式。NAT 代表“网络地址转换”。效果虚拟机通过物理机的 IP 地址“共享”上网。物理机在这里扮演了一个“路由器”的角色。虚拟机可以访问外网但外网或局域网内其他设备无法主动访问这台虚拟机除非你手动配置端口转发。优点你不需要去配置路由器虚拟机换个网络环境比如从公司换到家里也能自动连上网。主机连接已连接DHCP已启用VMware 会自动分配 IP。子网地址192.168.152.0虚拟机的 IP 地址会是192.168.152.x格式。总结与建议日常开发/上网推荐使用VMnet8 (NAT 模式)因为它最稳定不需要复杂的网络配置。需要让别人访问你的虚拟机如做服务器测试推荐使用VMnet0 (桥接模式)。做安全隔离测试使用VMnet1 (仅主机模式)。从你的截图看所有网络服务DHCP都是开启的连接状态也是正常的说明 VMware 的网络配置本身没有问题。Docker Swarm 集群如果说刚才讨论的“单机跑 10 个 Nginx”是单兵作战那么Docker Swarm就是组建一支集团军。简单来说Docker Swarm 是 Docker 官方原生的容器编排工具。它能把多台运行着 Docker 的服务器物理机或虚拟机聚合成一个虚拟的、统一的超级主机。当你面对几十台服务器、几百个容器时手动管理会崩溃这时就需要 Swarm 来统一调度。 核心架构它是怎么组织的Swarm 集群采用典型的管理-执行架构主要包含两种角色的节点 Manager 节点指挥官职责负责集群的“大脑”工作。它维护集群状态、进行任务调度决定哪个容器跑在哪台机器上、处理 API 请求。高可用生产环境通常部署3 个或 5 个Manager 节点奇数个利用 Raft 协议达成共识。如果 Leader 挂了其他 Manager 会自动选举新 Leader保证集群不瘫痪。注意Manager 也可以兼职干活运行容器但为了稳定通常建议专职管理。 Worker 节点干活的士兵职责负责实际运行容器任务。它们接收 Manager 的指令启动、停止容器并汇报状态。扩展性Worker 节点可以成百上千个随时加入或退出集群。 核心概念服务与服务在 Swarm 中你不再直接操作“容器”而是操作服务服务这是 Swarm 的调度单位。你告诉 Swarm“我要运行一个 Nginx 服务需要 5 个副本”。任务Swarm 会自动把这个“服务”拆分成 5 个“任务”分发到不同的 Worker 节点上去运行。 为什么要用 Docker Swarm四大杀手锏相比单机 DockerSwarm 解决了生产环境的几个核心痛点1. 自动故障恢复场景假设你有 3 台机器Nginx 跑在机器 A 上。突然机器 A 断电了。Swarm 的反应Manager 节点检测到机器 A 失联会自动在机器 B 或 C 上重新启动一个 Nginx 容器确保服务始终有 1 个副本在运行。2. 弹性伸缩场景双 11 流量来了你需要把 Nginx 从 5 个增加到 50 个。Swarm 的操作你只需要执行一条命令docker service scale web50Swarm 会自动计算哪些机器有空闲资源并把容器分发过去。3. 内置负载均衡场景你有 10 个 Nginx 副本分散在不同机器上。Swarm 的操作Swarm 会自动分配一个虚拟 IPVIP。当你访问这个 VIP 时Swarm 的内置路由网格Routing Mesh会自动把流量均匀分发给这 10 个容器你不需要自己配置 Nginx 反向代理。4. 滚动更新场景你要把 Nginx 从 1.0 版本升级到 1.1 版本。Swarm 的操作它会先停掉一个旧容器启动一个新容器检查新容器正常后再停下一个旧的。整个过程零停机用户无感知。如果更新失败还能一键回滚。⚖️ Docker Swarm vs Kubernetes这是大家最常问的问题我为你总结了一个对比表表格特性Docker SwarmKubernetes上手难度极低Docker 命令原生支持几分钟上手高概念多配置复杂学习曲线陡峭部署维护简单内置在 Docker 引擎中一条命令初始化复杂需要部署 etcd, apiserver 等组件功能丰富度基础满足大部分中小规模需求极其强大适合超大规模、复杂微服务适用场景中小规模集群、追求快速上线、团队熟悉 Docker大规模微服务、需要复杂的调度策略、大厂标配️ 如何快速开始Swarm 最大的魅力在于开箱即用不需要安装额外软件初始化集群在主节点执行bash编辑1docker swarm init --advertise-addr 你的IP加入集群在其他节点执行复制上一步生成的 Token在 Worker 节点运行bash编辑1docker swarm join --token 你的Token 主节点IP:2377部署服务bash编辑1docker service create -p 80:80 --replicas 3 nginx这就完成了Swarm 会自动在集群中调度 3 个 Nginx 容器。总结如果你已经有了 Docker 基础且不想面对 Kubernetes 的复杂性Docker Swarm 是构建高可用集群的最佳轻量级选择。Docker Bridge 网络设置详解1. 什么是 Bridge 网络Bridge 是 Docker 的默认网络驱动。当你运行容器时未指定网络容器会连接到docker0虚拟网桥。┌─────────────────────────────────────┐ │ 宿主机 │ │ ┌──────────────────────────────┐ │ │ │ docker0 bridge │ │ │ │ 172.17.0.1 │ │ │ └──────────────────────────────┘ │ │ ↑ ↑ ↑ │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │容器 A │ │容器 B │ │容器 C │ │ │ │172.17│ │172.17│ │172.17│ │ │ │ 0.2 │ │ 0.3 │ │ 0.4 │ │ │ └──────┘ └──────┘ └──────┘ │ └─────────────────────────────────────┘2. 查看默认 Bridge 网络# 查看所有网络 docker network ls # 输出 # NETWORK ID NAME DRIVER SCOPE # xxx bridge bridge local # xxx host host local # xxx none null local # 查看 bridge 网络详情 docker network inspect bridge3. 创建自定义 Bridge 网络# 创建自定义 bridge 网络 docker network create my-bridge # 指定子网和网关 docker network create --subnet192.168.100.0/24 --gateway192.168.100.1 my-bridge # 查看创建的网络 docker network ls4. 将容器连接到自定义 Bridge# 启动时指定网络 docker run -d --name web --network my-bridge nginx # 将运行中的容器连接到网络 docker network connect my-bridge web # 断开容器网络 docker network disconnect my-bridge web5. 容器间通信同一网络下的容器可以通过容器名互相访问# 创建网络 docker network create my-net # 启动容器 docker run -d --name app1 --network my-net nginx docker run -d --name app2 --network my-net alpine # 在 app2 中测试访问 app1 docker exec -it app2 ping app1 # 或 docker exec -it app2 curl http://app1:806. 端口映射Bridge 网络中容器默认不能从外部访问需要映射端口# 格式-p 宿主机端口:容器端口 docker run -d --name nginx -p 8080:80 nginx # 映射多个端口 docker run -d --name myapp -p 3000:3000 -p 8080:80 myapp # 只绑定特定 IP docker run -d -p 127.0.0.1:8080:80 nginx # UDP 端口 docker run -d -p 8080:80/udp nginx7. DNS 解析自定义 Bridge 网络提供内置 DNS方式说明容器名自动解析如http://web容器 IP手动分配或自动分配--link已废弃旧版方式不推荐# 查看容器 IP docker inspect -f {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} 容器名8. 完整示例Web API DB# 1. 创建网络 docker network create app-net # 2. 启动数据库 docker run -d \ --name postgres \ --network app-net \ -e POSTGRES_DBmyapp \ -e POSTGRES_USERuser \ -e POSTGRES_PASSWORDsecret \ postgres:15-alpine # 3. 启动 API连接数据库 docker run -d \ --name api \ --network app-net \ -e DB_HOSTpostgres \ -e DB_PORT5432 \ -p 3000:3000 \ myapi:latest # 4. 启动 Web docker run -d \ --name web \ --network app-net \ -p 8080:80 \ nginx:alpine # 5. 测试web 容器中访问 api docker exec -it web curl http://api:30009. 常用命令速查# 创建网络 docker network create name # 查看网络 docker network ls docker network inspect name # 删除网络先停止关联容器 docker network rm name # 清理未使用的网络 docker network prune # 连接容器到网络 docker network connect network container # 断开容器网络 docker network disconnect network container10. Bridge vs Host 网络特性BridgeHost隔离性容器独立网络栈共享宿主机网络端口映射需要-p无需映射性能稍低NAT更高适用场景多容器应用高性能场景# 使用 host 网络 docker run -d --network host nginx