Containerisering med Docker
Lär er paketera era Clojure-applikationer i Docker-containrar för enhetlig distribution i olika miljöer.
Containerisering med Docker är en gratis lektion i Clojure för funktionell programmering och JVM-backendutveckling på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Clojure för funktionell programmering och JVM-backendutveckling, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Clojure för funktionell programmering och JVM-backendutveckling innehåller totalt 4 lektioner.
Vad är Docker?
Docker hjälper dig att paketera dina applikationer och alla deras beroenden i standardiserade enheter som kallas containrar. Se det som en lättviktig virtuell maskin, men mycket effektivare!
För Clojure-utvecklare ser Docker till att applikationen körs på exakt samma sätt på din dator, en kollegas dator eller i molnet. Slut på problemen med att ”det fungerar på min dator”!
Avbildningar jämfört med containrar
Docker bygger på två centrala begrepp:
- Avbildningar: Det här är skrivskyddade mallar, ungefär som en ritning för applikationen. De innehåller din kod, dina bibliotek och din körmiljö.
- Containrar: Det här är körbara instanser av en avbildning. Du kan starta, stoppa, flytta eller ta bort en container utan att påverka avbildningen.
En Dockerfile är ett skript som talar om för Docker hur en avbildning ska byggas.
Börja med din Dockerfile
Alla Dockerfiles börjar med instruktionen FROM. Den anger den basavbildning som applikationen ska byggas vidare på. För Clojure är en OpenJDK-avbildning (Java Development Kit) ett utmärkt val.
Instruktionen WORKDIR anger standardkatalogen för efterföljande kommandon i avbildningen.
FROM openjdk:17-jdk-slim
WORKDIR /appProjektberoenden (deps.edn)
Vår Clojure-webbapp behöver ett bibliotek för att hantera HTTP-anrop. Vi använder Rings Jetty-adapter. Detta beroende deklareras i filen deps.edn, som Clojure använder för beroendehantering.
Vi definierar en map där nycklarna är biblioteksnamn och värdena anger deras version. Det talar om för Clojure hur den ska hitta och hämta den kod som behövs.
{:deps {ring/ring-jetty-adapter {:mvn/version "1.9.5"}}}Vår enkla webbapp
Nu ska vi skriva en minimal Clojure-webbserver. Den här filen, src/server.clj, blir startpunkten för vår applikation. Den startar en Jetty-server som lyssnar på port 3000 och svarar med "Hello from Docker!".
Försök köra den lokalt först (när ni har konfigurerat deps.edn och kört clojure -P):
(ns server
(:require [ring.adapter.jetty :as jetty])
(:gen-class))
(defn handler [request]
{:status 200
:headers {"Content-Type" "text/plain"}
:body "Hello from Clojure in Docker!"})
(defn -main []
(println "Starting server on port 3000...")
(jetty/run-jetty handler {:port 3000 :join? false}))Kopiera kod och installera beroenden
Nu kopierar vi deps.edn och källkoden till containern. Det är god praxis att kopiera deps.edn först och köra clojure -P. Om deps.edn inte ändras kan Docker återanvända det här lagret, vilket gör byggen snabbare.
Sedan kopierar vi resten av projektfilerna.
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY deps.edn .
RUN clojure -P
COPY src srcSlutföra Dockerfile
För en webbapp behöver vi tala om för Docker vilken port applikationen lyssnar på. Instruktionen EXPOSE dokumenterar detta. Sedan anger CMD vilket kommando som ska köras när containern startar och startar vår Clojure-app.
Vår Clojure-app kör funktionen -main i namnrymden server.
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY deps.edn .
RUN clojure -P
COPY src src
EXPOSE 3000
CMD ["clojure", "-M", "-m", "server"]Bygga er avbildning
När Dockerfile och Clojure-projektet är klara kan vi bygga Docker-avbildningen. Gå till projektets rotkatalog (där Dockerfile, deps.edn och src finns) och kör det här kommandot:
-tmärker avbildningen med ett namn och en valfri version..anger att Docker ska leta efter Dockerfile i den aktuella katalogen.
docker build -t my-clojure-web-app .Köra er container
När avbildningen har byggts kan ni köra den som en container. Vi använder flaggan -p för att mappa en port på värddatorn (till exempel 8080) till porten inuti containern (3000, som vår app exponerar).
Öppna http://localhost:8080 i webbläsaren efter starten för att se Clojure-appen!
docker run -p 8080:3000 my-clojure-web-appVarför använda containrar
Att köra era Clojure-applikationer i containrar har många fördelar:
- Enhetlighet: Appen körs likadant överallt.
- Isolering: Containrar isolerar appen från andra appar och värdsystemet.
- Portabilitet: Flytta enkelt appen mellan olika miljöer.
- Skalbarhet: Starta snabbt flera instanser av appen.
Det gör driftsättning och hantering mycket enklare för Clojure-tjänster.
Kontroll av Dockerfile-kommandon
Vilka av följande Dockerfile-instruktioner är korrekt beskrivna?
Sammanfattning: Docker för Clojure
Ni har lärt er hur Docker hjälper till att paketera Clojure-applikationer för enhetlig driftsättning. Vi gick igenom:
- Grundbegreppen avbildningar och containrar.
- Att skriva en Dockerfile med viktiga instruktioner som
FROM,WORKDIR,COPY,RUN,EXPOSEochCMD. - Att bygga en Docker-avbildning och köra den som en container.
Den här kunskapen är avgörande för att driftsätta robusta Clojure-mikrotjänster!
Lär dig Clojure med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Containerisering med Docker” gratis?
Ja – hela texten till ”Containerisering med Docker” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Clojure för funktionell programmering och JVM-backendutveckling, kan Ni uppgradera till CoddyKit PRO. Kursen i Clojure för funktionell programmering och JVM-backendutveckling innehåller totalt 4 lektioner.
Vad lär jag mig i ”Containerisering med Docker”?
Lär er paketera era Clojure-applikationer i Docker-containrar för enhetlig distribution i olika miljöer. Ni övar på Clojure för funktionell programmering och JVM-backendutveckling med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Clojure för funktionell programmering och JVM-backendutveckling?
Du behöver inga förkunskaper. Utbildningen i Clojure för funktionell programmering och JVM-backendutveckling på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Containerisering med Docker”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Clojure för funktionell programmering och JVM-backendutveckling-lektionen?
Ja. Varje Clojure för funktionell programmering och JVM-backendutveckling-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Designa Clojure-mikrotjänster
- Containerisering med Docker
- Distribuera till molnplattformar
- Tjänsteupptäckt och API-gateways