KONTEYNER IMAGE-LƏRİ / PRAKTİKAPulsuz giriş

Konteyner image-ləri praktikası

İki image yarat, tətbiqi yoxla, konfiqurasiyasına bax və resursları təmizlə. Təxminən 25 dəqiqə ayır.

Konteyner image-ləri dərsinə qayıt

İş qovluğunu hazırla

Linux konteynerləri işlədən Docker mühərriki, internet, curl və boş lokal 8083 portu lazımdır. Kubernetes klasteri və registry hesabı tələb olunmur. Əmrlər bu səhifədə deyil, sənin terminalında işləyir. Aşağıdakı beş faylı yeni qovluğa yaz və əmrləri orada icra et. Məşq adlarını yalnız bu iş üçün istifadə et; artıq mövcuddursa, bütün əmrlərdə uyğun yeni adlar seç.

Başlanğıc faylları (5)
go.mod
module example.com/academy-web

go 1.26.0
main.go
package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello from Proxy Academy")
    })
    server := &http.Server{
        Addr: ":8080",
        Handler: mux,
        ReadHeaderTimeout: 5 * time.Second,
    }
    log.Fatal(server.ListenAndServe())
}
Dockerfile
FROM golang:1.26-alpine
WORKDIR /src
COPY go.mod main.go ./
RUN CGO_ENABLED=0 go build -trimpath -o /server .
USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/server"]
.dockerignore
.git
.env
.env.*
*.pem
*.key
bin/
coverage/
Dockerfile.multistage
FROM golang:1.26-alpine AS build
WORKDIR /src
COPY go.mod main.go ./
RUN CGO_ENABLED=0 go build -trimpath -o /server .

FROM scratch AS runtime
COPY --from=build /server /server
USER 65532:65532
EXPOSE 8080
ENTRYPOINT ["/server"]
Hər iki variantı yaratYuxarıdakı başlanğıc fayllarını boş bir qovluğa yaz. Build-dən əvvəl hansı image-in kiçik olacağını təxmin et.
docker build -t academy-container-lab:single .
docker build -f Dockerfile.multistage -t academy-container-lab:multi .
docker image ls academy-container-lab
Gözlənilən müşahidə
Hər iki tag görünməlidir. SIZE dəyərlərini müqayisə et; çoxmərhələli image daha kiçik olmalıdır. Dəqiq ölçülər dəyişir.
İşə sal və HTTP-ni yoxlaBoş lokal 8083 portundan istifadə et. Başladıqdan sonra curl işlət; xəta olarsa yenidən sınamazdan əvvəl docker logs academy-container-lab ilə bax.
docker run -d --name academy-container-lab -p 127.0.0.1:8083:8080 academy-container-lab:multi
curl --fail http://127.0.0.1:8083
Gözlənilən müşahidə
Hello from Proxy Academy
Konfiqurasiya edilmiş istifadəçini yoxlaScratch konteynerinin daxilində shell olmadan image konfiqurasiyasına bax.
docker image inspect academy-container-lab:multi --format '{{.Config.User}}'
Gözlənilən müşahidə
65532:65532
İkinci lokal istinad yaratEyni image-ə yeni tag ver və ID-ləri müqayisə et. Bu addım registry-yə heç nə yükləmir.
docker tag academy-container-lab:multi academy-container-lab:release
docker image inspect academy-container-lab:multi academy-container-lab:release --format '{{.Id}}'
Gözlənilən müşahidə
İki eyni image ID-si. Dəqiq dəyər build-dən asılıdır.
Bu məşqin resurslarını təmizləAdı göstərilən məşq konteynerini dayandır və sil, sonra yalnız onun image tag-lərini sil. Bütün sistemə tətbiq olunan prune əmrlərindən istifadə etmə.
docker stop academy-container-lab
docker rm academy-container-lab
docker image rm academy-container-lab:single academy-container-lab:multi academy-container-lab:release
Gözlənilən müşahidə
Məşq konteyneri və image istinadları silinir. Build cache qala bilər.

Nəticəni izah et

Niyə ölçüləri fərqli olsa da, hər iki image eyni cavabı verə bilir? Niyə ikinci tag eyni image ID-sini saxlayır? Bu image-in başqa maşında əlçatan olması üçün nə lazımdır?

İzahını müqayisə et

Hər ikisində server icra faylı var; bir mərhələli image-də build alətləri də qalır. Tag yenidən build etmədən istinad əlavə edir. Digər maşın image-ə çıxış əldə etməlidir, adətən push-dan sonra registry vasitəsilə. Özəl image üçün giriş məlumatları və uyğun platforma da lazımdır.

Docker: container run · Docker: multistage builds