INTEGRITY Dokumentace

Začínáme

V tomto průvodci nasadíte Worker, který dokáže na základě požadavků koncových uživatelů posílat požadavky do jednoho nebo více Containers. V tomto příkladu každý kontejner spouští malý webový server napsaný v Go.

Tento příklad Workeru vám má přiblížit jednoduché použití Containers a zároveň sloužit jako výchozí bod pro složitější případy použití.

Předpoklady

Ujistěte se, že Docker běží lokálně

V tomto průvodci sestavíme a nahrajeme obraz kontejneru společně s kódem vašeho Workeru. Ve výchozím nastavení tento proces používá Docker ↗ to udělat.

Docker musí lokálně běžet, když spouštíte wrangler deploy. Pro většinu lidí je nejlepším způsobem instalace Dockeru postupovat podle dokumentace k instalaci Docker Desktop ↗. Další nástroje, například Colima ↗ může také fungovat.

Že Docker běží správně, můžete ověřit spuštěním docker info příkaz v terminálu. Pokud Docker běží, příkaz proběhne úspěšně. Pokud Docker neběží, příkaz docker info se zasekne, nebo vrátí chybu obsahující zprávu „Cannot connect to the Docker daemon“.

Nasazení prvního Containeru

Pomocí následujícího příkazu vytvořte a nasaďte nový Worker s kontejnerem ze startovací šablony:

npm create cloudflare@latest -- --template=cloudflare/templates/containers-template

Pokud chcete nasadit změnu kódu Workeru nebo Containeru, můžete spustit následující příkaz pomocí Wrangler CLI:

npx wrangler deploy

Při nasazení Wrangler nahraje váš Worker, sestaví a odešle image kontejneru pomocí Dockeru a aktualizuje instance kontejnerů v síti Cloudflare. První sestavení a odeslání obvykle trvá nejdéle. Pozdější nasazení znovu použít vrstvy image z mezipaměti ↗.

Zkontrolujte stav nasazení

Po nasazení si zobrazte seznam kontejnerů ve svém účtu a jejich stav:

npx wrangler containers list

Zobrazte seznam obrazů v Cloudflare Registry:

npx wrangler containers images list

Odesílání požadavků do Containers

Otevřete adresu URL svého Workeru. Měla by vypadat takto https://hello-containers.<YOUR_WORKERS_SUBDOMAIN>.workers.dev.

Přečtěte tělo odpovědi a ověřte, která instance požadavek zpracovala. Pokud Worker odpoví, ale trasy kontejneru stále vracejí chybu, počkejte na dokončení provisioningu a poté zkontrolujte Containers ↗ protokoly na dashboardu.

Vysvětlení kódu

Nyní, když jste nasadili svůj první kontejner, si vysvětlíme, co se děje v kódu vašeho Workeru, v konfiguračním souboru, v kódu vašeho kontejneru a jak se směrují požadavky.

Konfigurace

Váš Konfigurační soubor Wrangler definuje konfiguraci pro váš Worker i váš kontejner:

{
	"containers": [
		{
			"max_instances": 10,
			"class_name": "MyContainer",
			"image": "./Dockerfile",
		},
	],
	"durable_objects": {
		"bindings": [
			{
				"name": "MY_CONTAINER",
				"class_name": "MyContainer",
			},
		],
	},
	"migrations": [
		{
			"tag": "v1",
			"new_sqlite_classes": ["MyContainer"],
		},
	],
}
[[containers]]
max_instances = 10
class_name = "MyContainer"
image = "./Dockerfile"

[[durable_objects.bindings]]
name = "MY_CONTAINER"
class_name = "MyContainer"

[[migrations]]
tag = "v1"
new_sqlite_classes = [ "MyContainer" ]

Důležité body k této konfiguraci:

Obraz kontejneru

Image vašeho kontejneru musí být schopný běžet na linux/amd64 architektuře, ale kromě toho má jen málo omezení.

V příkladu, který jste právě nasadili, jde o jednoduchý server v Go, který odpovídá na požadavky na portu 8080 pomocí MESSAGE proměnná prostředí, která bude nastavena ve Workeru, a automaticky generovaná proměnná prostředí CLOUDFLARE_DEPLOYMENT_ID.

func handler(w http.ResponseWriter, r *http.Request) {
	message := os.Getenv("MESSAGE")
	instanceId := os.Getenv("CLOUDFLARE_DEPLOYMENT_ID")

	fmt.Fprintf(w, "Hi, I'm a container and this is my message: %s, and my instance ID is: %s", message, instanceId)
}

Kód Workeru

Konfigurace Containeru

Nejprve si všimněte MyContainer který rozšiřuje Container ↗ třída:

export class MyContainer extends Container {
  defaultPort = 8080;
  sleepAfter = '10s';
  envVars = {
    MESSAGE: 'I was passed in via the container class!',
  };

  override onStart() {
    console.log('Container successfully started');
  }

  override onStop() {
    console.log('Container successfully shut down');
  }

  override onError(error: unknown) {
    console.log('Container error:', error);
  }
}

Tím se definuje základní konfigurace kontejneru:

Container třída sama rozšiřuje DurableObject, takže vaše podtřída má přístup k celému API Durable Object. Durable Object se stará o směrování, životní cyklus a trvalý stav, zatímco proces kontejneru spouští váš obraz uvnitř linuxového virtuálního stroje. To znamená, že můžete použít this.ctx.storage k trvalému uložení dat, která přežijí restart kontejneru a jsou uložena v jeho bezprostřední blízkosti.

Viz Reference třídy Container a nízkoúrovňové kontejnerové API Durable Object pro další podrobnosti.

Směrování do kontejnerů

Když požadavek vstoupí do Cloudflare, kód vašeho Workeru fetch handler se zavolá. Toto je kód, který zpracovává příchozí požadavek. Fetch handler v ukázkovém kódu spouští kontejnery dvěma způsoby na různých trasách:

To umožňuje více způsobů použití Containers:

Zobrazení Containers ve vašem dashboardu

Containers Dashboard ↗ zobrazuje užitečné informace o vašich kontejnerech, například:

Po spuštění Workeru přejděte na Containers Dashboard výběrem Workers & Pages > Containers v postranním panelu dashboardu.

Další kroky

Chcete-li udělat více: