← Containers / containers
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-templatePokud chcete nasadit změnu kódu Workeru nebo Containeru, můžete spustit následující příkaz pomocí Wrangler CLI:
npx wrangler deployPř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 listZobrazte seznam obrazů v Cloudflare Registry:
npx wrangler containers images listOdesí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.
- Požadavky na
/container/1nebo/container/2směrují na konkrétní kontejnery. Každá cesta za/container/odpovídá jedinečnému kontejneru. - Požadavky na
/lbrozkládá zátěž mezi tři náhodně vybrané kontejnery.
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:
imageukazuje na Dockerfile, na adresář obsahující Dockerfile, nebo na plně kvalifikovaný odkaz na image, napříkladregistry.cloudflare.com/<YOUR_ACCOUNT_ID>/<IMAGE>:<TAG>.class_namemusí být Název třídy Durable Object.max_instancesdeklaruje maximální počet současně běžících instancí kontejneru.- Durable Object musí používat
new_sqlite_classesnenew_classes.
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:
defaultPortnastavuje port, kterýfetchacontainerFetchmetody použijí ke komunikaci s kontejnerem. Také blokuje požadavky, dokud kontejner na tomto portu nezačne naslouchat.sleepAfternastavuje časový limit, po jehož uplynutí kontejner po určité době nečinnosti přejde do režimu spánku.envVarsnastavuje proměnné prostředí, které se při spuštění předají kontejneru.onStart,onStop, aonErrorjsou hooky, které se spustí při spuštění, zastavení nebo chybě 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:
-
Odesílání požadavků do
/container/předává požadavky na nový kontejner pro každou cestu. Docílí se toho spuštěním nové instance Container. Všimněte si, že první požadavek na novou cestu trvá déle než další požadavky, protože se právě spouští nový kontejner.if (pathname.startsWith("/container")) { const container = env.MY_CONTAINER.getByName(pathname); return await container.fetch(request); } -
Odesílání požadavků do
/lbbude rozkládat zátěž požadavků mezi několik kontejnerů. Používá k tomu jednoduchýgetRandompomocná metoda, která náhodně vybere ID z daného počtu (v tomto případě 3) a poté přesměruje na danou instanci Container. Tuto logiku směrování nebo vyvažování zátěže můžete nahradit libovolnou vlastní implementací:if (pathname.startsWith("/lb")) { const container = await getRandom(env.MY_CONTAINER, 3); return await container.fetch(request); }
To umožňuje více způsobů použití Containers:
- Pokud chcete jednoduše odesílat požadavky mnoha bezstavovým a zaměnitelným kontejnerům, měli byste použít load balancing.
- Pokud máte stavové služby nebo potřebujete jednotlivě adresovatelné kontejnery, měli byste požadovat konkrétní instance Container.
- Pokud spouštíte krátkodobé úlohy, potřebujete jemnou kontrolu nad životním cyklem kontejneru, chcete parametrizovat vstupní bod kontejneru nebo proměnné prostředí, případně chcete řetězit více volání kontejnerů, měli byste požadovat konkrétní instance Container.
Zobrazení Containers ve vašem dashboardu
Containers Dashboard ↗ zobrazuje užitečné informace o vašich kontejnerech, například:
- Stav a zdravotní stav
- Metriky
- Protokoly
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:
- Upravte image změnou souboru Dockerfile a spuštěním
wrangler deploy - Viz Nasaďte Containers pro Workers Builds a chování při rolloutu
- Procházet příklady pro další vzory
- Zkontrolujte Často kladené dotazy pro chování platformy a omezení