Docker 中的 镜像(

只读模板,包含运行应用所需的代码、运行时、库和配置。 代码、运行时、库和配置 各有什么作用

你描述的正是 Docker 中的 镜像(Image)。它是容器的静态蓝图,将应用运行所需的一切打包在一起,确保了"一次构建,到处运行"。

下面为你详细解释这四个组成部分各自的作用:

💻 代码

这是你亲手编写的应用程序本身,是镜像的核心。

  • 作用:它定义了应用的具体业务逻辑和功能。没有代码,镜像就只是一个空壳。
  • 例子 :一个 Python 的 app.py 文件、一个 Java 的 .jar 包,或者一个网站的 HTML/CSS/JavaScript 文件。

⚙️ 运行时

这是执行你代码所必需的基础环境或引擎

  • 作用:它为代码提供了一个可以"跑起来"的平台。不同的编程语言需要不同的运行时。
  • 例子
    • 运行 Python 代码,需要 Python 解释器
    • 运行 Java 代码,需要 Java 虚拟机
    • 运行 Node.js 代码,需要 Node.js 环境

📦 库

这是你的代码在运行时所依赖的第三方软件包或模块

  • 作用:它让开发者不必"重复造轮子",可以直接调用别人写好的、经过验证的功能,极大地提高了开发效率。
  • 例子
    • 一个 Python Web 应用可能需要 FlaskDjango 库来处理网页请求。
    • 一个数据分析脚本可能需要 NumPyPandas 库来进行数学计算。

📝 配置

这是用于设定应用行为和环境变量的文件。

  • 作用:它告诉应用"如何启动"以及"在什么环境下运行",让同一份代码可以灵活地适应不同场景(如开发、测试、生产环境)。
  • 例子
    • 数据库的连接地址和密码。
    • 应用启动时监听的端口号(如 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}}' web
2. host(主机)
  • 原理:容器与宿主机共享网络命名空间,无独立网络栈,端口与宿主机直接冲突。

  • 优势:网络性能接近物理机,无 NAT 转发损耗。

  • 示例

    bash

    运行

    复制代码
    docker run -d --name host-nginx --network host nginx
3. overlay(覆盖)
  • 原理:基于 VXLAN 封装,跨多 Docker 主机构建统一虚拟网络,支持 Swarm 服务发现与负载均衡。

  • 适用:多节点集群、跨主机容器互通。

  • 示例(Swarm 模式)

    bash

    运行

    复制代码
    # 创建 overlay 网络
    docker network create -d overlay my-overlay
    # 启动服务并接入 overlay
    docker service create --name web --network my-overlay nginx
4. macvlan
  • 原理 :绑定宿主机物理网卡(如 eth0),为容器分配 MAC 与物理网段 IP,直连物理网络。

  • 注意:需物理交换机支持多 MAC(混杂模式)。

  • 示例

    bash

    运行

    复制代码
    docker network create -d macvlan \
      --subnet=192.168.1.0/24 \
      --gateway=192.168.1.1 \
      -o parent=eth0 my-macvlan
    docker run -d --name macvlan-nginx --network my-macvlan nginx
5. 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

运行

启动容器(默认 bridge)

docker run -d --name web nginx

查看容器 IP

docker inspect -f '{{.NetworkSettings.IPAddress}}' web

  1. host(主机)

原理:容器与宿主机共享网络命名空间,无独立网络栈,端口与宿主机直接冲突。

优势:网络性能接近物理机,无 NAT 转发损耗。

示例

bash

运行

docker run -d --name host-nginx --network host nginx

  1. overlay(覆盖)

原理:基于 VXLAN 封装,跨多 Docker 主机构建统一虚拟网络,支持 Swarm 服务发现与负载均衡。

适用:多节点集群、跨主机容器互通。

示例(Swarm 模式)

bash

运行

创建 overlay 网络

docker network create -d overlay my-overlay

启动服务并接入 overlay

docker service create --name web --network my-overlay nginx

  1. macvlan

原理:绑定宿主机物理网卡(如 eth0),为容器分配 MAC 与物理网段 IP,直连物理网络。

注意:需物理交换机支持多 MAC(混杂模式)。

示例

bash

运行

docker network create -d macvlan \

--subnet=192.168.1.0/24 \

--gateway=192.168.1.1 \

-o parent=eth0 my-macvlan

docker run -d --name macvlan-nginx --network my-macvlan nginx

  1. 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 后,会发生以下变化:

  1. 没有网络隔离:容器就像运行在宿主机上的一个普通进程一样。
  2. 无需端口映射 :你不需要 (也不能)使用 -p 80:80 这样的参数。
    • 如果 Nginx 默认监听 80 端口,它会直接占用宿主机的 80 端口。
    • 你可以直接通过 宿主机IP:80 访问 Nginx。
  3. 性能更高:因为没有经过 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 1 80 8081 http://localhost:8081
Nginx 2 80 8082 http://localhost:8082
Nginx 3 80 8083 http://localhost:8083
... 80 ... ...
Nginx 10 80 8090 http://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)。

VMnet8(NAT 模式)

  • 类型: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?(四大杀手锏)

相比单机 Docker,Swarm 解决了生产环境的几个核心痛点:

1. 自动故障恢复
  • 场景:假设你有 3 台机器,Nginx 跑在机器 A 上。突然机器 A 断电了。
  • Swarm 的反应:Manager 节点检测到机器 A 失联,会自动在机器 B 或 C 上重新启动一个 Nginx 容器,确保服务始终有 1 个副本在运行。
2. 弹性伸缩
  • 场景:双 11 流量来了,你需要把 Nginx 从 5 个增加到 50 个。
  • Swarm 的操作 :你只需要执行一条命令 docker service scale web=50,Swarm 会自动计算哪些机器有空闲资源,并把容器分发过去。
3. 内置负载均衡
  • 场景:你有 10 个 Nginx 副本分散在不同机器上。
  • Swarm 的操作:Swarm 会自动分配一个虚拟 IP(VIP)。当你访问这个 VIP 时,Swarm 的内置路由网格(Routing Mesh)会自动把流量均匀分发给这 10 个容器,你不需要自己配置 Nginx 反向代理。
4. 滚动更新
  • 场景:你要把 Nginx 从 1.0 版本升级到 1.1 版本。
  • Swarm 的操作 :它会先停掉一个旧容器,启动一个新容器,检查新容器正常后,再停下一个旧的。整个过程零停机,用户无感知。如果更新失败,还能一键回滚。

⚖️ Docker Swarm vs Kubernetes

这是大家最常问的问题,我为你总结了一个对比表:

表格

特性 Docker Swarm Kubernetes
上手难度 极低(Docker 命令原生支持,几分钟上手) (概念多,配置复杂,学习曲线陡峭)
部署维护 简单(内置在 Docker 引擎中,一条命令初始化) 复杂(需要部署 etcd, apiserver 等组件)
功能丰富度 基础(满足大部分中小规模需求) 极其强大(适合超大规模、复杂微服务)
适用场景 中小规模集群、追求快速上线、团队熟悉 Docker 大规模微服务、需要复杂的调度策略、大厂标配

🛠️ 如何快速开始?

Swarm 最大的魅力在于开箱即用,不需要安装额外软件:

  1. 初始化集群 (在主节点执行):bash

    编辑

    复制代码
    1docker swarm init --advertise-addr <你的IP>
  2. 加入集群 (在其他节点执行):
    复制上一步生成的 Token,在 Worker 节点运行:bash

    编辑

    复制代码
    1docker swarm join --token <你的Token> <主节点IP>:2377
  3. 部署服务 :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 bridge

3. 创建自定义 Bridge 网络

复制代码
# 创建自定义 bridge 网络
docker network create my-bridge

# 指定子网和网关
docker network create --subnet=192.168.100.0/24 --gateway=192.168.100.1 my-bridge

# 查看创建的网络
docker network ls

4. 将容器连接到自定义 Bridge

复制代码
# 启动时指定网络
docker run -d --name web --network my-bridge nginx

# 将运行中的容器连接到网络
docker network connect my-bridge web

# 断开容器网络
docker network disconnect my-bridge web

5. 容器间通信

同一网络下的容器可以通过容器名互相访问:

复制代码
# 创建网络
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:80

6. 端口映射

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 nginx

7. 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_DB=myapp \
  -e POSTGRES_USER=user \
  -e POSTGRES_PASSWORD=secret \
  postgres:15-alpine

# 3. 启动 API(连接数据库)
docker run -d \
  --name api \
  --network app-net \
  -e DB_HOST=postgres \
  -e DB_PORT=5432 \
  -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:3000

9. 常用命令速查

复制代码
# 创建网络
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> <container>

10. Bridge vs Host 网络

特性 Bridge Host
隔离性 容器独立网络栈 共享宿主机网络
端口映射 需要 -p 无需映射
性能 稍低(NAT) 更高
适用场景 多容器应用 高性能场景
复制代码
# 使用 host 网络
docker run -d --network host nginx
相关推荐
码云社区2 小时前
JAVA二手车交易二手车市场系统源码支持微信小程序+微信公众号+H5+APP
java·开发语言·微信小程序·二手交易·闲置回收
crescent_悦2 小时前
C++:The Largest Generation
java·开发语言·c++
Lyyaoo.4 小时前
【JAVA基础面经】抽象类/方法与接口
java·开发语言
0xDevNull4 小时前
Java实现Redis延迟队列:从原理到高可用架构
java·开发语言·后端
糖炒栗子03264 小时前
Go 语言环境搭建与版本管理指南 (2026)
开发语言·后端·golang
于先生吖4 小时前
无人共享健身房 Java 后端源码 + 多端对接完整方案
java·开发语言
cpp_learners4 小时前
银河麒麟V10+飞腾FT-2000/4处理器+QT源码静态编译5.14.2指南
开发语言·qt
野生技术架构师4 小时前
1000道互联网大厂Java岗面试原题解析(八股原理+场景题)
java·开发语言·面试
qqty12175 小时前
Java进阶学习之路
java·开发语言·学习