IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源

本文主要是介绍IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

 一、实验

1.环境

2.Terraform查看版本

3.Linux主机安装Docker

4.Terraform使用本地编译(In-house)的Providers

5.Docker-CE 开启远程API

6. Linux主机拉取镜像

7.Terraform 使用 dynamic动态内联块 创建资源

二、问题

 1.Terraform 计划资源失败 (无效provider)

2.Terraform 申请资源失败 (端口占用)


 一、实验

1.环境

(1)主机

表1-1 主机

主机系统软件备注
pipepointLinuxTerraform 1.6.6

2.Terraform查看版本

(1)查看Terraform版本

terraform -v

3.Linux主机安装Docker

(1)安装Docker

① 阿里云镜像加速将XXXXXXXX改为自己的即可( "https://XXXXXXXX.mirror.aliyuncs.com",)

1)安装
yum -y install wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce2)配置cgroup驱动及镜像下载加速器:
cat > /etc/docker/daemon.json << EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}
EOF3)自启动
systemctl enable docker && systemctl start docker && systemctl status docker && docker info|grep systemd

② 安装docker

③ 配置镜像加速

④ 开机自启动服务

(2)查看版本

docker -v

4.Terraform使用本地编译(In-house)的Providers

(1)编写配置文件

vim .terraformrcprovider_installation {filesystem_mirror {path    = "/usr/share/terraform/providers"include = ["registry.terraform.io/*/*"]}
}

(2)Terraform模板(docker)

Terraform Registry

USE PROVIDER

terraform {required_providers {docker = {source = "kreuzwerker/docker"version = "3.0.2"}}
}provider "docker" {# Configuration options
}

Example Usage

terraform {required_providers {docker = {source  = "kreuzwerker/docker"version = "3.0.2"}}
}provider "docker" {host = "unix:///var/run/docker.sock"
}# Pulls the image
resource "docker_image" "ubuntu" {name = "ubuntu:latest"
}# Create a container
resource "docker_container" "foo" {image = docker_image.ubuntu.image_idname  = "foo"
}

(3) 下载软件包

https://github.com/kreuzwerker/terraform-provider-docker/releases

(4) 创建目录

mkdir -p  /usr/share/terraform/providers/registry.terraform.io/kreuzwerker/docker/3.0.2/linux_amd64

(5)解压软件包

unzip terraform-provider-docker_3.0.2_linux_amd64.zip

(6)tree递归查看目录 (将软件包按递归目录放置)

tree -s /usr/share/terraform/

5.Docker-CE 开启远程API

(1)修改配置文件

vim /usr/lib/systemd/system/docker.service
……
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock  -H fd://
……

(2)重新加载配置及重启服务

systemctl daemon-reload  && systemctl restart docker

(3)测试API

curl http://127.0.0.1:2375/version

6. Linux主机拉取镜像

(1)dockerhub 查看镜像

https://hub.docker.com/r/jenkins/jenkins

docker pull jenkins/jenkins

(2)拉取镜像

docker pull jenkins/jenkins

(3)查看镜像

docker images

7.Terraform 使用 dynamic动态内联块 创建资源

(1)查看目录

tree -s ~/tf-meta/dynamic/

(2)主配置文件

main.tf,  Docker Provider用于与 Docker 容器和镜像进行交互,它使用 Docker API 来管理 Docker 容器的生命周期。

vim main.tfprovider "docker" {host = "tcp://127.0.0.1:2375"
}resource "docker_image" "jenkins" {name         = "jenkins/jenkins:latest"keep_locally = true //销毁时不删除本地镜像
}locals {jenkins_ports = [ {   internal = 8085external = 8085},  {   internal = 50000external = 50000}   ]
}resource "docker_container" "jenkins" {image = docker_image.jenkins.namename  = "jenkins123"user  = "root"dynamic "ports" {for_each = local.jenkins_portscontent {internal = ports.value.internalexternal = ports.value.externalip       = "0.0.0.0"protocol = "tcp"}   }volumes {container_path = "/var/jenkins_home"host_path      = "/tmp/jenkinshome"}depends_on = [ docker_image.jenkins]
}

(3)版本配置文件

versions.tf

vim versions.tfterraform {required_providers {docker = { source  = "kreuzwerker/docker"version = "3.0.2"}   }
}

(4) 格式化代码

terraform fmt

(5) 初始化

terraform init

(6) 验证

terraform validate

(7)计划与预览

 terraform plan

(8) 申请资源

terraform apply

yes

(9)展示资源

terraform show

(11)查看docker进程

docker ps

(12) 检查容器

 docker inspect 924c951bff60

(13)查看容器日志

docker logs -f jenkins123

(14) 查看监听端口

http://192.168.204.233:50000/

(15) 销毁资源

terraform destroy

yes

(16) 查看docker进程

docker ps

资源已删除

二、问题

 1.Terraform 计划资源失败 (无效provider)

(1)报错

Planning failed. Terraform encountered an error while generating this plan.?
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│ 
│   with provider["registry.terraform.io/kreuzwerker/docker"],
│   on main.tf line 1, in provider "docker":
│    1: provider "docker" {

Planning failed. Terraform encountered an error while generating this plan.╷
│ Error: Invalid provider configuration
│ 
│ Provider "registry.terraform.io/kreuzwerker/docker" requires explicit configuration. Add a provider block to the root module and configure the provider's
│ required arguments as described in the provider documentation.
│ 
╵
╷
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│ 
│   with provider["registry.terraform.io/kreuzwerker/docker"],
│   on <empty> line 0:
│   (source code not available)

(2)原因分析

未配置docker的provider

(3)解决方法

配置docker的provider

成功

2.Terraform 申请资源失败 (端口占用)

(1)报错

申请容器为8080端口


│ Error: Unable to start container: Error response from daemon: driver failed programming external connectivity on endpoint jenkins123 (7b6aea49d069b5eb7693528fd8754026960ea22381ec2ccc2927a0029709d552): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use
│ 
│   with docker_container.jenkins,
│   on main.tf line 23, in resource "docker_container" "jenkins":
│   23: resource "docker_container" "jenkins" {

申请容器为8081端口

Error: Unable to start container: Error response from daemon: driver failed programming external connectivity on endpoint jenkins123 (31e491b5ce1eeaf0e4a87864d694073f67c470f4f1b7fd41f6ec5e5a48353934): Error starting userland proxy: listen tcp4 0.0.0.0:8081: bind: address already in use
│ 
│   with docker_container.jenkins,
│   on main.tf line 23, in resource "docker_container" "jenkins":
│   23: resource "docker_container" "jenkins" {

(2)原因分析

端口被占用。

(3)解决方法

查看当前占用端口命令。

netstat -tanlp

方法一:杀死进程(注意不是杀死端口,而是pid的端口)

8080 端口的进程为64353

8081端口的进程为63265

kill 64353进程 (自己的pid端口)kill 63265进程 (自己的pid端口)

方法二:(这里采用此方法)

更改Terraform配置文件端口为8085。

成功

这篇关于IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623047

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本