docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker 容器HostConfig

docker 容器HostConfig 字段示例详解

作者:岳来

本文详细介绍了Docker容器的配置字段及其功能,包括Binds、ContainerIDFile、LogConfig、NetworkMode等,它还展示了这些字段的使用示例,帮助读者更好地理解和使用Docker容器的配置,感兴趣的朋友跟随小编一起看看吧

一、具体字段

字段名称含义作用
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)控制容器的权限范围
CgroupnsModeCgroup 命名空间模式(如 host、private)控制容器的资源隔离级别
Dns/DnsOptions/DnsSearch自定义 DNS 配置覆盖容器的 DNS 设置
ExtraHosts自定义主机名解析绕过 DNS 直接映射IP
IpcModeIPC(进程间通信)模式(如 host、shareable)控制容器的 IPC 资源隔离
Links链接其他容器(–link 参数)实现容器间的服务发现
OomScoreAdjOOM(内存不足)优先级控制容器在内存不足时被终止的顺序
PidModePID 命名空间模式(如 host、container)控制容器的进程可见性
Privileged是否赋予容器所有内核权限允许执行特权操作(如加载内核模块)
PublishAllPorts自动发布容器暴露的端口将 EXPOSE 指令声明的端口映射到主机随机端口
ReadonlyRootfs根文件系统是否只读防止容器修改文件系统
SecurityOpt安全选项(如 label:disable)控制 SELinux/AppArmor 策略
UTSModeUTS(主机名和域名)命名空间模式(如 host)控制容器的主机名设置
UsernsMode用户命名空间模式(如 host、mapped)控制用户 ID 映射
ShmSize共享内存大小(/dev/shm)限制容器的共享内存使用
Runtime容器运行时(如 runc、containerd切换容器执行引擎
CpuSharesCPU 权重(相对值,非硬性限制)控制 CPU 资源分配比例
Memory内存硬限制(单位:字节)限制容器的最大内存使用
NanoCpusCPU 配额(纳秒,用于 CFS)限制容器的 CPU 使用时间
BlkioWeight块设备 I/O 权重控制 I/O 资源分配比例
PidsLimit最大进程数限制限制容器的进程数量
CgroupParentCgroup 父命名空间自定义资源分组
HugepageLimits大页内存限制限制大页内存使用
OomKillDisable是否禁用 OOM Killer控制容器在内存不足时是否被终止
CpuPeriod/CpuQuotaCPU 周期和配额(用于 CFS)精细控制 CPU 使用
CpusetCpus/CpusetMemsCPU/Memory 分配指定容器可用的 CPU 核心和内存节点
Devices设备白名单控制容器可访问的设备
ConsoleSize控制台窗口大小(行数 x 列数)设置容器的终端尺寸
Isolation隔离模式(仅 Windows 容器)控制容器的隔离级别
BlkioWeightDevice块设备 I/O 权重(按设备区分)控制不同设备的 I/O 权重
MemorySwap内存交换空间大小限制容器可使用的 swap 内存
MemorySwappiness内存交换倾向(0-100)控制内存页交换比例
Ulimits用户资源限制(如 nofile)限制容器的资源使用
CpuCountCPU 核心数限制限制容器可使用的 CPU 核心数
CpuPercentCPU 百分比限制限制容器的 CPU 使用百分比
IOMaximumIOps最大 IOPS 限制控制容器的 I/O 性能
IntelRdtL3CbmIntel RDT L3 缓存带宽管理优化多租户场景的缓存使用
MaskedPaths隐藏主机文件路径提升安全性
ReadonlyPaths只读挂载主机文件路径提升安全性

二、 示例

2.1、Binds

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

$ 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": "",
$ 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
$ 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 生成

$ 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 生成

$ 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等。每个驱动支持的选项不同:

$ 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-addressGELF 日志服务器地址(如 udp://graylog.example.com:12201)gelf
gelf-programs映射容器命令到 GELF 的 program 字段gelf
gelf-tls启用 TLS 加密(如 on, off)gelf
aws-regionAWS Lambda 日志区域awslogs
aws-logs-groupAWS CloudWatch 日志组名称awslogs
aws-logs-streamAWS CloudWatch 日志流名称awslogs
aws-logs-create-group是否自动创建日志组(true/false)awslogs
fluentd-addressFluentd 服务器地址(如 localhost:24224)fluentd
fluentd-async是否异步发送日志(true/false)fluentd
fluentd-connection-limit最大并发连接数(如 5)fluentd
fluentd-timeoutFluentd 超时时间(单位:秒)fluentd
gcp-projectGoogle Cloud Project IDgcplogs
gcp-log-project日志项目(如 my-project)gcplogs
gcp-log日志名称(如 my-container)gcplogs

2.3.2、常见日志驱动及其配置示例

2.3.2.1、 json-file 驱动(默认驱动)
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 驱动
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 驱动
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 驱动
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 驱动
docker run --log-driver=fluentd \
  --log-opt fluentd-address=localhost:24224 \
  --log-opt fluentd-async=true \
  my_image
驱动常用场景适用场景
json-file本地日志存储开发、调试、简单部署
syslog系统日志集成传统系统日志集中管理
gelfGraylog 集成日志分析平台(如 Graylog)
awslogsAWS CloudWatchAWS 云环境
fluentdFluentd 日志聚合微服务日志统一处理
gcplogsGoogle Cloud PlatformGCP 云环境

三、HostConfig 和Config 差异

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

3.1、Config 字段

3.1.1、 作用

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

3.1.2、特点

3.1.3、 使用场景

3.2、 HostConfig 字段

3.2.1、 作用

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

3.2.2、特点

3.2.3、 使用场景

3.3、 核心差异对比

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

3.4、 关键区别总结

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

3.5、 典型使用场景

到此这篇关于docker 容器HostConfig 字段示例详解的文章就介绍到这了,更多相关docker 容器HostConfig内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文