Sådan opretter du effektive Python Docker-billeder

Sådan opretter du effektive Python Docker-billeder
Læsere som dig hjælper med at støtte MUO. Når du foretager et køb ved hjælp af links på vores websted, kan vi optjene en affiliate-kommission. Læs mere.

Docker er industristandardsoftwaren til emballering og implementering af applikationer i containere. Docker-billeder er hjørnestenen, hvorpå du kan bygge og køre dine applikationer.





For at låse Dockers fulde potentiale op, skal du optimere dine billeder til ressourceeffektivitet, sikkerhed og ydeevne. Dette sikrer, at dine applikationer fungerer problemfrit i Docker-økosystemet.





Lær, hvordan du gør dette med et eksempel fra den virkelige verden, der viser, hvordan du containeriserer en Python-beregnerapp.





Starter med et minimalt basisbillede

En af de faktorer, der påvirker et Docker-billedes effektivitet, er valget af basisbilledet. Du bør starte med et minimalt billede, der kun indeholder de væsentlige komponenter, der kræves for at køre din applikation.

Billedet, du bruger, bør også være fra en velrenommeret kilde, der leverer sikkerhedsopdateringer og patches. Det skal have et aktivt fællesskab og god dokumentation. Dette er nyttigt, når du skal fejlfinde problemer eller søge hjælp.



Til lommeregnerapplikationen skal du vælge python:3.11-slank-bogorm , som er et minimalt billede, reducerer billedstørrelsen. Dette minimerer til gengæld ressourceforbruget og fremskynder billeddownloads og implementeringer.

# Starting With a Minimal Base Image 
FROM python:3.11-slim-bookworm AS builder

Du kan brug et endnu mindre Alpine Linux-billede , ved at vælge python:3.11-alpine. Dette billede inkluderer dog ikke en Python-fortolker, en pakkehåndtering og almindelige Python-biblioteker.





Kørsel af applikationer som ikke-rootbrugere

At køre Docker-containere som root-bruger kan udgøre betydelige sikkerhedsrisici. Hvis en ondsindet aktør får adgang til en container, der kører som root, kan de udnytte sårbarheder i containerens software til at eskalere deres privilegier. De kan derefter bruge disse privilegier til at udføre kommandoer med fuld kontrol over værtssystemet.

Løsningen kører dine applikationer som en ikke-root bruger . Regnereksemplet opretter og konfigurerer brugeren lommeregner .





overfør google drive til en anden konto
# Set non-root user for security 
RUN adduser calculator --system

# Add the user to the calculator group
RUN addgroup calculator && adduser calculator calculator

Oprettelse af en dedikeret bruger til din applikation begrænser de tilgængelige tilladelser for potentielle angribere. Det gør det sværere at udnytte sårbarheder.

Kopiering af nødvendige filer og oprettelse af et virtuelt miljø

Oprettelse af et virtuelt miljø i en Docker-container isolerer afhængigheder. Dette forhindrer konflikter med systemdækkende pakker og andre applikationer. Det sikrer også versionskompatibilitet, da du kan installere de nøjagtige versioner af afhængigheder, som din applikation har brug for, uden at påvirke resten af ​​systemet.

Kopier de nødvendige filer ind i containeren. Opret derefter et virtuelt miljø til lommeregnerapplikationen ved hjælp af Pythons indbyggede venv modul.

# Set working directory and copy necessary files 
WORKDIR /app
COPY app.py .
COPY requirements.txt .
COPY config.json ./
# Copy config.json from the local directory

# Create a virtual environment and install dependencies
RUN python -m venv /venv
ENV PATH="/venv/bin:$PATH"
RUN /venv/bin/pip install --upgrade pip --no-cache-dir --requirement requirements.txt

Virtuelle miljøer er lette og effektive, da de ikke duplikerer system-dækkende pakker. Dette hjælper med at holde Docker-billedstørrelsen mindre og reducerer ressourceforbruget, når containeren kører.

Minimering af lag for effektivitet

Hver instruktion i en Dockerfile opretter et nyt lag i det resulterende billede. Docker bruger en kopi-på-skriv-mekanisme til at administrere disse lag. Reduktion af antallet af lag i Docker-billedet forbedrer billedstørrelsen og byggeydelsen markant. En måde at reducere lag på er ved at konsolidere flere kommandoer til en enkelt LØB instruktion.

# Minimizing Layers for Efficiency 
# Combine commands to reduce the number of layers
RUN echo "Build process goes here" && \
   /venv/bin/python -m compileall . && \
   rm -rf __pycache__

Ved at kombinere ovenstående kommandoer reduceres antallet af mellemliggende lag, der oprettes under billedopbygningsprocessen.

Sikring af konfigurationshåndtering

Håndtering af følsomme oplysninger i et Docker-billede udgør en sikkerhedsrisiko. For at øge sikkerheden bør du bruge miljøvariabler og eksterne konfigurationsfiler. I eksemplet med lommeregnerapplikationen kan du oprette en mappe med navnet /config at lagre din konfigurationsfil og sæt det passende ejerskab.

hvordan man gør windows explorer mørk
# Securing Configuration Handling 
RUN mkdir /config && chown calculator:calculator /config

Kopier derefter config.json fil i denne mappe, og sørg for, at den forbliver adskilt fra applikationskoden.

# Copy the config.json file into the container 
RUN cp config.json /config/config.json
ENV CONFIG_PATH=/config/config.json

Adskillelse af konfigurationsdata fra koden og anvendelse af passende tilladelser forbedrer den overordnede sikkerhed for dit Docker-billede. Det sikrer, at kun autoriserede processer eller brugere har adgang til kritiske konfigurationsdata.

Brug af flertrinsbygninger

Byg i flere trin giver dig mulighed for at adskille byggemiljøet fra det endelige billede. Dette resulterer i mindre, mere fokuserede produktionsbilleder. Det øger også sikkerheden ved at udelukke build-relaterede værktøjer og filer fra det endelige billede. Dette reducerer angrebsoverfladen og minimerer potentielle sikkerhedsrisici forbundet med unødvendige komponenter.

# Leveraging Multi-Stage Builds 
FROM python:3.11-slim-bookworm

COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/group /etc/group
COPY --from=builder /venv /venv
COPY --from=builder /config /config
COPY --from=builder /app /app
# Copy the application code

Ovenstående kode kopierer kun de nødvendige artefakter fra byggefasen (Bygger) ind i det endelige billede. Dette reducerer billedstørrelsen ved at udelukke build-relaterede værktøjer og filer, der ikke er nødvendige for at køre regneprogrammet.

Forbedring af sikkerheden med billedscanning

For yderligere at forbedre sikkerheden af ​​dine Docker-billeder, brug billedscanningsværktøjer som Trivy eller Clair. Disse værktøjer er designet til at identificere sårbarheder i dine billedlag og afhængigheder. Brug Trivy til lommeregner-appen, for at udføre sårbarhedsscanning .

# Install Trivy for Debian/Ubuntu 
RUN apt-get update && \
   apt-get install -y wget apt-transport-https gnupg lsb-release && \
   wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | apt-key add - && \
   echo "deb https://aquasecurity.github.io/trivy-repo/deb bookworm main" \
   | tee -a /etc/apt/sources.list.d/trivy.list && \
   apt-get update && \
   apt-get install -y trivy

Tilføjelse af Trivy sårbarhedsscanning til dit Docker-billede er afgørende. Dette skyldes, at den bruger databasen Common Vulnerabilities and Exposures (CVE), som løbende opdateres med information om kendte sårbarheder. Dette hjælper dig med at holde dine billeder opdaterede med de nyeste sikkerhedsrettelser og beskytte dine applikationer mod kendte udnyttelser.

Brug følgende kommando for at få en sårbarhedsrapport på dit billede.

docker run --rm ` 
 -v /var/run/docker.sock:/var/run/docker.sock `
 -v $HOME/Library/Caches:/root/.cache/ `
 aquasec/trivy:0.18.3 `
 <your image name>

Ovenstående kommando vil tage noget tid at køre. Når den er færdig, genererer den en rapport som den nedenfor.

  Trivy sårbarhedsrapport på terminalen

Jo højere sværhedsgrad, desto hurtigere bør du løse den identificerede sårbarhed.

hvor mange billeder kan et 32 ​​GB hukommelseskort rumme

Kørsel af applikationer som ikke-rootbrugere

For at øge sikkerheden køres applikationen som calculato r bruger for at begrænse potentielle sårbarheder.

# Running Applications as Non-Root Users 
WORKDIR /app
USER calculator

# Activate the virtual environment and run the application
CMD ["/bin/bash", "-c", "source /venv/bin/activate && python app.py"]

Skift til en ikke-rodbruger minimerer angrebsoverfladen.

Containerisering af ikke-Python-applikationer

Docker containerisering af applikationer drevet af andre sprog er lidt anderledes. Du bør blive fortrolig med, hvordan man containeriserer forskellige typer applikationer. Dette vil hjælpe dig med at beslutte den bedste strategi at anvende baseret på den type sprog, din applikation bruger.