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

相关文章

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换