
目录
使用nginx 镜像启动一个名为hello-world的容器并对外暴露8080端口
前言
博主自18年开始使用Terraform工具来管理云上资源,对于云资源管理与上云有着丰富经验。曾用它管理过数个云厂商资源(AWS/Aliyun/Ksyun/以及自建OpenStack等)。今天给大家推荐一下Terraform。陆续会出一个Terraform 系列教程,有疑问可以评论区留言,共同学习。
HashiCorp Terraform 是一种基础架构即代码工具,可以让您在易读的配置文件中定义云和预置资源,您可以对这些文件进行版本控制、重用和共享。 然后,您可以使用一致的工作流程在其整个生命周期内配置和管理所有基础设施。 Terraform 可以管理计算、存储和网络资源等基础组件,以及 DNS 条目和 SaaS 功能等高级组件。
Terraform 如何工作
Terraform 通过云平台和其他服务应用程序编程接口 (API) 创建和管理资源。 Providersk 可以使 Terraform 能够与几乎任何具有可访问 API 的平台或服务一起工作。

HashiCorp 和 Terraform 社区已经编写了数千个providers来管理许多不同类型的资源和服务。 您可以在 Terraform Registry 上找到所有公开可用的providers,包括 Amazon Web Services (AWS)、Ksyun、Aliyun、Azure、Google Cloud Platform (GCP)、Kubernetes、Helm 等等。
Terraform 核心工作流程包括以下三个阶段:
Write: 您定义资源,这些资源可能跨越多个云提供商和服务。 例如,您可能需要创建一个配置以在特定的虚拟私有云 (VPC) 中创建虚拟机并绑定安全组和负载均衡器,然后在虚拟机部署应用程序通过负载均衡器对外提供服务。
Plan: Terraform 会创建一个执行计划,描述它将根据现有基础设施和您的配置创建、更新或销毁的基础设施。
Apply: 获得批准后,Terraform 会以正确的顺序执行建议的操作,同时尊重任何资源依赖性。 例如,如果您更新 VPC 的属性并更改该 VPC 中的虚拟机数量,Terraform 将在伸缩虚拟机之前重新创建或更新VPC。

为什么要使用Terraform?
管理任何基础设施
您可以在 Terraform Registry 中查找许多平台和服务厂商查找对应的 provider。 当然您也可以自己写一个provider。 Terraform 对基础设施采用不可变方法,降低了升级或修改服务和基础设施的复杂性。
跟踪基础设施
Terraform 会生成一个计划并在修改基础设施之前需要得到您的确认。 它还在状态文件中跟踪您的真实基础设施,该文件充当您环境的真实来源。 Terraform 使用状态文件来确定要对您的基础设施进行的更改,以便它与您的配置相匹配。
自动化变更
Terraform 配置文件是声明性的,这意味着它们描述了基础设施的最终状态。 您无需编写分步说明来创建资源,因为 Terraform 会处理底层逻辑。 Terraform 构建资源图以确定资源依赖关系,并且以并行的方式创建或修改非依赖资源。 这允许 Terraform 有效地提供资源。
标准化配置
Terraform 支持模块化,可以重复使用,从而节省时间并鼓励最佳实践。 您可以使用 Terraform Registry 中公开可用的模块,也可以编写您自己的模块。
Terraform 安装
测试环境 Ubuntu 20.04.4 LTS Terraform 1.3.9
# Install
# sudo wget https://releases.hashicorp.com/terraform/1.3.9/terraform_1.3.9_linux_amd64.zip
# sudo mv terraform /usr/local/bin/terraform
# Verify
# terraform -version
Terraform v1.3.9
on linux_amd64
举个栗子
使用nginx 镜像启动一个名为hello-world的容器并对外暴露8080端口
初始化 & 进入目录
# mkdir hello-world && cd hello-world
创建 `main.tf`
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 2.13.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "hello-world"
ports {
internal = 80
external = 8000
}
}
初始化项目,它会下载 provider 的插件,让 Terraform 与 Docker 交互。
# terraform init
查看变更
# sudo terraform plan
执行 apply 配置 NGINX 服务器容器。 当 Terraform 要求您确认输入 yes 并按 ENTER 键时。
# sudo terraform apply
验证服务

# sudo docker ps | grep hello
43fb6c9ed304 7425d3a7c478 "/docker-entrypoint.…" 15 seconds ago Up 12 seconds 0.0.0.0:8000->80/tcp hello-world
运行 terraform destroy 停止容器
# sudo terraform destroy