1. 数据结构设计概述
1.1 设计原则
Moby项目中的数据结构设计遵循以下原则:
- 类型安全: 使用强类型定义,避免运行时类型错误
- 序列化友好: 支持JSON/YAML序列化,便于配置文件和API通信
- 版本兼容: 通过标签和字段可选性支持API版本演进
- 组合优于继承: 通过嵌入和接口组合实现功能扩展
- 不可变性: 关键状态数据采用只读或原子操作保护
1.2 核心数据结构分类
graph TB
subgraph "容器相关结构"
Container[Container]
State[State]
Config[Config]
HostConfig[HostConfig]
NetworkSettings[NetworkSettings]
end
subgraph "镜像相关结构"
Image[Image]
ImageSummary[ImageSummary]
ImageHistory[ImageHistory]
Layer[Layer]
Manifest[Manifest]
end
subgraph "网络相关结构"
Network[Network]
NetworkResource[NetworkResource]
EndpointSettings[EndpointSettings]
IPAM[IPAM]
Driver[Driver]
end
subgraph "存储相关结构"
Volume[Volume]
Mount[Mount]
MountPoint[MountPoint]
VolumeOptions[VolumeOptions]
end
subgraph "系统相关结构"
Info[Info]
Version[Version]
SystemUsage[SystemUsage]
Events[Events]
end
Container --> State
Container --> Config
Container --> HostConfig
Container --> NetworkSettings
Image --> Layer
Image --> Manifest
Network --> NetworkResource
NetworkResource --> EndpointSettings
NetworkResource --> IPAM
Volume --> Mount
Volume --> VolumeOptions
2. 容器相关数据结构
2.1 Container 核心结构
classDiagram
class Container {
+string ID
+string Name
+time.Time Created
+string Path
+[]string Args
+*Config Config
+*HostConfig HostConfig
+*NetworkSettings NetworkSettings
+*State State
+string Root
+string BaseFS
+RWLayer RWLayer
+image.ID ImageID
+*ocispec.Descriptor ImageManifest
+ocispec.Platform ImagePlatform
+map[string]*MountPoint MountPoints
+int RestartCount
+bool HasBeenStartedBefore
+bool HasBeenManuallyStopped
+*ExecStore ExecCommands
+logger.Logger LogDriver
+*logger.Copier LogCopier
+*restartmanager.RestartManager restartManager
+SecurityOptions
+string HostnamePath
+string HostsPath
+string ResolvConfPath
+string ShmPath
+Lock()
+Unlock()
+SetStarting() error
+SetRunning(pid int)
+SetStopped(*ExitStatus)
+IsRunning() bool
+IsPaused() bool
+ShouldRestart() bool
+ToDisk() error
+FromDisk() error
}
class State {
+sync.Mutex
+ContainerState Status
+bool Running
+bool Paused
+bool Restarting
+bool OOMKilled
+bool Dead
+int Pid
+int ExitCode
+string Error
+string StartedAt
+string FinishedAt
+*Health Health
+*ExitStatus ExitStatus
+String() string
+StateString() string
+SetStarting() error
+SetRunning(pid int, startedAt time.Time)
+SetStopped(exitStatus *ExitStatus)
+SetRestarting(exitStatus *ExitStatus)
+SetError(err error)
+SetPaused()
+SetUnpaused()
+IsValidStateTransition(newState ContainerState) bool
}
class Config {
+string Hostname
+string Domainname
+string User
+bool AttachStdin
+bool AttachStdout
+bool AttachStderr
+nat.PortSet ExposedPorts
+bool Tty
+bool OpenStdin
+bool StdinOnce
+[]string Env
+[]string Cmd
+*HealthConfig Healthcheck
+bool ArgsEscaped
+string Image
+map[string]struct{} Volumes
+string WorkingDir
+[]string Entrypoint
+bool NetworkDisabled
+string MacAddress
+[]string OnBuild
+map[string]string Labels
+*int StopTimeout
+string StopSignal
+[]string Shell
+ValidateConfig() error
}
class HostConfig {
+[]string Binds
+string ContainerIDFile
+*LogConfig LogConfig
+string NetworkMode
+nat.PortMap PortBindings
+*RestartPolicy RestartPolicy
+bool AutoRemove
+string VolumeDriver
+[]string VolumesFrom
+[]string CapAdd
+[]string CapDrop
+[]string CgroupnsMode
+[]string DNS
+[]string DNSOptions
+[]string DNSSearch
+[]string ExtraHosts
+[]string GroupAdd
+string IpcMode
+string Cgroup
+[]string Links
+string OomScoreAdj
+string PidMode
+bool Privileged
+bool PublishAllPorts
+bool ReadonlyRootfs
+[]string SecurityOpt
+map[string]string StorageOpt
+map[string]string Tmpfs
+string UTSMode
+string UsernsMode
+int64 ShmSize
+*Resources Resources
+[]mount.Mount Mounts
+[]string MaskedPaths
+[]string ReadonlyPaths
+string Init
+[2]uint ConsoleSize
+string Isolation
+ValidateHostConfig() error
}
Container --> State
Container --> Config
Container --> HostConfig
Container --> SecurityOptions
2.2 容器状态管理
// 文件路径: daemon/container/state.go
// State 定义容器的运行状态,包含状态转换逻辑和并发安全保护
type State struct {
sync.Mutex // 状态锁,保护并发访问
// 基础状态字段
Status ContainerState // 容器状态枚举值
Running bool // 是否正在运行
Paused bool // 是否已暂停
Restarting bool // 是否正在重启
OOMKilled bool // 是否被OOM杀死
Dead bool // 是否处于死亡状态
Pid int // 主进程PID
ExitCode int // 退出代码
Error string // 错误信息
StartedAt string // 启动时间
FinishedAt string // 结束时间
// 健康检查状态
Health *Health // 健康检查结果
// 退出状态详情
ExitStatus *ExitStatus // 退出状态详细信息
}
// ContainerState 定义容器状态枚举
type ContainerState string
const (
// Created 容器已创建但未启动
Created ContainerState = "created"
// Running 容器正在运行
Running ContainerState = "running"
// Paused 容器被暂停(进程冻结但未终止)
Paused ContainerState = "paused"
// Restarting 容器正在重启
Restarting ContainerState = "restarting"
// Removing 容器正在被删除
Removing ContainerState = "removing"
// Exited 容器已退出
Exited ContainerState = "exited"
// Dead 容器处于死亡状态(异常终止)
Dead ContainerState = "dead"
)
// SetRunning 设置容器为运行状态
func (s *State) SetRunning(pid int, startedAt time.Time) {
s.Lock()
defer s.Unlock()
s.Status = Running
s.Running = true
s.Paused = false
s.Restarting = false
s.Dead = false
s.Pid = pid
s.StartedAt = startedAt.UTC().Format(time.RFC3339Nano)
}
// SetStopped 设置容器为停止状态
func (s *State) SetStopped(exitStatus *ExitStatus) {
s.Lock()
defer s.Unlock()
s.Status = Exited
s.Running = false
s.Paused = false
s.Restarting = false
s.Dead = false
s.Pid = 0
s.ExitCode = exitStatus.ExitCode
s.FinishedAt = exitStatus.ExitedAt.UTC().Format(time.RFC3339Nano)
s.ExitStatus = exitStatus
}
// SetPaused 设置容器为暂停状态
func (s *State) SetPaused() {
s.Lock()
defer s.Unlock()
s.Status = Paused
s.Paused = true
}
// SetUnpaused 取消容器暂停状态
func (s *State) SetUnpaused() {
s.Lock()
defer s.Unlock()
s.Status = Running
s.Paused = false
}
// IsValidStateTransition 验证状态转换是否有效
func (s *State) IsValidStateTransition(newState ContainerState) bool {
currentState := s.Status
// 定义有效的状态转换映射
validTransitions := map[ContainerState][]ContainerState{
Created: {Running, Removing, Dead},
Running: {Paused, Exited, Restarting, Dead, Removing},
Paused: {Running, Exited, Dead, Removing},
Restarting: {Running, Exited, Dead, Removing},
Exited: {Running, Removing, Dead},
Dead: {Removing},
Removing: {}, // 终态,不能转换到其他状态
}
validNext, exists := validTransitions[currentState]
if !exists {
return false
}
for _, valid := range validNext {
if valid == newState {
return true
}
}
return false
}
2.3 容器配置结构
// 文件路径: api/types/container/config.go
// Config 定义容器的基础配置信息
type Config struct {
// 基础标识信息
Hostname string // 容器主机名
Domainname string // 域名
User string // 运行用户
// 标准输入输出配置
AttachStdin bool // 是否附加标准输入
AttachStdout bool // 是否附加标准输出
AttachStderr bool // 是否附加标准错误
// 网络配置
ExposedPorts nat.PortSet // 暴露的端口集合
MacAddress string // MAC地址(已废弃)
// 终端配置
Tty bool // 是否分配伪终端
OpenStdin bool // 是否保持标准输入开启
StdinOnce bool // 标准输入是否只读一次
// 环境和命令
Env []string // 环境变量列表
Cmd strslice.StrSlice // 容器启动命令
Entrypoint strslice.StrSlice // 入口点
// 镜像和工作目录
Image string // 镜像名称
WorkingDir string // 工作目录
// 存储卷
Volumes map[string]struct{} // 声明的存储卷
// 健康检查
Healthcheck *HealthConfig // 健康检查配置
// 网络配置
NetworkDisabled bool // 是否禁用网络
// 停止配置
StopSignal string // 停止信号
StopTimeout *int // 停止超时时间(秒)
Shell strslice.StrSlice // Shell命令
// 构建相关
OnBuild []string // OnBuild指令
ArgsEscaped bool // 参数是否已转义
// 元数据
Labels map[string]string // 标签键值对
}
// HealthConfig 定义健康检查配置
type HealthConfig struct {
// 健康检查命令
Test []string `json:",omitempty"`
// 检查间隔(纳秒)
Interval time.Duration `json:",omitempty"`
// 检查超时(纳秒)
Timeout time.Duration `json:",omitempty"`
// 启动前延迟检查时间(纳秒)
StartPeriod time.Duration `json:",omitempty"`
// 启动间隔检查时间(纳秒,API 1.44+)
StartInterval time.Duration `json:",omitempty"`
// 连续失败次数阈值
Retries int `json:",omitempty"`
}
// ValidateConfig 验证容器配置
func (config *Config) ValidateConfig() error {
// 1. 验证镜像名称
if config.Image == "" {
return errors.New("image name cannot be empty")
}
// 2. 验证用户格式
if config.User != "" {
if err := validateUser(config.User); err != nil {
return fmt.Errorf("invalid user: %v", err)
}
}
// 3. 验证环境变量格式
for _, env := range config.Env {
if !strings.Contains(env, "=") {
return fmt.Errorf("invalid environment variable: %s", env)
}
}
// 4. 验证标签格式
for key := range config.Labels {
if err := validateLabelKey(key); err != nil {
return fmt.Errorf("invalid label key %s: %v", key, err)
}
}
// 5. 验证健康检查配置
if config.Healthcheck != nil {
if err := config.Healthcheck.Validate(); err != nil {
return fmt.Errorf("invalid healthcheck: %v", err)
}
}
return nil
}
3. 镜像相关数据结构
3.1 镜像结构UML图
classDiagram
class Image {
+string ID
+[]string RepoTags
+[]string RepoDigests
+string Parent
+string Comment
+string Created
+string Container
+*Config Config
+string DockerVersion
+string Author
+*Config ContainerConfig
+string Architecture
+string Variant
+string OS
+string OSVersion
+int64 Size
+int64 VirtualSize
+*GraphDriver GraphDriver
+*RootFS RootFS
+map[string]*Metadata Metadata
+GetID() string
+GetSize() int64
+GetCreated() time.Time
+ValidateImage() error
}
class ImageSummary {
+string ID
+string ParentID
+[]string RepoTags
+[]string RepoDigests
+int64 Created
+int64 Size
+int64 SharedSize
+int64 VirtualSize
+int64 Containers
+map[string]string Labels
+GetMainTag() string
+GetShortID() string
}
class Layer {
+string ID
+string Parent
+string Comment
+string Created
+string Container
+*Config Config
+string DockerVersion
+string Author
+string Architecture
+string OS
+int64 Size
+[]string History
+GetDiffID() string
+GetChainID() string
+GetCacheID() string
}
class RootFS {
+string Type
+[]string DiffIDs
+GetChainID() string
+Validate() error
}
class GraphDriver {
+string Name
+map[string]string Data
+GetDriverName() string
+GetMetadata() map[string]string
}
Image --> RootFS
Image --> GraphDriver
ImageSummary --> Image
Layer --> Config
3.2 镜像数据结构实现
// 文件路径: api/types/image/image.go
// Image 定义镜像的完整信息结构
type Image struct {
// 基础标识
ID string `json:"Id"` // 镜像ID(SHA256摘要)
RepoTags []string `json:"RepoTags"` // 仓库标签列表
RepoDigests []string `json:"RepoDigests"` // 仓库摘要列表
Parent string `json:"Parent"` // 父镜像ID
Comment string `json:"Comment"` // 注释信息
Created string `json:"Created"` // 创建时间
Container string `json:"Container"` // 创建该镜像的容器ID
// 配置信息
Config *container.Config `json:"Config"` // 容器配置
ContainerConfig *container.Config `json:"ContainerConfig"` // 构建时容器配置
// 构建信息
DockerVersion string `json:"DockerVersion"` // Docker版本
Author string `json:"Author"` // 作者信息
// 平台信息
Architecture string `json:"Architecture"` // CPU架构
Variant string `json:"Variant"` // 架构变体
OS string `json:"Os"` // 操作系统
OSVersion string `json:"OsVersion"` // 操作系统版本
OSFeatures []string `json:"OsFeatures"` // 操作系统特性
// 大小信息
Size int64 `json:"Size"` // 镜像大小
VirtualSize int64 `json:"VirtualSize"` // 虚拟大小(包含父镜像)
// 存储信息
GraphDriver *GraphDriver `json:"GraphDriver"` // 图形驱动信息
RootFS *RootFS `json:"RootFS"` // 根文件系统信息
// 元数据
Metadata map[string]*Metadata `json:"Metadata"` // 镜像元数据
}
// ImageSummary 定义镜像摘要信息,用于列表显示
type ImageSummary struct {
ID string `json:"Id"` // 镜像ID
ParentID string `json:"ParentId"` // 父镜像ID
RepoTags []string `json:"RepoTags"` // 仓库标签
RepoDigests []string `json:"RepoDigests"` // 仓库摘要
Created int64 `json:"Created"` // 创建时间戳
Size int64 `json:"Size"` // 镜像大小
SharedSize int64 `json:"SharedSize"` // 共享大小
VirtualSize int64 `json:"VirtualSize"` // 虚拟大小
Labels map[string]string `json:"Labels"` // 标签
Containers int64 `json:"Containers"` // 使用此镜像的容器数量
}
// RootFS 定义根文件系统结构
type RootFS struct {
Type string `json:"type"` // 文件系统类型,通常为"layers"
DiffIDs []string `json:"diff_ids"` // 层差异ID列表
}
// GraphDriver 定义图形驱动信息
type GraphDriver struct {
Name string `json:"Name"` // 驱动名称(如overlay2、aufs等)
Data map[string]string `json:"Data"` // 驱动特定数据
}
// GetMainTag 获取主要标签(第一个非<none>标签)
func (summary *ImageSummary) GetMainTag() string {
for _, tag := range summary.RepoTags {
if tag != "<none>:<none>" {
return tag
}
}
if len(summary.RepoTags) > 0 {
return summary.RepoTags[0]
}
return "<none>:<none>"
}
// GetShortID 获取短ID(前12个字符)
func (summary *ImageSummary) GetShortID() string {
if len(summary.ID) > 12 {
return summary.ID[:12]
}
return summary.ID
}
// ValidateImage 验证镜像数据结构
func (img *Image) ValidateImage() error {
// 1. 验证ID格式
if img.ID == "" {
return errors.New("image ID cannot be empty")
}
if !isValidImageID(img.ID) {
return fmt.Errorf("invalid image ID format: %s", img.ID)
}
// 2. 验证架构信息
if img.Architecture == "" {
return errors.New("image architecture cannot be empty")
}
// 3. 验证操作系统
if img.OS == "" {
return errors.New("image OS cannot be empty")
}
// 4. 验证根文件系统
if img.RootFS == nil {
return errors.New("image rootfs cannot be nil")
}
if err := img.RootFS.Validate(); err != nil {
return fmt.Errorf("invalid rootfs: %v", err)
}
return nil
}
// Validate 验证根文件系统结构
func (rfs *RootFS) Validate() error {
if rfs.Type == "" {
return errors.New("rootfs type cannot be empty")
}
if len(rfs.DiffIDs) == 0 {
return errors.New("rootfs must have at least one diff ID")
}
// 验证每个DiffID格式
for i, diffID := range rfs.DiffIDs {
if !isValidDiffID(diffID) {
return fmt.Errorf("invalid diff ID at index %d: %s", i, diffID)
}
}
return nil
}
4. 网络相关数据结构
4.1 网络结构UML图
classDiagram
class NetworkResource {
+string Name
+string ID
+string Created
+string Scope
+string Driver
+bool EnableIPv6
+IPAM IPAM
+bool Internal
+bool Attachable
+bool Ingress
+map[string]EndpointResource Containers
+map[string]string Options
+map[string]string Labels
+ValidateNetwork() error
+IsUserDefined() bool
+IsSwarmScope() bool
}
class EndpointSettings {
+string IPAMConfig
+[]string Links
+[]string Aliases
+string NetworkID
+string EndpointID
+string Gateway
+string IPAddress
+int IPPrefixLen
+string IPv6Gateway
+string GlobalIPv6Address
+int GlobalIPv6PrefixLen
+string MacAddress
+map[string]string DriverOpts
+GetIPAddress() string
+GetMacAddress() string
}
class IPAM {
+string Driver
+[]IPAMConfig Config
+map[string]string Options
+ValidateIPAM() error
+GetDriver() string
}
class IPAMConfig {
+string Subnet
+string IPRange
+string Gateway
+map[string]string AuxAddress
+ValidateIPAMConfig() error
+GetSubnet() *net.IPNet
}
class NetworkSettings {
+string Bridge
+string SandboxID
+bool HairpinMode
+string LinkLocalIPv6Address
+int LinkLocalIPv6PrefixLen
+nat.PortMap Ports
+string SandboxKey
+[]string SecondaryIPAddresses
+[]string SecondaryIPv6Addresses
+string EndpointID
+string Gateway
+string GlobalIPv6Address
+int GlobalIPv6PrefixLen
+string IPAddress
+int IPPrefixLen
+string IPv6Gateway
+string MacAddress
+map[string]*EndpointSettings Networks
+GetPrimaryNetwork() *EndpointSettings
+GetIPAddress() string
}
NetworkResource --> IPAM
NetworkResource --> EndpointSettings
IPAM --> IPAMConfig
NetworkSettings --> EndpointSettings
4.2 网络配置结构实现
// 文件路径: api/types/network/network.go
// NetworkResource 定义网络资源的完整信息
type NetworkResource struct {
// 基础信息
Name string `json:"Name"` // 网络名称
ID string `json:"Id"` // 网络ID
Created time.Time `json:"Created"` // 创建时间
Scope string `json:"Scope"` // 作用域(local/global/swarm)
Driver string `json:"Driver"` // 网络驱动名称
EnableIPv6 bool `json:"EnableIPv6"` // 是否启用IPv6
// IPAM配置
IPAM IPAM `json:"IPAM"` // IP地址管理配置
// 网络属性
Internal bool `json:"Internal"` // 是否为内部网络
Attachable bool `json:"Attachable"` // 是否允许手动附加
Ingress bool `json:"Ingress"` // 是否为Swarm入口网络
// 容器连接信息
Containers map[string]EndpointResource `json:"Containers"` // 连接的容器
// 配置选项
Options map[string]string `json:"Options"` // 驱动选项
Labels map[string]string `json:"Labels"` // 网络标签
}
// IPAM 定义IP地址管理配置
type IPAM struct {
Driver string `json:"Driver"` // IPAM驱动名称
Config []IPAMConfig `json:"Config"` // IPAM配置列表
Options map[string]string `json:"Options"` // IPAM选项
}
// IPAMConfig 定义IPAM具体配置
type IPAMConfig struct {
Subnet string `json:"Subnet,omitempty"` // 子网CIDR
IPRange string `json:"IPRange,omitempty"` // IP范围
Gateway string `json:"Gateway,omitempty"` // 网关地址
AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"` // 辅助地址
}
// EndpointSettings 定义端点设置(容器在网络中的配置)
type EndpointSettings struct {
// IPAM配置
IPAMConfig *EndpointIPAMConfig `json:"IPAMConfig"` // 端点IPAM配置
// 连接设置
Links []string `json:"Links"` // 链接的容器
Aliases []string `json:"Aliases"` // 网络别名
// 网络标识
NetworkID string `json:"NetworkID"` // 网络ID
EndpointID string `json:"EndpointID"` // 端点ID
// IP配置
Gateway string `json:"Gateway"` // IPv4网关
IPAddress string `json:"IPAddress"` // IPv4地址
IPPrefixLen int `json:"IPPrefixLen"` // IPv4前缀长度
IPv6Gateway string `json:"IPv6Gateway"` // IPv6网关
GlobalIPv6Address string `json:"GlobalIPv6Address"` // IPv6地址
GlobalIPv6PrefixLen int `json:"GlobalIPv6PrefixLen"` // IPv6前缀长度
MacAddress string `json:"MacAddress"` // MAC地址
// 驱动选项
DriverOpts map[string]string `json:"DriverOpts"` // 端点驱动选项
}
// NetworkSettings 定义容器的网络设置
type NetworkSettings struct {
// 默认网络设置(向后兼容)
Bridge string `json:"Bridge"` // 桥接网络名称
SandboxID string `json:"SandboxID"` // 网络沙盒ID
HairpinMode bool `json:"HairpinMode"` // 是否启用Hairpin模式
LinkLocalIPv6Address string `json:"LinkLocalIPv6Address"` // 链路本地IPv6地址
LinkLocalIPv6PrefixLen int `json:"LinkLocalIPv6PrefixLen"` // 链路本地IPv6前缀长度
Ports nat.PortMap `json:"Ports"` // 端口映射
SandboxKey string `json:"SandboxKey"` // 沙盒键
SecondaryIPAddresses []Address `json:"SecondaryIPAddresses"` // 辅助IPv4地址
SecondaryIPv6Addresses []Address `json:"SecondaryIPv6Addresses"` // 辅助IPv6地址
// 默认网络的端点设置(向后兼容)
EndpointID string `json:"EndpointID"` // 端点ID
Gateway string `json:"Gateway"` // 网关
GlobalIPv6Address string `json:"GlobalIPv6Address"` // IPv6地址
GlobalIPv6PrefixLen int `json:"GlobalIPv6PrefixLen"` // IPv6前缀长度
IPAddress string `json:"IPAddress"` // IP地址
IPPrefixLen int `json:"IPPrefixLen"` // IP前缀长度
IPv6Gateway string `json:"IPv6Gateway"` // IPv6网关
MacAddress string `json:"MacAddress"` // MAC地址
// 所有网络的端点设置
Networks map[string]*EndpointSettings `json:"Networks"` // 网络端点映射
}
// ValidateNetwork 验证网络配置
func (n *NetworkResource) ValidateNetwork() error {
// 1. 验证网络名称
if n.Name == "" {
return errors.New("network name cannot be empty")
}
if !isValidNetworkName(n.Name) {
return fmt.Errorf("invalid network name: %s", n.Name)
}
// 2. 验证网络驱动
if n.Driver == "" {
return errors.New("network driver cannot be empty")
}
// 3. 验证IPAM配置
if err := n.IPAM.ValidateIPAM(); err != nil {
return fmt.Errorf("invalid IPAM configuration: %v", err)
}
// 4. 验证作用域
validScopes := []string{"local", "global", "swarm"}
if !contains(validScopes, n.Scope) {
return fmt.Errorf("invalid network scope: %s", n.Scope)
}
return nil
}
// ValidateIPAM 验证IPAM配置
func (ipam *IPAM) ValidateIPAM() error {
// 1. 验证驱动名称
if ipam.Driver == "" {
ipam.Driver = "default" // 使用默认驱动
}
// 2. 验证配置列表
for i, config := range ipam.Config {
if err := config.ValidateIPAMConfig(); err != nil {
return fmt.Errorf("invalid IPAM config at index %d: %v", i, err)
}
}
return nil
}
// ValidateIPAMConfig 验证IPAM具体配置
func (config *IPAMConfig) ValidateIPAMConfig() error {
// 1. 验证子网格式
if config.Subnet != "" {
if _, _, err := net.ParseCIDR(config.Subnet); err != nil {
return fmt.Errorf("invalid subnet CIDR: %s", config.Subnet)
}
}
// 2. 验证IP范围格式
if config.IPRange != "" {
if _, _, err := net.ParseCIDR(config.IPRange); err != nil {
return fmt.Errorf("invalid IP range CIDR: %s", config.IPRange)
}
}
// 3. 验证网关地址
if config.Gateway != "" {
if net.ParseIP(config.Gateway) == nil {
return fmt.Errorf("invalid gateway IP: %s", config.Gateway)
}
}
// 4. 验证辅助地址
for name, addr := range config.AuxAddress {
if net.ParseIP(addr) == nil {
return fmt.Errorf("invalid auxiliary address %s: %s", name, addr)
}
}
return nil
}
// GetPrimaryNetwork 获取主要网络端点设置
func (ns *NetworkSettings) GetPrimaryNetwork() *EndpointSettings {
// 1. 如果只有一个网络,返回该网络
if len(ns.Networks) == 1 {
for _, endpoint := range ns.Networks {
return endpoint
}
}
// 2. 优先返回bridge网络
if endpoint, exists := ns.Networks["bridge"]; exists {
return endpoint
}
// 3. 返回第一个网络
for _, endpoint := range ns.Networks {
return endpoint
}
return nil
}
5. 存储相关数据结构
5.1 存储卷结构UML图
classDiagram
class Volume {
+string CreatedAt
+string Driver
+map[string]string Labels
+string Mountpoint
+string Name
+map[string]any Options
+string Scope
+*UsageData UsageData
+map[string]*ClusterVolume ClusterInfo
+GetDriver() string
+GetMountpoint() string
+ValidateVolume() error
}
class Mount {
+Type Type
+string Source
+string Target
+bool ReadOnly
+Consistency Consistency
+*BindOptions BindOptions
+*VolumeOptions VolumeOptions
+*TmpfsOptions TmpfsOptions
+*ClusterOptions ClusterOptions
+ValidateMount() error
+IsBindMount() bool
+IsVolumeMount() bool
+IsTmpfsMount() bool
}
class MountPoint {
+Type Type
+string Name
+string Source
+string Destination
+string Driver
+bool RW
+Propagation Propagation
+GetSource() string
+GetDestination() string
+IsReadWrite() bool
}
class VolumeOptions {
+bool NoCopy
+map[string]string Labels
+*Driver DriverConfig
+GetLabels() map[string]string
+GetDriver() *Driver
}
class BindOptions {
+Propagation Propagation
+bool NonRecursive
+bool CreateMountpoint
+bool ReadOnlyForceRecursive
+GetPropagation() Propagation
+IsRecursive() bool
}
Volume --> UsageData
Mount --> BindOptions
Mount --> VolumeOptions
Mount --> TmpfsOptions
5.2 存储结构实现
// 文件路径: api/types/volume/volume.go
// Volume 定义存储卷的完整信息
type Volume struct {
// 创建时间
CreatedAt string `json:"CreatedAt,omitempty"`
// 驱动信息
Driver string `json:"Driver"` // 存储卷驱动名称
// 元数据
Labels map[string]string `json:"Labels"` // 存储卷标签
// 挂载信息
Mountpoint string `json:"Mountpoint"` // 挂载点路径
Name string `json:"Name"` // 存储卷名称
// 驱动选项
Options map[string]interface{} `json:"Options"` // 驱动特定选项
// 作用域
Scope string `json:"Scope"` // 存储卷作用域
// 使用情况(可选)
UsageData *UsageData `json:"UsageData,omitempty"` // 使用统计
// 集群卷信息(Swarm模式)
ClusterInfo map[string]*ClusterVolume `json:"ClusterVolume,omitempty"`
}
// UsageData 定义存储卷使用统计
type UsageData struct {
Size int64 `json:"Size"` // 存储卷大小
RefCount int64 `json:"RefCount"` // 引用计数
}
// 文件路径: api/types/mount/mount.go
// Mount 定义挂载配置
type Mount struct {
// 挂载类型
Type Type `json:"Type,omitempty"`
// 源和目标路径
Source string `json:"Source,omitempty"` // 源路径
Target string `json:"Target,omitempty"` // 容器内目标路径
// 读写权限
ReadOnly bool `json:"ReadOnly,omitempty"`
// 一致性模式(macOS/Windows)
Consistency Consistency `json:"Consistency,omitempty"`
// 类型特定选项
BindOptions *BindOptions `json:"BindOptions,omitempty"`
VolumeOptions *VolumeOptions `json:"VolumeOptions,omitempty"`
TmpfsOptions *TmpfsOptions `json:"TmpfsOptions,omitempty"`
ClusterOptions *ClusterOptions `json:"ClusterOptions,omitempty"`
}
// Type 定义挂载类型
type Type string
const (
// TypeBind 绑定挂载(主机路径到容器路径)
TypeBind Type = "bind"
// TypeVolume 存储卷挂载
TypeVolume Type = "volume"
// TypeTmpfs 临时文件系统挂载
TypeTmpfs Type = "tmpfs"
// TypeNamedPipe 命名管道挂载(Windows)
TypeNamedPipe Type = "npipe"
// TypeCluster 集群存储卷挂载
TypeCluster Type = "cluster"
)
// BindOptions 定义绑定挂载选项
type BindOptions struct {
// 传播模式
Propagation Propagation `json:"Propagation,omitempty"`
// 是否非递归绑定
NonRecursive bool `json:"NonRecursive,omitempty"`
// 是否创建挂载点
CreateMountpoint bool `json:"CreateMountpoint,omitempty"`
// 是否强制递归只读
ReadOnlyForceRecursive bool `json:"ReadOnlyForceRecursive,omitempty"`
}
// Propagation 定义挂载传播模式
type Propagation string
const (
// PropagationRPrivate 私有递归传播
PropagationRPrivate Propagation = "rprivate"
// PropagationPrivate 私有传播
PropagationPrivate Propagation = "private"
// PropagationRShared 共享递归传播
PropagationRShared Propagation = "rshared"
// PropagationShared 共享传播
PropagationShared Propagation = "shared"
// PropagationRSlave 从属递归传播
PropagationRSlave Propagation = "rslave"
// PropagationSlave 从属传播
PropagationSlave Propagation = "slave"
)
// VolumeOptions 定义存储卷挂载选项
type VolumeOptions struct {
// 是否禁用复制
NoCopy bool `json:"NoCopy,omitempty"`
// 存储卷标签
Labels map[string]string `json:"Labels,omitempty"`
// 驱动配置
DriverConfig *Driver `json:"DriverConfig,omitempty"`
}
// Driver 定义存储卷驱动配置
type Driver struct {
Name string `json:"Name"` // 驱动名称
Options map[string]string `json:"Options"` // 驱动选项
}
// TmpfsOptions 定义tmpfs挂载选项
type TmpfsOptions struct {
SizeBytes int64 `json:"SizeBytes,omitempty"` // 大小限制(字节)
Mode uint32 `json:"Mode,omitempty"` // 文件模式
}
// ValidateMount 验证挂载配置
func (m *Mount) ValidateMount() error {
// 1. 验证挂载类型
if m.Type == "" {
return errors.New("mount type cannot be empty")
}
validTypes := []Type{TypeBind, TypeVolume, TypeTmpfs, TypeNamedPipe, TypeCluster}
if !contains(validTypes, m.Type) {
return fmt.Errorf("invalid mount type: %s", m.Type)
}
// 2. 验证目标路径
if m.Target == "" {
return errors.New("mount target cannot be empty")
}
if !filepath.IsAbs(m.Target) {
return fmt.Errorf("mount target must be absolute path: %s", m.Target)
}
// 3. 根据类型验证特定配置
switch m.Type {
case TypeBind:
if m.Source == "" {
return errors.New("bind mount source cannot be empty")
}
if !filepath.IsAbs(m.Source) {
return fmt.Errorf("bind mount source must be absolute path: %s", m.Source)
}
if m.BindOptions != nil {
if err := m.BindOptions.Validate(); err != nil {
return fmt.Errorf("invalid bind options: %v", err)
}
}
case TypeVolume:
// 存储卷名称可以为空(匿名卷)
if m.VolumeOptions != nil {
if err := m.VolumeOptions.Validate(); err != nil {
return fmt.Errorf("invalid volume options: %v", err)
}
}
case TypeTmpfs:
if m.Source != "" {
return errors.New("tmpfs mount should not specify source")
}
if m.TmpfsOptions != nil {
if err := m.TmpfsOptions.Validate(); err != nil {
return fmt.Errorf("invalid tmpfs options: %v", err)
}
}
}
return nil
}
// IsBindMount 检查是否为绑定挂载
func (m *Mount) IsBindMount() bool {
return m.Type == TypeBind
}
// IsVolumeMount 检查是否为存储卷挂载
func (m *Mount) IsVolumeMount() bool {
return m.Type == TypeVolume
}
// IsTmpfsMount 检查是否为tmpfs挂载
func (m *Mount) IsTmpfsMount() bool {
return m.Type == TypeTmpfs
}
6. 系统相关数据结构
6.1 系统信息结构
// 文件路径: api/types/system/info.go
// Info 定义Docker系统信息
type Info struct {
// 基础信息
ID string `json:"ID"` // 守护进程ID
Containers int `json:"Containers"` // 容器总数
ContainersRunning int `json:"ContainersRunning"` // 运行中容器数
ContainersPaused int `json:"ContainersPaused"` // 暂停容器数
ContainersStopped int `json:"ContainersStopped"` // 停止容器数
Images int `json:"Images"` // 镜像总数
Driver string `json:"Driver"` // 存储驱动
DriverStatus [][2]string `json:"DriverStatus"` // 驱动状态信息
// 系统资源
SystemStatus [][2]string `json:"SystemStatus"` // 系统状态
Plugins PluginsInfo `json:"Plugins"` // 插件信息
MemoryLimit bool `json:"MemoryLimit"` // 内存限制支持
SwapLimit bool `json:"SwapLimit"` // 交换限制支持
KernelMemory bool `json:"KernelMemory"` // 内核内存支持
CpuCfsPeriod bool `json:"CpuCfsPeriod"` // CPU CFS周期支持
CpuCfsQuota bool `json:"CpuCfsQuota"` // CPU CFS配额支持
CPUShares bool `json:"CPUShares"` // CPU份额支持
CPUSet bool `json:"CPUSet"` // CPU集合支持
PidsLimit bool `json:"PidsLimit"` // PID限制支持
IPv4Forwarding bool `json:"IPv4Forwarding"` // IPv4转发
BridgeNfIptables bool `json:"BridgeNfIptables"` // 桥接netfilter
BridgeNfIp6tables bool `json:"BridgeNfIp6tables"` // 桥接IPv6 netfilter
Debug bool `json:"Debug"` // 调试模式
NFd int `json:"NFd"` // 文件描述符数
OomKillDisable bool `json:"OomKillDisable"` // OOM杀死禁用
NGoroutines int `json:"NGoroutines"` // Goroutine数量
// 版本信息
SystemTime string `json:"SystemTime"` // 系统时间
LoggingDriver string `json:"LoggingDriver"` // 日志驱动
CgroupDriver string `json:"CgroupDriver"` // Cgroup驱动
NEventsListener int `json:"NEventsListener"` // 事件监听器数
KernelVersion string `json:"KernelVersion"` // 内核版本
OperatingSystem string `json:"OperatingSystem"` // 操作系统
OSVersion string `json:"OSVersion"` // 操作系统版本
OSType string `json:"OSType"` // 操作系统类型
Architecture string `json:"Architecture"` // CPU架构
IndexServerAddress string `json:"IndexServerAddress"` // 索引服务器地址
// 存储信息
RegistryConfig *registry.ServiceConfig `json:"RegistryConfig"` // 注册表配置
NCPU int `json:"NCPU"` // CPU核心数
MemTotal int64 `json:"MemTotal"` // 总内存
GenericResources []swarm.GenericResource `json:"GenericResources"` // 通用资源
DockerRootDir string `json:"DockerRootDir"` // Docker根目录
HttpProxy string `json:"HttpProxy"` // HTTP代理
HttpsProxy string `json:"HttpsProxy"` // HTTPS代理
NoProxy string `json:"NoProxy"` // 不使用代理的地址
Name string `json:"Name"` // 节点名称
Labels []string `json:"Labels"` // 节点标签
ExperimentalBuild bool `json:"ExperimentalBuild"` // 实验性构建
ServerVersion string `json:"ServerVersion"` // 服务器版本
ClusterStore string `json:"ClusterStore"` // 集群存储
ClusterAdvertise string `json:"ClusterAdvertise"` // 集群广播地址
// 运行时信息
Runtimes map[string]Runtime `json:"Runtimes"` // 运行时列表
DefaultRuntime string `json:"DefaultRuntime"` // 默认运行时
Swarm swarm.Info `json:"Swarm"` // Swarm信息
LiveRestoreEnabled bool `json:"LiveRestoreEnabled"` // 实时恢复启用
Isolation string `json:"Isolation"` // 隔离模式
InitBinary string `json:"InitBinary"` // Init二进制文件
ContainerdCommit Commit `json:"ContainerdCommit"` // Containerd提交信息
RuncCommit Commit `json:"RuncCommit"` // Runc提交信息
InitCommit Commit `json:"InitCommit"` // Init提交信息
SecurityOptions []string `json:"SecurityOptions"` // 安全选项
ProductLicense string `json:"ProductLicense"` // 产品许可证
Warnings []string `json:"Warnings"` // 警告信息
}
// PluginsInfo 定义插件信息
type PluginsInfo struct {
Volume []string `json:"Volume"` // 存储卷插件
Network []string `json:"Network"` // 网络插件
Authorization []string `json:"Authorization"` // 授权插件
Log []string `json:"Log"` // 日志插件
}
// Runtime 定义运行时信息
type Runtime struct {
Path string `json:"path"` // 运行时路径
Args []string `json:"runtimeArgs"` // 运行时参数
}
// Commit 定义提交信息
type Commit struct {
ID string `json:"ID"` // 提交ID
Expected string `json:"Expected"` // 期望提交
}
// Version 定义版本信息
type Version struct {
Platform struct{ Name string } `json:"Platform"` // 平台信息
Version string `json:"Version"` // Docker版本
APIVersion string `json:"ApiVersion"` // API版本
MinAPIVersion string `json:"MinAPIVersion"` // 最小API版本
GitCommit string `json:"GitCommit"` // Git提交
BuildTime string `json:"BuildTime"` // 构建时间
GoVersion string `json:"GoVersion"` // Go版本
Os string `json:"Os"` // 操作系统
Arch string `json:"Arch"` // CPU架构
Experimental bool `json:"Experimental"` // 实验性功能
Components []ComponentVersion `json:"Components"` // 组件版本
}
// ComponentVersion 定义组件版本信息
type ComponentVersion struct {
Name string `json:"Name"` // 组件名称
Version string `json:"Version"` // 组件版本
Details map[string]string `json:"Details,omitempty"` // 详细信息
}
通过这个详细的数据结构分析,我们可以看到Moby项目采用了精心设计的数据模型,通过类型安全的Go结构体和清晰的层次关系,有效地管理容器化环境中的各种资源和配置信息。