GoDasturchi
Build Your First Dockerfile

Build Your First Dockerfile

Birinchi Dockerfile'ingizni yozing

Endi shu paytgacha o'rgangan hammasini — FROM, WORKDIR, COPY, RUN, CMD va qatlam keshlashni to'g'ri tartibda — birlashtirib, kichik Go HTTP serveri uchun to'liq, to'g'ri tuzilgan Dockerfile yozamiz.

main.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Salom, konteynerdan!")
	})
	http.ListenAndServe(":8080", nil)
}
Dockerfile
FROM golang:1.22

WORKDIR /app

# Bog'liqliklar (kamdan-kam o'zgaradi)  avval, alohida nusxalanadi
COPY go.mod ./
RUN go mod download

# Kodning o'zi (tez-tez o'zgaradi)  oxirida
COPY . .
RUN go build -o server .

# Konteyner ichida 8080-port tinglanishini "hujjatlashtirish"
EXPOSE 8080

CMD ["./server"]

EXPOSE 8080 — bu qator konteynerni haqiqatan tashqi dunyoga ochmaydi (bu shunchaki "hujjat", boshqa dasturchilarga va vositalarga "bu konteyner 8080-portda ishlaydi" deb aytadi). Haqiqiy "ochish" docker run chaqirilganda -p bayrog'i bilan bajariladi: docker run -p 8080:8080 mening-serverim — bu "kompyuterimning 8080-portini konteynerning 8080-portiga ulang" degani.

E'tibor bering: bu yerda go.mod alohida nusxalanmoqda, lekin go.sum yo'q — chunki bu misolda dastur tashqi bog'liqliklarga ega emas (faqat standart kutubxona). Agar loyihangizda tashqi paketlar bo'lsa, COPY go.mod go.sum ./ deb ikkalasini ham nusxalash kerak bo'ladi — bu "Packages & Organization" kursida ko'rgan Go modullari tizimining Docker'dagi davomi.

Key Takeaway

Key Takeaway:

To'g'ri Dockerfile — bog'liqliklarni avval, kodni oxirida nusxalab keshlashdan foydalanadi, va EXPOSE bilan qaysi port ishlatilishini hujjatlashtiradi (haqiqiy ochish esa docker run -p orqali bo'ladi).

NEXT UP

Multi-Stage Builds

Build Your First Dockerfile

Birinchi Dockerfile'ingizni yozing

Endi shu paytgacha o'rgangan hammasini — FROM, WORKDIR, COPY, RUN, CMD va qatlam keshlashni to'g'ri tartibda — birlashtirib, kichik Go HTTP serveri uchun to'liq, to'g'ri tuzilgan Dockerfile yozamiz.

main.go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Salom, konteynerdan!")
	})
	http.ListenAndServe(":8080", nil)
}
Dockerfile
FROM golang:1.22

WORKDIR /app

# Bog'liqliklar (kamdan-kam o'zgaradi)  avval, alohida nusxalanadi
COPY go.mod ./
RUN go mod download

# Kodning o'zi (tez-tez o'zgaradi)  oxirida
COPY . .
RUN go build -o server .

# Konteyner ichida 8080-port tinglanishini "hujjatlashtirish"
EXPOSE 8080

CMD ["./server"]

EXPOSE 8080 — bu qator konteynerni haqiqatan tashqi dunyoga ochmaydi (bu shunchaki "hujjat", boshqa dasturchilarga va vositalarga "bu konteyner 8080-portda ishlaydi" deb aytadi). Haqiqiy "ochish" docker run chaqirilganda -p bayrog'i bilan bajariladi: docker run -p 8080:8080 mening-serverim — bu "kompyuterimning 8080-portini konteynerning 8080-portiga ulang" degani.

E'tibor bering: bu yerda go.mod alohida nusxalanmoqda, lekin go.sum yo'q — chunki bu misolda dastur tashqi bog'liqliklarga ega emas (faqat standart kutubxona). Agar loyihangizda tashqi paketlar bo'lsa, COPY go.mod go.sum ./ deb ikkalasini ham nusxalash kerak bo'ladi — bu "Packages & Organization" kursida ko'rgan Go modullari tizimining Docker'dagi davomi.

Key Takeaway

Key Takeaway:

To'g'ri Dockerfile — bog'liqliklarni avval, kodni oxirida nusxalab keshlashdan foydalanadi, va EXPOSE bilan qaysi port ishlatilishini hujjatlashtiradi (haqiqiy ochish esa docker run -p orqali bo'ladi).

NEXT UP

Multi-Stage Builds