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.
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.