docker 容器HostConfig 字段 示例

文章目录

    • 一、具体字段
    • [二、 示例](#二、 示例)
    • [三、HostConfig 和Config 差异](#三、HostConfig 和Config 差异)
      • [3.1、Config 字段](#3.1、Config 字段)
        • [3.1.1、 作用](#3.1.1、 作用)
        • 3.1.2、特点
        • [3.1.3、 使用场景](#3.1.3、 使用场景)
      • [3.2、 HostConfig 字段](#3.2、 HostConfig 字段)
        • [3.2.1、 作用](#3.2.1、 作用)
        • 3.2.2、特点
        • [3.2.3、 使用场景](#3.2.3、 使用场景)
      • [3.3、 核心差异对比](#3.3、 核心差异对比)
      • [3.4、 关键区别总结](#3.4、 关键区别总结)
      • [3.5、 典型使用场景](#3.5、 典型使用场景)

Docker 的HostConfig 是主机级配置,定义容器与主机环境的交互方式,控制资源分配和隔离策略。

一、具体字段

字段名称 含义 作用
Binds 绑定挂载列表(-v 或 --mount) 将主机目录/文件挂载到容器内
ContainerIDFile 存储容器 ID 的文件路径 将容器 ID 写入指定文件
LogConfig 日志驱动和选项配置(如 json-file、syslog) 定义容器日志的存储方式
NetworkMode 网络模式(如 host、bridge、none 控制容器的网络隔离级别
PortBindings 端口映射配置(-p 参数) 将容器端口绑定到主机端口
RestartPolicy 重启策略(如 always、on-failure) 定义容器异常退出后的重启行为
AutoRemove 容器退出后自动删除 避免残留容器占用磁盘空间
VolumeDriver 卷驱动(如 local、nfs) 定义卷的存储后端
VolumesFrom 从其他容器挂载卷 共享另一个容器的卷
CapAdd/CapDrop 添加/移除 Linux 内核能力(如 CAP_NET_ADMIN) 控制容器的权限范围
CgroupnsMode Cgroup 命名空间模式(如 host、private) 控制容器的资源隔离级别
Dns/DnsOptions/DnsSearch 自定义 DNS 配置 覆盖容器的 DNS 设置
ExtraHosts 自定义主机名解析 绕过 DNS 直接映射IP
IpcMode IPC(进程间通信)模式(如 host、shareable) 控制容器的 IPC 资源隔离
Links 链接其他容器(--link 参数) 实现容器间的服务发现
OomScoreAdj OOM(内存不足)优先级 控制容器在内存不足时被终止的顺序
PidMode PID 命名空间模式(如 host、container) 控制容器的进程可见性
Privileged 是否赋予容器所有内核权限 允许执行特权操作(如加载内核模块)
PublishAllPorts 自动发布容器暴露的端口 将 EXPOSE 指令声明的端口映射到主机随机端口
ReadonlyRootfs 根文件系统是否只读 防止容器修改文件系统
SecurityOpt 安全选项(如 label:disable) 控制 SELinux/AppArmor 策略
UTSMode UTS(主机名和域名)命名空间模式(如 host) 控制容器的主机名设置
UsernsMode 用户命名空间模式(如 host、mapped) 控制用户 ID 映射
ShmSize 共享内存大小(/dev/shm) 限制容器的共享内存使用
Runtime 容器运行时(如 runc、containerd 切换容器执行引擎
CpuShares CPU 权重(相对值,非硬性限制) 控制 CPU 资源分配比例
Memory 内存硬限制(单位:字节) 限制容器的最大内存使用
NanoCpus CPU 配额(纳秒,用于 CFS) 限制容器的 CPU 使用时间
BlkioWeight 块设备 I/O 权重 控制 I/O 资源分配比例
PidsLimit 最大进程数限制 限制容器的进程数量
CgroupParent Cgroup 父命名空间 自定义资源分组
HugepageLimits 大页内存限制 限制大页内存使用
OomKillDisable 是否禁用 OOM Killer 控制容器在内存不足时是否被终止
CpuPeriod/CpuQuota CPU 周期和配额(用于 CFS) 精细控制 CPU 使用
CpusetCpus/CpusetMems CPU/Memory 分配 指定容器可用的 CPU 核心和内存节点
Devices 设备白名单 控制容器可访问的设备
ConsoleSize 控制台窗口大小(行数 x 列数) 设置容器的终端尺寸
Isolation 隔离模式(仅 Windows 容器) 控制容器的隔离级别
BlkioWeightDevice 块设备 I/O 权重(按设备区分) 控制不同设备的 I/O 权重
MemorySwap 内存交换空间大小 限制容器可使用的 swap 内存
MemorySwappiness 内存交换倾向(0-100) 控制内存页交换比例
Ulimits 用户资源限制(如 nofile) 限制容器的资源使用
CpuCount CPU 核心数限制 限制容器可使用的 CPU 核心数
CpuPercent CPU 百分比限制 限制容器的 CPU 使用百分比
IOMaximumIOps 最大 IOPS 限制 控制容器的 I/O 性能
IntelRdtL3Cbm Intel RDT L3 缓存带宽管理 优化多租户场景的缓存使用
MaskedPaths 隐藏主机文件路径 提升安全性
ReadonlyPaths 只读挂载主机文件路径 提升安全性

二、 示例

2.1、Binds

使用 docker run -v /host/path:/container/path 生成

  • 宿主机和容器内目录存在
bash 复制代码
$ docker run -itd -v /tmp/test:/tmp  centos:1.0 /bin/bash
d6cd7fec98616490b424aa864ac3ecfeeb48e88f08f030bff2c9eb3690fbe93e

$ docker inspect -f {{.HostConfig.Binds}} d6cd7fec986164
[/tmp/test:/tmp]

$ docker inspect d6cd7fec986164 | grep -A 3 Binds
            "Binds": [
                "/tmp/test:/tmp"
            ],
            "ContainerIDFile": "",
  • 宿主机目录不存在,容器引擎会创建这个目录
bash 复制代码
$ ll /tmp/ | grep test
drwxr-xr-x 3 root  root  4096 Jul 28 19:06 busyboxtest
drwxr-xr-x 2 root  root  4096 Jan  4 13:53 test

$ docker run -itd -v /tmp/test02:/tmp  centos:1.0 /bin/bash
da13bd92f79305476d9ada242347aa098ee5c3c981169131326db9ad07c43c32

$ ll /tmp/ | grep test
drwxr-xr-x 3 root  root  4096 Jul 28 19:06 busyboxtest
drwxr-xr-x 2 root  root  4096 Jan  4 13:53 test
drwxr-xr-x 2 root  root  4096 Jan  4 13:59 test02
  • 容器目录不存在,容器引擎也会创建这个目录
bash 复制代码
$ docker run -itd -v /tmp/test02:/tmp/test03  centos:1.0 /bin/bash
29db9a19a835325df6be4645b855dfd579cb7bbcde578e7b33b019d69c79ff22

$ docker exec -it 29db9a19a ls -l /tmp 
total 4
drwxr-xr-x 2 root root 4096 Jan  4 13:59 test03
  • 总结
情况 宿主机目录 容器目录 挂载结果 注意事项
宿主机目录存在,容器目录不存在 容器目录自动创建,挂载成功 容器目录内容被宿主机目录覆盖
宿主机目录不存在,容器目录存在 宿主机目录自动创建(权限允许时) 可能因权限问题挂载失败
宿主机和容器目录都不存在 两者自动创建(权限允许时 ) 宿主机目录权限不足时挂载失败
宿主机和容器目录都存在 容器目录内容被宿主机目录覆盖 宿主机目录内容优先级更高

2.2、ContainerIDFile

使用 --cidfile=/path/to/cidfile 生成

bash 复制代码
$ docker run -itd --cidfile=/tmp/cid.txt  centos:1.0 /bin/bash
0a7cb18828951e3ed53b546dbef840c141503cae479113caa7e35ece18b25ce1

$ cat /tmp/cid.txt 
0a7cb18828951e3ed53b546dbef840c141503cae479113caa7e35ece18b25ce1

$ docker inspect -f {{.HostConfig.ContainerIDFile}} 0a7cb188289
/tmp/cid.txt

2.3、LogConfig

使用 --log-driver=json-file --log-opt max-size=10m 生成

bash 复制代码
$ docker run -itd --log-driver=json-file --log-opt max-size=10m  centos:1.0 /bin/bash
b12b7ebd0566af9121e780e92c78a26d95bb2fac608fdf1c4f19f72845351639

$ docker inspect -f {{.HostConfig.LogConfig}} 0a7cb188289
{json-file map[]}

$ docker inspect b12b7ebd0566a | grep -A 5 LogConfig
            "LogConfig": {
                "Type": "json-file",
                "Config": {
                    "max-size": "10m"
                }
            },

常见的日志驱动包括json-file、local、syslog、journald、gelf等。每个驱动支持的选项不同:

bash 复制代码
$ docker run -itd --log-driver=local --log-opt max-size=10m  centos:1.0 /bin/bash
de4561e95b46f68bae0bf892f6f582a5e2c6ec1cb00f114792c35ca7a469fa08

$ docker inspect de4561e95b46 | grep -A 5 LogConfig
            "LogConfig": {
                "Type": "local",
                "Config": {
                    "max-size": "10m"
                }
            },
2.3.1、日志驱动支持的通用选项
选项名称 作用 适用驱动
max-size 单个日志文件的最大大小(单位:b, k, m, g) json-file, local
max-file 保留的最大日志文件数量 json-file, local
tag 为日志添加标识符(用于区分来源) 所有驱动
env 包含指定环境变量到日志中 json-file, syslog
env-regex 使用正则表达式匹配环境变量 json-file, syslog
labels 包含指定标签到日志中 json-file, syslog
label-regex 使用正则表达式匹配标签 json-file, syslog
compress 是否压缩旧日志文件(仅 json-file) json-file
format 定义日志格式(如 json, text) json-file
mode 日志文件权限模式(如 0640) json-file
path 自定义日志文件路径(需与 json-file 驱动配合) json-file
tag-field 指定日志中的标签字段名 json-file
timestamp-format 自定义日志时间戳格式(如 iso8601) json-file
syslog-address 指定 syslog 服务器地址(如 udp://192.168.1.100:514) syslog
syslog-facility 设置 syslog 的 facility(如 daemon) syslog
gelf-address GELF 日志服务器地址(如 udp://graylog.example.com:12201) gelf
gelf-programs 映射容器命令到 GELF 的 program 字段 gelf
gelf-tls 启用 TLS 加密(如 on, off) gelf
aws-region AWS Lambda 日志区域 awslogs
aws-logs-group AWS CloudWatch 日志组名称 awslogs
aws-logs-stream AWS CloudWatch 日志流名称 awslogs
aws-logs-create-group 是否自动创建日志组(true/false) awslogs
fluentd-address Fluentd 服务器地址(如 localhost:24224) fluentd
fluentd-async 是否异步发送日志(true/false) fluentd
fluentd-connection-limit 最大并发连接数(如 5) fluentd
fluentd-timeout Fluentd 超时时间(单位:秒) fluentd
gcp-project Google Cloud Project ID gcplogs
gcp-log-project 日志项目(如 my-project) gcplogs
gcp-log 日志名称(如 my-container) gcplogs
2.3.2、常见日志驱动及其配置示例
2.3.2.1、 json-file 驱动(默认驱动)
  • 用途:本地存储 JSON 格式的日志文件。
  • 常用选项:
    • max-size:限制单个日志文件大小。
    • max-file:保留日志文件数量。
    • compress:压缩旧日志文件。
    • tag:为日志添加标识符。
  • 示例:
bash 复制代码
docker run --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  --log-opt tag=my-container \
  my_image

限制日志文件最大 10MB,保留 3 个文件,并添加 my-container 标签。

2.3.2.2、syslog 驱动
  • 用途:将日志发送到系统 syslog 服务。
  • 常用选项:
    • syslog-address:syslog 服务器地址。
    • syslog-facility:日志设施(如 daemon)。
    • tag:日志标签。
  • 示例:
bash 复制代码
docker run --log-driver=syslog \
  --log-opt syslog-address=udp://192.168.1.100:514 \
  --log-opt syslog-facility=daemon \
  --log-opt tag=my-container \
  my_image
2.3.2.3、 gelf 驱动
  • 用途:将日志发送到 Graylog(GELF 格式)。
  • 常用选项:
    • gelf-address:Graylog 服务器地址。
    • gelf-programs:映射容器命令到 program 字段(格式:command=program)。
  • 示例:
bash 复制代码
docker run --log-driver=gelf \
  --log-opt gelf-address=udp://graylog.example.com:12201 \
  --log-opt gelf-programs="my_container=my-app" \
  my_image
2.3.2.4、awslogs 驱动
  • 用途:将日志发送到 AWS CloudWatch。
  • 常用选项:
    • aws-logs-group:日志组名称。
    • aws-logs-stream:日志流名称。
    • aws-logs-create-group:是否自动创建日志组。
  • 示例:
bash 复制代码
docker run --log-driver=awslogs \
  --log-opt aws-logs-group=my-group \
  --log-opt aws-logs-stream=my-stream \
  --log-opt aws-logs-create-group=true \
  my_image
2.3.2.5、fluentd 驱动
  • 用途:将日志发送到 Fluentd。
  • 常用选项:
    • fluentd-address:Fluentd 服务器地址。
    • fluentd-async:是否异步发送日志。
  • 示例:
bash 复制代码
docker run --log-driver=fluentd \
  --log-opt fluentd-address=localhost:24224 \
  --log-opt fluentd-async=true \
  my_image
驱动 常用场景 适用场景
json-file 本地日志存储 开发、调试、简单部署
syslog 系统日志集成 传统系统日志集中管理
gelf Graylog 集成 日志分析平台(如 Graylog)
awslogs AWS CloudWatch AWS 云环境
fluentd Fluentd 日志聚合 微服务日志统一处理
gcplogs Google Cloud Platform GCP 云环境

三、HostConfig 和Config 差异

Docker 容器的 HostConfig 和 Config 是两个核心配置字段,分别描述容器的运行时配置镜像/容器自身配置。Config 是容器的 "DNA",由镜像决定,定义容器的核心行为。HostConfig 是容器的 "运行时环境",由主机参数决定,控制容器如何与主机资源交互。两者共同作用于容器的运行,但 Config 更偏向静态属性,HostConfig 更偏向动态策略。

3.1、Config 字段

3.1.1、 作用

容器自身配置:定义容器的基础属性,与镜像和容器运行时行为直接相关。内容范围:

  • 镜像信息(如 Image)
  • 容器启动命令(如 Cmd、Entrypoint)
  • 环境变量(Env)
  • 工作目录(WorkingDir)
  • 用户权限(User)
  • 暂存层(Hostname、Domainname)
3.1.2、特点
  • 来源于镜像:大部分字段由 Dockerfile 中的指令(如 CMD、ENV、WORKDIR)生成。
  • 静态配置:通常在容器创建时固定,运行时不可修改。
  • 与镜像强相关:Config 是容器的基础模板,继承自镜像的元数据。
3.1.3、 使用场景
  • 定义容器的默认行为(如启动命令、环境变量)。
  • 调试容器的镜像配置(如通过 docker inspect 查看 Config)。

3.2、 HostConfig 字段

3.2.1、 作用

主机级配置:定义容器与主机环境的交互方式,控制资源分配和隔离策略。内容范围:

  • 网络模式(NetworkMode)
  • 端口映射(PortBindings)
  • 资源限制(Memory、CpuShares)
  • 卷挂载(Binds、VolumesFrom)
  • 安全策略(Privileged、SecurityOpt)
3.2.2、特点
  • 来源于运行时参数:由 docker run 命令的选项(如 -p、-v、--network)生成。
  • 动态配置:部分字段在容器运行时可调整(如通过 docker update 修改资源限制)。
  • 与主机环境强相关:直接控制容器如何与主机资源(CPU、内存、网络)交互。
3.2.3、 使用场景
  • 管理容器的资源分配(如限制内存、CPU)。
  • 配置网络和存储(如绑定挂载、端口映射)。
  • 定义安全策略(如启用特权模式、SELinux/AppArmor 策略)。

3.3、 核心差异对比

维度 Config 字段 HostConfig 字段
作用范围 容器自身行为(与镜像强相关) 容器与主机的交互(与运行时强相关)
配置来源 来自 Dockerfile 或镜像元数据 来自 docker run 命令的运行时参数
可修改性 大部分字段不可修改(运行时固定) 部分字段可动态调整(如资源限制)
生命周期 容器创建时确定,运行时不可变 容器运行时可动态更新(如通过 docker update)
关联对象 与容器和镜像直接关联 与主机环境和运行时参数直接关联

3.4、 关键区别总结

Config HostConfig
定义容器的 默认行为(如启动命令、环境变量) 定义容器的 资源限制和隔离策略(如内存、CPU、网络)
由 Dockerfile 构建镜像时生成,不可通过运行时参数修改 由 docker run 命令指定,支持运行时动态调整(如 docker update)
包含镜像元数据(如 Image、Cmd),与容器的 身份和功能 直接相关 包含主机环境配置(如 PortBindings、Memory),与容器的 资源和安全 相关
用于 镜像构建和容器初始化 用于 容器运行时管理

3.5、 典型使用场景

  • Config:
    • 镜像构建时设置默认命令(如 CMD ["nginx", "-g", "daemon off;"])
    • 调试容器时查看默认环境变量(Env)和工作目录(WorkingDir)
  • HostConfig:
    • 运行容器时限制内存(--memory=2g)和 CPU(--cpus=0.5)
    • 挂载卷(-v)或设置网络模式(--network=host)
相关推荐
喵叔哟1 天前
16.项目架构设计
后端·docker·容器·.net
眠りたいです1 天前
Docker核心技术和实现原理第一部分-Docker镜像制作
运维·docker·容器·集群·镜像·dockerfile
面对疾风叭!哈撒给1 天前
Liunx之Docker 安装启动 influxdb2
java·spring cloud·docker
liuc03171 天前
docker下安装mysql
mysql·docker·容器
嚣张丶小麦兜1 天前
docker的简单应用
前端·docker
IT老胡1 天前
Docker入门与实操(1):Docker简介
运维·docker·容器
仅此,1 天前
docker 方式,postgreSQL18 安装 jieba 分词器扩展
运维·docker·postgresql·容器·中文分词·jieba
oMcLin1 天前
如何在Ubuntu 20.04系统的香港服务器上使用Docker搭建高效的CI/CD流水线并集成Kubernetes?
服务器·ubuntu·docker
VicdorLin1 天前
docker报错: client version 1.24 is too old. Minimum supported API version is 1.44
运维·docker·容器