hostconfig.json 是 Docker 容器元数据中的一个关键配置文件,通常位于 /var/lib/docker/containers/<container_id>/ 目录下。它主要存储了容器在主机层面(Host)的配置信息,即容器与宿主机之间的交互规则和资源限制。
一、文件内容示例
json
{
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
"max-size": "10m",
"max-file": "3"
}
},
"NetworkMode": "bridge",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
]
},
"RestartPolicy": {
"Name": "unless-stopped",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
}
二、字段解释
2.1. 网络配置(Network)
控制容器如何连接到宿主机的网络。
| 字段 | 说明 |
|---|---|
NetworkMode |
网络模式,如 "bridge"、"host"、"none"、"container:<name>" 等。 |
PortBindings |
端口映射规则,例如 "8080/tcp": [{"HostIp": "", "HostPort": "80"}] 表示将宿主机的 80 端口映射到容器的 80 端口。 |
PublishAllPorts |
是否自动发布所有暴露的端口(对应 docker run -P)。 |
Dns |
自定义 DNS 服务器地址列表。 |
DnsSearch |
DNS 搜索域。 |
ExtraHosts |
自定义 hosts 条目,格式为 "hostname:IP"。 |
2.2. 资源限制(Resources)
限制容器对宿主机资源的使用。
| 字段 | 说明 |
|---|---|
Memory |
内存限制(字节),如 536870912 表示 512MB。 |
MemorySwap |
内存 + Swap 总限制。若等于 Memory,则禁用 Swap。 |
CpuShares |
CPU 共享权重(相对值),默认 1024。 |
CpuQuota / CpuPeriod |
CPU 配额限制(微秒级),用于硬限制 CPU 使用率。 |
CpusetCpus |
绑定特定 CPU 核心,如 "0,1"。 |
BlkioWeight |
块设备 I/O 权重。 |
Ulimits |
用户限制,如打开文件数、进程数等。 |
2.3. 重启策略(Restart Policy)
定义容器退出后的行为。
| 字段 | 说明 |
|---|---|
RestartPolicy.Name |
策略名称:"no"、"always"、"on-failure"、"unless-stopped"。 |
RestartPolicy.MaximumRetryCount |
当策略为 "on-failure" 时,最大重试次数。 |
2.4. 日志驱动(Logging)
控制容器标准输出和错误输出的日志处理方式。
| 字段 | 说明 |
|---|---|
LogConfig.Type |
日志驱动类型,如 "json-file"、"syslog"、"journald"、"fluentd" 等。 |
LogConfig.Config |
驱动特定配置,如 "max-size": "10m", "max-file": "3"。 |
2.5. 安全与权限(Security & Privileges)
控制容器的安全隔离级别。
| 字段 | 说明 |
|---|---|
Privileged |
是否以特权模式运行(相当于 --privileged),拥有几乎全部主机权限。 |
CapAdd / CapDrop |
添加或删除 Linux 能力(Capabilities),如 ["NET_ADMIN"]。 |
SecurityOpt |
安全选项,如 SELinux/AppArmor 标签、seccomp 配置文件等。 |
ReadonlyRootfs |
是否将根文件系统设为只读。 |
UsernsMode |
用户命名空间模式,用于 UID 映射隔离。 |
2.6. 设备与挂载(Devices & Mounts)
注意:卷挂载信息主要在 config.v2.json 或 mounts.json 中,但部分设备映射在此。
| 字段 | 说明 |
|---|---|
Devices |
映射主机设备到容器,如 /dev/ttyUSB0:/dev/ttyUSB0:rwm。 |
IpcMode |
IPC 命名空间模式,如 "shareable"、"host"。 |
PidMode |
PID 命名空间模式,如 "host" 表示共享主机 PID 空间。 |
UTSMode |
UTS 命名空间模式,影响主机名隔离。 |
2.7. 其他杂项
| 字段 | 说明 |
|---|---|
AutoRemove |
容器退出后是否自动删除(对应 docker run --rm)。 |
Init |
是否使用 init 进程(tini)作为 PID 1。 |
Runtime |
使用的 OCI 运行时,如 "runc"、"kata-runtime"。 |
ShmSize |
/dev/shm 的大小(字节)。 |
Sysctls |
设置容器内的内核参数,如 "net.ipv4.ip_forward": "1"。 |
三、注意事项
-
不要手动编辑:Docker 内部状态复杂,手动修改可能导致 daemon 无法识别容器状态。
-
使用
docker inspect查看 :bashdocker inspect <container_name_or_id>输出中的
"HostConfig"部分即为hostconfig.json的内容,且更易读。 -
修改配置的正确方式 :
- 动态更新资源限制:
docker update --memory=512m <container> - 修改端口/卷/环境变量:需停止并删除容器,再用新参数重新运行。
- 使用 Docker Compose 或 Kubernetes YAML 管理配置,便于版本控制和复用。
- 动态更新资源限制: