只读模板,包含运行应用所需的代码、运行时、库和配置。 代码、运行时、库和配置 各有什么作用
你描述的正是 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}}' 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 完全禁用网络,容器无网卡、无法通信,仅本地进程运行 安全隔离、离线计算、仅本地文件 / 进程操作
二、各驱动详细说明
- 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
- host(主机)
原理:容器与宿主机共享网络命名空间,无独立网络栈,端口与宿主机直接冲突。
优势:网络性能接近物理机,无 NAT 转发损耗。
示例
bash
运行
docker run -d --name host-nginx --network host nginx
- overlay(覆盖)
原理:基于 VXLAN 封装,跨多 Docker 主机构建统一虚拟网络,支持 Swarm 服务发现与负载均衡。
适用:多节点集群、跨主机容器互通。
示例(Swarm 模式)
bash
运行
创建 overlay 网络
docker network create -d overlay my-overlay
启动服务并接入 overlay
docker service create --name web --network my-overlay nginx
- 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
- 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 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格式。
- 这意味着如果你的虚拟机使用 VMnet0,它的 IP 地址会是
VMnet1(仅主机模式)
- 类型:仅主机...
- 含义: 这是"仅主机模式"。这是一种封闭的网络环境。
- 效果: 虚拟机只能 和你的物理机(主机)互相通信,无法访问外网,局域网内的其他设备也无法访问它。常用于搭建一个安全的、不联网的测试环境。
- 主机连接:已连接
- DHCP:已启用
- 子网地址:-
- 图片中显示为短横线,可能表示未配置或未分配子网,或者界面未显示完全(通常仅主机模式也会有子网,比如
192.168.56.0)。
- 图片中显示为短横线,可能表示未配置或未分配子网,或者界面未显示完全(通常仅主机模式也会有子网,比如
VMnet8(NAT 模式)
- 类型:NAT 模式
- 含义: 这是最常用的一种模式。NAT 代表"网络地址转换"。
- 效果: 虚拟机通过物理机的 IP 地址"共享"上网。物理机在这里扮演了一个"路由器"的角色。虚拟机可以访问外网,但外网(或局域网内其他设备)无法主动访问这台虚拟机(除非你手动配置端口转发)。
- 优点: 你不需要去配置路由器,虚拟机换个网络环境(比如从公司换到家里)也能自动连上网。
- 主机连接:已连接
- DHCP:已启用
- VMware 会自动分配 IP。
- 子网地址:192.168.152.0
- 虚拟机的 IP 地址会是
192.168.152.x格式。
- 虚拟机的 IP 地址会是
总结与建议
- 日常开发/上网: 推荐使用 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 最大的魅力在于开箱即用,不需要安装额外软件:
-
初始化集群 (在主节点执行):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 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