Så här konfigurerar du alternativ för att skapa containrar för IoT Edge-moduler
Gäller för: IoT Edge 1.5 IoT Edge 1.4
Viktigt!
IoT Edge 1.5 LTS och IoT Edge 1.4 LTS stöds. IoT Edge 1.4 LTS upphör den 12 november 2024. Om du har en tidigare version läser du Uppdatera IoT Edge.
Med parametern createOptions i distributionsmanifestet kan du konfigurera modulcontainrarna vid körning. Den här parametern utökar kontrollen över modulerna och möjliggör uppgifter som att tillåta eller begränsa modulens åtkomst till värdenhetens resurser eller konfigurera nätverk.
IoT Edge-moduler implementeras som Docker-kompatibla containrar på din IoT Edge-enhet. Docker erbjuder många alternativ för att skapa containrar, och dessa alternativ gäller även för IoT Edge-moduler. Mer information finns i Skapa alternativ för Docker-container.
Alternativ för att skapa format
IoT Edge-distributionsmanifestet accepterar alternativ för att skapa formaterade som JSON. Ta till exempel de skapa-alternativ som automatiskt ingår för varje edgeHub-modul:
"createOptions": {
"HostConfig": {
"PortBindings": {
"5671/tcp": [
{
"HostPort": "5671"
}
],
"8883/tcp": [
{
"HostPort": "8883"
}
],
"443/tcp": [
{
"HostPort": "443"
}
]
}
}
}
Det här edgeHub-exemplet använder parametern HostConfig.PortBindings för att mappa exponerade portar på containern till en port på värdenheten.
Om du använder Azure IoT Edge-tillägget för Visual Studio eller Visual Studio Code kan du skriva skapa-alternativen i JSON-format i deployment.template.json-filen . När du sedan använder tillägget för att skapa IoT Edge-lösningen eller generera distributionsmanifestet, kommer det att strängbegränsa JSON åt dig i det format som IoT Edge-körningen förväntar sig. Till exempel:
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
Viktigt!
Azure IoT Edge Visual Studio Code-tillägget är i underhållsläge. Verktyget iotedgedev är det rekommenderade verktyget för att utveckla IoT Edge-moduler.
Ett tips för att skriva skapa alternativ är att använda docker inspect
kommandot . Som en del av utvecklingsprocessen kör du modulen lokalt med hjälp av docker run <container name>
. När du har fått modulen att fungera som du vill ha den kör docker inspect <container name>
du . Det här kommandot matar ut modulinformationen i JSON-format. Leta upp de parametrar som du har konfigurerat och kopiera JSON. Till exempel:
Vanliga scenarier
Alternativ för att skapa containrar möjliggör många scenarier, men här är några som kommer upp oftast när du skapar IoT Edge-lösningar:
- Ge moduler åtkomst till värdlagring
- Mappa värdporten till modulporten
- Begränsa modulminne och CPU-användning
- GPU-optimera en IoT Edge-modul
Mappa värdporten till modulporten
Om modulen behöver kommunicera med en tjänst utanför IoT Edge-lösningen och inte använder meddelandedirigering för att göra det, måste du mappa en värdport till en modulport.
Dricks
Den här portmappningen krävs inte för modul-till-modul-kommunikation på samma enhet. Om modul A behöver fråga ett API som finns i modul B kan det göra det utan någon portmappning. Modul B måste exponera en port i dess dockerfile, till exempel: EXPOSE 8080
. Sedan kan modul A fråga API:et med hjälp av modul B:s namn, till exempel: http://ModuleB:8080/api
.
Kontrollera först att en port i modulen exponeras för att lyssna efter anslutningar. Du kan göra detta med hjälp av en EXPOSE-instruktion i dockerfile. Exempel: EXPOSE 8080
Instruktionen exponerar som standard TCP-protokollet om det inte anges, eller så kan du ange UDP.
Använd sedan inställningen PortBindings i gruppen HostConfig i Docker-containern för att skapa alternativ för att mappa den exponerade porten i modulen till en port på värdenheten. Om du till exempel exponerade port 8080 i modulen och vill mappa den till port 80 på värdenheten, skulle skapandealternativen i template.json-filen se ut som i följande exempel:
"createOptions": {
"HostConfig": {
"PortBindings": {
"8080/tcp": [
{
"HostPort": "80"
}
]
}
}
}
När du har stringifierats för distributionsmanifestet skulle samma konfiguration se ut som i följande exempel:
"createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"80\"}]}}}"
Begränsa modulminne och CPU-användning
Du kan deklarera hur mycket av värdresurserna som en modul kan använda. Den här kontrollen är användbar för att säkerställa att en modul inte kan förbruka för mycket minne eller CPU-användning och förhindrar att andra processer körs på enheten. Du kan hantera de här inställningarna med alternativ för att skapa Docker-container i gruppen HostConfig , inklusive:
- Minne: Minnesgräns i byte. Till exempel 268435456 byte = 256 MB.
- MemorySwap: Total minnesgräns (minne + växling). Till exempel 536870912 byte = 512 MB.
- NanoCpus: CPU-kvot i enheter på 10–9 (1 miljarddels) processorer. Till exempel 2500000000 nanocpus = 0,25 CPU.
I template.json format skulle dessa värden se ut som i följande exempel:
"createOptions": {
"HostConfig": {
"Memory": 268435456,
"MemorySwap": 536870912,
"NanoCpus": 250000000
}
}
När de har stringifierats för det slutliga distributionsmanifestet ser dessa värden ut som i följande exempel:
"createOptions":"{\"HostConfig\":{\"Memory\":268435456,\"MemorySwap\":536870912,\"CpuPeriod\":25000}}"
GPU-optimera en IoT Edge-modul
Om du kör IoT Edge-modulen på en GPU-optimerad virtuell dator kan du även aktivera en IoT Edge-modul för att ansluta till din GPU. Om du vill göra detta med en befintlig modul lägger du till några specifikationer i :createOptions
{"HostConfig": {"DeviceRequests": [{"Count": -1,"Capabilities": [["gpu"]]}]}}
Om du vill bekräfta att de här inställningarna har lagts till använder du kommandot Docker inspect för att se den nya inställningen i en JSON-utskrift.
sudo docker inspect <YOUR-MODULE-NAME>
Mer information om hur din enhet och virtuella dator ansluter till en GPU finns i Konfigurera, ansluta och verifiera en IoT Edge-modul för en GPU.
Nästa steg
Fler exempel på hur du skapar alternativ i praktiken finns i följande IoT Edge-exempel: