What is volume mapping in Docker?

Forstå Docker Volume Mapping: En Komplet Guide

30/03/2009

Rating: 4.12 (16905 votes)

At arbejde med Docker har revolutioneret måden, vi bygger, sender og kører applikationer på. En af de mest fundamentale koncepter, enhver udvikler skal mestre, er håndteringen af data. Som standard er Docker-containere statsløse, hvilket betyder, at alle data, der genereres inde i en container, forsvinder, når containeren stoppes eller slettes. Dette er en stor udfordring for applikationer som databaser eller systemer, der kræver vedvarende konfiguration. Løsningen på dette problem er volume mapping, en kraftfuld mekanisme til at bevare og dele data mellem din værtsmaskine og dine containere.

What is volume mapping in Docker?
Volume mapping is described in the Docker documentation here. You can view the volume mappings for a container by using the Containers window in Visual Studio. Contains the bits required to run the debugger in the container depending on the project type. See Customize container images for debugging.

Denne artikel dykker ned i, hvad volume mapping er, hvorfor det er afgørende, og hvordan du kan implementere det i dine projekter. Vi vil se på praktiske eksempler, sammenligne det med andre metoder som miljøvariabler og undersøge, hvordan værktøjer som Visual Studio udnytter denne funktion til at forbedre udviklingsprocessen.

Indholdsfortegnelse

Hvad er Docker Volume Mapping?

Docker volume mapping er en proces, hvorved et bibliotek eller en fil på værtsmaskinen (din computer) bliver gjort tilgængelig inde i en Docker-container. Det skaber en direkte forbindelse, så ændringer foretaget på den ene side øjeblikkeligt afspejles på den anden. Dette giver dig mulighed for at adskille data fra containerens livscyklus, hvilket sikrer, at dine data er vedvarende.

Der er primært to typer af mounts i Docker:

  • Volumes: Disse er fuldt administreret af Docker og gemmes i et dedikeret område på værtsmaskinens filsystem (typisk under /var/lib/docker/volumes/ på Linux). Dette er den foretrukne metode til at bevare data genereret af containere. Du kan oprette, slette og inspicere dem ved hjælp af Docker CLI-kommandoer.
  • Bind Mounts: Med et bind mount kan du specificere en præcis sti på din værtsmaskine, som skal mappes ind i containeren. Dette er yderst nyttigt under udvikling, for eksempel til at mappe din projektkildekode ind i en container, så ændringer i koden øjeblikkeligt er tilgængelige for applikationen, der kører i containeren, uden at skulle genbygge imaget.

Kommandoen docker run -v kan bruges til at oprette begge typer, afhængigt af den syntaks, du bruger.

Hvorfor er Volume Mapping Vigtigt?

Brugen af volume mapping løser flere centrale udfordringer, når man arbejder med containeriserede applikationer. Her er de vigtigste fordele:

1. Dataoverlevelse (Data Persistence)

Den mest åbenlyse fordel er dataoverlevelse. Hvis du kører en database som PostgreSQL eller MySQL i en container, vil du ikke miste alle dine data, hver gang du genstarter containeren. Ved at mappe databasens datalager til et volume på værtsmaskinen sikrer du, at dataene forbliver intakte, uanset hvad der sker med containeren.

2. Deling af Konfiguration

Mange applikationer kræver konfigurationsfiler. I stedet for at bage disse filer ind i dit Docker-image (hvilket gør det statisk og ufleksibelt), kan du mappe en konfigurationsfil fra værtsmaskinen ind i containeren. Dette giver dig mulighed for at ændre konfigurationen uden at skulle genbygge og genstarte hele din applikation.

3. Effektiv Udvikling

For udviklere er bind mounts et uvurderligt værktøj. Ved at mappe din kildekodemappe ind i containeren kan du bruge din foretrukne editor på værtsmaskinen til at skrive kode, og resultaterne afspejles live i den kørende applikation inde i containeren. Dette er grundlaget for funktioner som 'hot-reloading' og gør udviklingscyklussen meget hurtigere.

Is there a wrong way to map volumes in Docker?
Being able to map volumes with the host is great for configurations and data persistence. However, there are often circumstances where environment variables might work better. There isn’t really a wrong way to do things, just whatever makes more sense for your Docker needs. Nic Raboy is an advocate of modern web and mobile development technologies.

Praktisk Eksempel: Volume Mapping vs. Miljøvariabler

Lad os se på et konkret eksempel med en simpel Node.js-applikation for at illustrere, hvordan man kan levere konfiguration på to forskellige måder: via en mappet konfigurationsfil og via miljøvariabler.

Forestil dig en simpel app, der læser et brugernavn og en adgangskode fra en config.json-fil eller fra miljøvariabler, hvis de findes.

Applikationens logik i app.js kunne se således ud:

const Config = require("./config"); console.log(process.env.username || Config.username); console.log(process.env.password || Config.password);

Den tilhørende Dockerfile er også simpel:

FROM node:alpine COPY * /srv/ WORKDIR /srv/ CMD ["node", "app.js"]

Når vi bygger dette image, kopieres en standard config.json-fil med ind i imaget.

Metode 1: Brug af Volume Mapping

For at overskrive den indbyggede konfigurationsfil kan vi oprette en ny config.json på vores værtsmaskine og mappe den ind i containeren ved kørsel. Hvis din nye fil er i den nuværende mappe, kan du køre:

docker run -v $(pwd)/config.json:/srv/config.json din-app

Dette kommando tager config.json-filen fra din nuværende mappe på værtsmaskinen og erstatter den fil, der ligger på /srv/config.json inde i containeren. Applikationen vil nu bruge værdierne fra din lokale fil.

Metode 2: Brug af Miljøvariabler

Som et alternativ kan vi levere konfigurationen direkte via miljøvariabler ved hjælp af -e flaget. Vores app er designet til at prioritere disse, hvis de eksisterer.

docker run -e username=ENV-USER -e password=ENV-PASS din-app

I dette tilfælde ignorerer applikationen config.json-filen fuldstændigt og bruger i stedet de værdier, vi har angivet i kommandoen.

Where does Docker store volumes?
You can change where Docker stores its files including volumes by changing one of its startup parameters called --data-root. If you're using systemd for service management, the file is usually located at /lib/systemd/system/docker.service. Edit the file as such:

Sammenligningstabel

Hvornår skal man vælge den ene metode frem for den anden? Her er en hurtig sammenligning:

FunktionVolume MappingMiljøvariabler
Bedst tilKomplekse konfigurationsfiler (JSON, XML), databasefiler, kildekode.Simple værdier, hemmeligheder, API-nøgler, databaseforbindelsesstrenge.
KompleksitetKan håndtere store og komplekse datastrukturer.Begrænset til simple strenge (key-value pairs).
SikkerhedFilerne er synlige på værtssystemet. Kræver korrekt filsystem-rettighedsstyring.Kan være mere sikre, især når de håndteres med orkestreringsværktøjer som Docker Swarm eller Kubernetes Secrets.
Anvendelsedocker run -v /host/path:/container/pathdocker run -e KEY=VALUE

Volume Mapping i Udviklingsværktøjer som Visual Studio

Moderne udviklingsmiljøer (IDE'er) som Visual Studio har integreret Docker-support, der i høj grad er afhængig af volume mapping for at skabe en problemfri udviklings- og fejlfindingsoplevelse. Når du kører eller debugger et projekt i en container fra Visual Studio, opretter den automatisk flere bind mounts i baggrunden.

Disse inkluderer typisk:

  • App-mappe: Hele projektmappen mappes, så du kan redigere kode på værtsmaskinen og se ændringerne live.
  • NuGet-pakke-mapper: For at undgå at skulle downloade alle afhængigheder inde i containeren hver gang, mappes NuGet-cache-mapperne fra værtsmaskinen.
  • Remote Debugger: Visual Studio mapper de nødvendige værktøjer til fejlfinding ind i containeren, så du kan sætte breakpoints og inspicere variabler, som om applikationen kørte lokalt.
  • Brugerhemmeligheder og SSL-certifikater: For ASP.NET Core-projekter mappes mapper til brugerhemmeligheder og HTTPS-udviklingscertifikater for at sikre en sikker og funktionel lokal udviklingsoplevelse.

Denne automatisering gør det utroligt nemt at arbejde med containere uden at skulle håndtere komplekse Docker-kommandoer manuelt.

Ofte Stillede Spørgsmål (OSS)

Hvad er forskellen på et 'volume' og et 'bind mount'?

Et volume er administreret af Docker, og dets fysiske placering på værtsmaskinen er en implementeringsdetalje. Det er den bedste måde at håndtere data, som du vil have, skal være vedvarende. Et bind mount linker en specifik fil eller mappe på din værtsmaskine til en sti inde i containeren. Det giver mindre fleksibilitet, men er ideelt til at give en container adgang til eksisterende filer, som f.eks. kildekode.

Er der en forkert måde at mappe volumes på?

Der er ikke nødvendigvis en 'forkert' måde, men der er bestemt dårlig praksis. Man skal være forsigtig med, hvad man mapper. At mappe følsomme systemmapper fra værten (f.eks. / eller /etc) ind i en container kan udgøre en alvorlig sikkerhedsrisiko. Det er også vigtigt at overveje ydeevne; I/O-operationer på bind mounts, især på macOS og Windows, kan være langsommere end på native Docker-volumes.

Hvor gemmer Docker volumes fysisk?

Som standard opretter Docker en mappe på værtsmaskinen til at gemme alle sine data, inklusive volumes. På Linux er denne sti typisk /var/lib/docker/volumes/. Du kan finde den præcise placering af et specifikt volume ved at køre kommandoen docker volume inspect [volume_navn], som vil vise dig 'Mountpoint' stien.

Konklusion

Docker volume mapping er en uundværlig funktion for enhver, der arbejder seriøst med containerisering. Det løser det grundlæggende problem med den statsløse natur af containere ved at tilbyde en robust mekanisme til dataoverlevelse, konfigurationsstyring og effektiv udvikling. Ved at forstå forskellene mellem volumes og bind mounts, og vide hvornår man skal bruge dem i forhold til alternativer som miljøvariabler, kan du bygge mere fleksible, skalerbare og vedligeholdelsesvenlige applikationer. Uanset om du udvikler lokalt, kører en database eller implementerer i produktion, er en solid forståelse af volume mapping nøglen til succes med Docker.

Hvis du vil læse andre artikler, der ligner Forstå Docker Volume Mapping: En Komplet Guide, kan du besøge kategorien Teknologi.

Go up