소개
TIDE는 하루 동안 두 예술가의 스튜디오를 방문자에게 공개합니다. 웹사이트에는 일정, 길 안내, 다운로드 가능한 안내서가 있습니다. City 운영 사이트와 Riverside 참조 미리보기는 정상입니다. Courtyard 미리보기 컨테이너가 사라졌습니다. 이웃 사이트나 공유 네트워크를 교체하지 않고 해당 장소를 복구하세요.
기본 터미널 사용법과 Docker 이미지, 컨테이너, 게시 포트 사용 경험이 필요합니다. Terraform은 여기서 배웁니다. HCL 설정, provider, 리소스, 데이터 소스, 계획, 상태를 다룹니다. 도구와 완전한 웹사이트 이미지는 제공됩니다. 하나의 학습 인스턴스에서 로컬 Docker를 관리하며 클라우드 계정이나 애플리케이션 코딩은 필요하지 않습니다.
Live Studios, Reference Preview, Venue Preview, Workstation을 사용합니다. Venue Preview는 복구 전까지 사용할 수 없습니다. 이 환경은 독립적으로 시작합니다. Terraform 1.14.3과 커뮤니티 kreuzwerker/docker provider 3.0.2로 고정했습니다. 로컬 provider 미러 덕분에 학습 중 초기화는 공개 레지스트리에 의존하지 않습니다.
미리보기와 소유 경계 선언하기
이 단계에서는 정상 방문자 여정을 사용한 다음 누락된 장소 컨테이너만 선언합니다. Live Studios에서 시작하세요. 홈에는 LIVE PROGRAMME / City가 표시됩니다. Meet the two studios를 선택하고 Form & Field와 Small Editions 세션을 읽은 뒤 Find directions and the programme을 선택하세요. Download the day programme으로 받은 텍스트를 열면 City와 두 스튜디오의 일정이 있어야 합니다. **Do I need to book?**을 펼치면 무료입장과 예약 불필요 안내를 볼 수 있습니다.
Reference Preview로 전환하세요. 같은 여정에서 REFERENCE PREVIEW / Riverside가 표시됩니다. 이 컨테이너는 현재 Terraform 설정에 속하고 여전히 필요하므로 보존하세요. Venue Preview는 컨테이너가 없어서 연결되지 않습니다. 서버가 없는 경우는 HTTP 404와 다릅니다. 404는 실행 중인 서버가 특정 페이지를 찾지 못한 응답입니다.
루트와 상태 읽기
Workstation으로 전환하세요. Terraform 루트는 그 안의 .tf 파일을 함께 평가하는 디렉터리입니다. 다른 디렉터리에서 Terraform을 실행하면 다른 루트를 선택하며 이웃 디렉터리를 자동 검색하지 않습니다. pwd는 현재 경로를 출력합니다.
pwd
/home/labex/project/preview/courtyard
ls는 파일을 나열하고 cat은 텍스트 파일을 표시합니다. 준비된 설정을 읽으세요.
ls
cat main.tf
.tf 파일은 설정 언어 HCL을 사용합니다. 블록은 중괄호로 설정을 묶고 name = value는 값을 할당합니다. 따옴표 안의 텍스트는 문자열이고 포트는 따옴표 없는 숫자입니다. terraform 블록은 본체 프로그램과 필요한 provider를 고정합니다. provider는 Terraform 작업을 Docker API 요청으로 바꾸는 플러그인입니다. provider "docker" {}는 이 인스턴스의 Docker daemon을 사용하며 퍼블릭 클라우드에 연결하지 않습니다.
두 data "docker_network" 블록은 기존 네트워크를 읽습니다. 데이터 소스는 객체를 조회하지만 생성이나 삭제의 소유권을 가져오지 않습니다. city와 venue는 참조에 쓰는 로컬 레이블입니다. 네트워크 이름은 실제 Docker 객체를 식별합니다. 이미지 데이터 소스도 준비된 이미지 ID를 읽습니다. 실제 ID를 사용하면 태그와 해석된 ID를 계속 다른 이미지로 간주하는 문제를 피합니다.
cat reference.tf
리소스는 이 루트가 관리하는 객체를 선언합니다. docker_container.reference는 리소스 유형과 로컬 레이블을 합친 Terraform 주소입니다. Docker 이름은 tide-reference입니다. 참조 컨테이너는 내부 포트 80으로 서비스하고 이를 인스턴스의 8083에 게시합니다. 표현식 data.docker_image.reference.id는 이미지 데이터 소스의 id 속성을 읽습니다. 표현식이므로 따옴표를 붙이지 않습니다.
main.tf와 reference.tf는 바꾸지 마세요. 두 네트워크, 모든 이미지 레코드, 운영 컨테이너는 이 루트의 관리 소유 범위 밖입니다. 루트는 참조와 사라진 미리보기의 두 컨테이너를 관리합니다.
상태는 Terraform 주소를 실제 객체 ID에 연결합니다. 준비된 terraform.tfstate는 사라진 것을 포함해 두 컨테이너를 기억합니다. 상태는 설정도 웹사이트 백업도 아닙니다. 편집하거나 삭제하지 마세요. 이후 계획은 기억된 ID만 믿지 않고 Docker에 실제 존재하는 객체를 묻습니다.
누락된 리소스 선언 작성하기
preview.tf를 만드세요. Terraform은 같은 루트의 다른 .tf 파일과 함께 처리하며 파일 이름이 별도 환경을 만들지는 않습니다. cat > preview.tf는 이 파일만 교체합니다. 따옴표로 감싼 HCL은 here-document의 시작입니다. 마지막 줄에 홀로 있는 HCL까지 전체 블록을 붙여 넣으세요. 따옴표는 내용을 그대로 보존합니다.
cat > preview.tf <<'HCL'
resource "docker_container" "preview" {
name = "tide-preview"
image = data.docker_image.site.id
ports {
internal = 80
external = 8082
}
networks_advanced {
name = data.docker_network.venue.name
}
}
HCL
완전한 Courtyard 이미지로 하나의 컨테이너를 선언합니다. 중첩된 ports 블록은 HTTP를 게시하고 networks_advanced는 기존 장소 네트워크에 연결합니다. 운영 서비스는 8081, 참조는 8083을 사용하므로 8082는 충돌을 피합니다. 네트워크 참조가 그 네트워크를 관리 리소스로 바꾸지는 않습니다.
루트를 초기화하세요. init은 provider 플러그인을 준비하고 인프라를 생성하지 않습니다.
terraform init
Terraform has been successfully initialized!가 표시되어야 합니다. 로컬 미러가 3.0.2를 제공합니다. .terraform은 초기화한 provider를 보관하고 .terraform.lock.hcl은 선택한 provider와 체크섬을 기록합니다. 잠금 파일은 설정과 함께 보존하세요. terraform state list는 기억된 주소를 출력합니다.
terraform state list
출력에는 docker_container.preview, docker_container.reference, 이미지 및 네트워크 데이터 소스가 포함됩니다. 미리보기 주소가 목록에 있다고 실제 컨테이너가 존재하는 것은 아닙니다.
fmt는 HCL 공백 형식을 정리하고 validate는 설정 문법과 provider 인수 유형을 확인합니다. 어느 것도 사이트 실행을 증명하지 않습니다.
terraform fmt
terraform validate
Success! The configuration is valid.가 표시되어야 합니다. 문법 오류라면 파일 이름과 줄을 읽고 preview.tf를 위의 전체 블록과 비교해 수정한 다음 fmt와 validate를 다시 실행하세요. 오류를 없애려고 상태를 삭제하거나 공유 설정을 다시 쓰지 마세요. 이제 참조를 유지하면서 대상을 재생성할 수 있는 선언이 준비됐습니다.
정밀 복구 계획 검토하고 적용하기
이 단계에서는 기억된 상태와 실제 인프라를 구별하고 Courtyard의 전체 여정을 복구하며 다른 객체가 바뀌지 않았는지 확인합니다. 같은 루트의 Workstation에서 시작하세요.
변경 전에 계획 보기
terraform plan은 Docker를 읽어 정보를 갱신하고 실제 상태와 선언을 비교해 변경을 제안합니다. -out=recovery.tfplan은 제안을 바이너리 계획 파일에 저장해 apply가 검토된 계획을 실행하게 합니다. 저장된 계획에는 민감한 설정이 들어갈 수 있지만 이 실습에는 자격 증명이 없습니다. 프로젝트 디렉터리에 두세요.
terraform plan -out=recovery.tfplan
기억된 미리보기 ID를 새로 읽은 다음 아래 내용을 찾으세요.
## docker_container.preview will be created
...
Plan: 1 to add, 0 to change, 0 to destroy.
+는 생성입니다. ~는 제자리 갱신, -는 파괴, -/+는 교체를 뜻합니다. 누락된 미리보기에는 한 번의 생성만 필요합니다. 참조에는 변경 제안이 없어야 합니다. 어떤 네트워크도 생성, 교체, 파괴되면 안 됩니다. 이미 존재하는 공유 데이터 소스이며 이 루트가 소유한 리소스가 아니기 때문입니다.
파괴, 교체, 다른 리소스가 보이면 적용 전에 멈추세요. pwd, preview.tf, reference.tf의 우발적 편집을 확인하세요. 제공된 예제로 자신이 잘못 편집한 부분만 되돌리고 새 계획을 만드세요. 네트워크 이름이 틀리면 network not found가 나올 수 있습니다. 대체 공유 네트워크를 만들지 말고 기존 data 블록과 비교하세요. 이름 접두사로 컨테이너를 삭제하거나 복구 지름길로 terraform destroy를 실행하지 마세요.
검토된 계획 실행하기
terraform apply recovery.tfplan은 저장한 변경을 실행합니다. 계획 파일 이름 없이 실행하는 apply와 달리 yes를 다시 묻지 않습니다. 계획 저장 자체가 실행 승인은 아니므로 이 명령 전에 검토하세요.
terraform apply recovery.tfplan
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
계획이 오래됐다는 메시지는 계획 이후 다른 작업이 상태를 바꿨다는 뜻입니다. 새 계획을 생성하고 검토한 뒤 적용하세요. 포트 8082가 사용 중이라면 모든 컨테이너를 삭제하지 말고 정확히 어떤 컨테이너와 충돌하는지 살펴보세요. 준비된 환경에서는 비어 있어야 합니다. 외부 포트를 다시 확인하고 8081과 8083은 보존하세요.
Venue Preview로 전환하고 컨테이너 시작 후 새로고침하세요. VENUE PREVIEW / Courtyard가 표시되어야 합니다. Meet the two studios → Find directions and the programme → Download the day programme으로 진행하세요. 다운로드를 열어 Courtyard와 두 시연 시간을 확인하세요. 완전한 페이지, 스타일, 삽화, 다운로드는 새 빈 Nginx 환영 페이지가 아니라 제공된 이미지에서 나옵니다.
Live Studios와 Reference Preview로 전환하세요. 원래 여정은 각각 City와 Riverside로 계속 동작해야 합니다. 홈의 이름만 다르다고 보존을 증명할 수 없습니다. 기반 객체도 원래 객체여야 합니다.
수렴과 보존 확인하기
Workstation으로 돌아오세요. 두 번째 계획은 현재 선언과 실제 Docker를 새로 관찰합니다.
terraform plan
No changes. Your infrastructure matches the configuration.
이것이 수렴입니다. 원하는 리소스가 선언된 설정으로 존재합니다. Terraform이 컨테이너를 계속 감시하고 복구하는 것은 아닙니다. 나중에 바뀌면 사람이나 자동화가 워크플로를 다시 실행해야 합니다. 여기서 복구하는 것은 교체 가능한 인프라와 제공된 사이트 내용이며, 손실된 사용자 데이터나 호스트 전체가 아닙니다.
terraform state show는 한 리소스의 기억된 속성을 표시합니다. id를 실제 Docker ID와 비교하세요. Docker의 --format 옵션은 필드를 선택하고 작은따옴표는 템플릿을 그대로 유지합니다.
terraform state show docker_container.preview
docker inspect --format '{{.Id}}' tide-preview
둘 다 같은 새 컨테이너를 가리켜야 합니다. ID는 달라질 수 있으므로 예제 ID를 상태에 복사하지 마세요. 원래 이웃과 두 기존 네트워크를 변경하지 않고 읽으세요.
docker inspect --format '{{.Name}} {{.Id}} {{.State.StartedAt}}' tide-live tide-reference
docker network inspect --format '{{.Name}} {{.Id}}' tide-city tide-courtyard
이 과정은 이러한 식별 정보를 원래 값과 비교합니다. 운영 컨테이너는 이 루트 밖이고 참조는 루트 안에서 의도적으로 보존한 관리 리소스입니다. 두 경계 모두 중요합니다. 누락된 미리보기를 복구하면서 다른 사이트와 공유 인프라를 보존했습니다.
요약
HCL과 고정된 Docker provider로 누락된 장소 컨테이너를 선언했습니다. 데이터 소스는 공유 네트워크와 이미지를 루트의 관리 소유 범위 밖에 두었습니다. 설정, 상태, 실제 Docker 객체를 비교하고 검토한 생성 하나를 적용했으며 전체 방문자 여정을 확인하고 운영 및 참조 사이트를 보존하면서 변경 없는 계획을 얻었습니다.



