惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
The Last Watchdog
The Last Watchdog
Cyberwarzone
Cyberwarzone
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
L
Lohrmann on Cybersecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
The Cloudflare Blog
V
V2EX
博客园_首页
博客园 - 聂微东
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
G
GRAHAM CLULEY
T
Tenable Blog
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
L
LINUX DO - 最新话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
SecWiki News
SecWiki News
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
T
Troy Hunt's Blog
博客园 - 【当耐特】
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
A
About on SuperTechFans
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
D
DataBreaches.Net
P
Privacy & Cybersecurity Law Blog
Schneier on Security
Schneier on Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
D
Docker
P
Proofpoint News Feed

教程 – liseezn'blog

在Zeabur部署Rhex现代论坛 – liseezn'blog Rhex论坛接入DeepSeek 踩坑实录 – liseezn'blog SVGcode 一键部署到 Zeabur – liseezn'blog Edge密码危机自救:1小时的迁移双持方案 – liseezn'blog Token到底是什么意思 – liseezn'blog 解决Docker构建PHP8.2+XLoad镜像常见报错,附国内加速+GitHub推送指南 – liseezn'blog OpenClaw 完整部署+接入OpenRouter全教程(Zeabur平台) – liseezn'blog SeeFriends:一款让你轻松管理友情链接的 WordPress 插件 – liseezn'blog Zeabur 一键部署 OpenClaw 教程(折后最低1.6美元/月) – liseezn'blog Zeabur部署Matomo教程 – liseezn'blog 用certd,5分钟搞定HTTPS证书 – liseezn'blog 开源一款BMI+体脂率综合计算器 – liseezn'blog 轻松迁移网站:使用UpdraftPlus完整教程 – liseezn'blog Zed 编辑器高效配置指南:从安装到打造专属前端工作流 – liseezn'blog
OpenTofu 实战:用开源 IaC 工具一键部署 Docker 应用 – liseezn'blog
liseeze · 2024-02-04 · via 教程 – liseezn'blog

本文最后更新于37 天前,其中的信息可能已经过时,如有错误请发送邮件到[email protected]

2024 年 1 月,Linux 基金会正式发布了 OpenTofu 的第一个稳定版本,这是一个从 Terraform 分支而来的开源基础设施即代码工具。面对云服务商的许可证变更,OpenTofu 承诺保持 MPL 2.0 协议开放。本文将通过一个完整的实战案例——用 OpenTofu 在本地 Docker 环境中启动一个 Nginx 容器——带你快速上手这个工具。

  1. 什么是 OpenTofu?

简单来说,它就是曾经免费的 Terraform 的社区维护版,与 Terraform 语法完全兼容,你甚至可以将原有的 .tf 文件直接拿来用。它的工作流依然是熟悉的 init → plan → apply。

  1. 环境准备

· 一台安装好 Docker 的机器(Windows/macOS/Linux 均可)
· 基本的终端操作能力

Docker 安装可参考官方文档,确认 docker ps 可正常运行。

  1. 安装 OpenTofu

在 macOS 上:

brew install opentofu

其他系统可以从 GitHub Releases 下载二进制文件,解压后放到 PATH 中。

验证安装:

tofu --version

看到 OpenTofu v1.6.0 类似字样即为成功。

  1. 编写配置文件

创建一个新目录,比如 tofu-nginx,在里面新建文件 main.tf:

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0"
    }
  }
}

provider "docker" {
  # 默认连接本地 Docker 守护进程,无需额外配置
}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "opentofu-nginx-demo"
  ports {
    internal = 80
    external = 8080
  }
}

这段代码的含义:

· 声明需要 docker provider。
· 拉取 nginx:latest 镜像。
· 创建一个名为 opentofu-nginx-demo 的容器,将本机 8080 端口映射到容器 80 端口。

  1. 初始化与部署

在终端中进入该目录,执行:

tofu init

此命令会下载所需的 provider 插件,与 Terraform 相同。

然后执行:

tofu plan

你会看到一个清晰的执行计划,显示将要创建的资源。确认无误后,执行:

tofu apply

输入 yes 确认,等待几十秒,容器就创建完成了。

打开浏览器访问 http://localhost:8080,你会看到熟悉的 “Welcome to nginx!” 页面。这就是我们用代码定义出来的 Web 服务。

  1. 状态管理与清理

OpenTofu 会生成一个 terraform.tfstate 文件保存当前资源状态,千万不要手动修改。
当你不需要这个容器时,执行:

tofu destroy

再次输入 yes,所有资源将被安全清除,不留残留。

  1. 与 Terraform 的兼容性

如果你从 Terraform 迁移,只需要把 terraform 命令替换为 tofu,terraform.tfstate 可以无缝继续使用。社区还提供了迁移工具 tf2tofu,可以自动重命名相关文件和模块引用。

  1. 进阶:加入变量和输出

为了让配置更灵活,我们创建 variables.tf:

variable "container_name" {
  default = "my-nginx"
}
variable "host_port" {
  default = 8080
}

修改 main.tf 中的 name 和 external 为 var.container_name 和 var.host_port。

然后创建 outputs.tf:

output "nginx_url" {
  value = "http://localhost:${var.host_port}"
}

再次 tofu apply 后,会在终端直接输出访问地址。这就是 IaC 的基本玩法。

结语

OpenTofu 的出现让基础设施自动化真正回归社区。通过这个简单的 Docker 部署教程,你会发现它上手难度几乎为零。下一步,你完全可以把这个模式迁移到 AWS、阿里云等云平台,用代码管理自己的所有云端资源。