内网环境下如何在 Docker 中运行 Fluentd?
内网运行 Fluentd Docker 容器的关键点:离线镜像准备(save/load)、插件离线安装(gem 本地安装进自建镜像)、端口与日志目录挂载。本文给出无外网环境的完整部署方案。
内网部署的核心是解决"镜像和插件从哪来":在外网机器拉好镜像 docker save 导出,内网 docker load 导入;需要的插件在打镜像时用 gem 本地安装进去,之后运行与普通容器无异。
1. 离线准备镜像
外网机器:
docker pull fluent/fluentd:v1.16-debian-1
docker save fluent/fluentd:v1.16-debian-1 -o fluentd.tar
拷贝到内网后 docker load -i fluentd.tar。
2. 插件离线安装(自建镜像)
Fluentd 输出到 ES/Kafka 等常需插件,一并打进镜像:
FROM fluent/fluentd:v1.16-debian-1
USER root
COPY gems/ /tmp/gems/
RUN gem install --local /tmp/gems/fluent-plugin-elasticsearch-*.gem
USER fluent
gem download 在外网把 gem 及其依赖全部下载好,COPY 进去本地安装。
3. 运行
docker run -d --name fluentd \
-v /opt/fluentd/conf:/fluentd/etc \
-v /var/log:/var/log:ro \
-p 24224:24224 \
fluentd-custom:latest \
fluentd -c /fluentd/etc/fluent.conf
注意挂载:配置目录、要采集的日志目录(只读)、接收 forward 协议的端口。
观测云对照
观测云提供离线安装包与内网部署方案:DataKit 离线包直接安装,数据经内网可达的 DataWay/私有网关上报,插件体系内置无需单独安装。
常见问题(FAQ)
Q:怎么确认插件依赖齐了? 外网机器上实际运行一遍 fluentd -c xxx --dry-run,缺什么补什么。
Q:内网时间不同步会影响日志吗? 会——日志时间戳错乱,内网也要配 NTP。