Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Imej Docker untuk Go (Golang) Imej dan Keselamatan Docker Kecil, Lebih Pantas

Imej Docker untuk Go (Golang) Imej dan Keselamatan Docker Kecil, Lebih Pantas

王林
王林asal
2024-08-06 01:48:22833semak imbas

Pada hujung minggu saya sedang melakukan penyelidikan tentang imej buruh pelabuhan khusus untuk digunakan dengan aplikasi Go (Golang). Oleh itu, terfikir untuk berkongsi penemuan menarik kerana ia mungkin berguna kepada seseorang yang meneroka perkara yang sama untuk kerja projek teknologi mereka.

Di sini, saya akan menghuraikan beberapa cara berbeza kita boleh membina imej untuk Golang dan juga menyerlahkan beberapa pertimbangan keselamatan yang perlu kita ambil kira semasa memilih satu.

Untuk latihan ini saya menggunakan API Rehat mudah yang dibangunkan menggunakan Go (Golang) menggunakan Rangka Kerja Gin.

Rangka kerja Gin ialah rangka kerja web popular untuk Go (Golang) yang direka bentuk agar pantas, mudah digunakan dan sangat cekap.
 
Berikut ialah ringkasan ringkas ciri dan ciri utamanya;

Ciri Utama

  • Prestasi: Gin terkenal dengan prestasinya yang tinggi. Ia merupakan salah satu rangka kerja web Go terpantas, memberikan overhed minimum berbanding rangka kerja lain.

  • Penghala HTTP Pantas: Gin menggunakan penghala HTTP pantas dan menyokong penghalaan dengan kaedah seperti GET, POST, PUT, DELETE, dll. Ia juga menyokong perisian tengah dan kumpulan laluan.

  • Sokongan Perisian Tengah: Gin menyediakan cara untuk menggunakan perisian tengah untuk mengendalikan tugas seperti pengelogan, pengesahan dan permintaan pra atau pasca pemprosesan yang lain.

  • Pengesahan JSON: Rangka kerja ini menawarkan sokongan terbina dalam untuk pengesahan JSON dan data permintaan yang mengikat ke struct Go, menjadikannya lebih mudah untuk bekerja dengan muatan JSON.

  • Pengendalian Ralat: Gin mempunyai cara berstruktur untuk mengendalikan ralat dan menyediakan sistem pengurusan ralat pusat, membolehkan anda mengendalikan ralat dengan anggun.

  • Rendering Templat: Walaupun Gin direka terutamanya untuk pembangunan API, ia menyokong pemaparan templat HTML jika perlu.

  • Pengendalian Permintaan: Menyokong kaedah berbeza untuk pengendalian permintaan termasuk data borang, muatan JSON dan parameter URL.

  • Penyahpepijatan Terbina dalam: Gin menyediakan mesej ralat terperinci dan maklumat penyahpepijatan yang boleh berguna semasa pembangunan.

Komponen Utama

  • Penghala: Komponen teras yang mengendalikan penghalaan permintaan HTTP kepada pengendali yang sesuai.

  • Konteks: Struktur yang membawa data permintaan dan tindak balas, dan
    menyediakan kaedah untuk mengendalikannya. Ia digunakan secara meluas dalam pengendali.

  • Enjin: Contoh utama aplikasi Gin, yang dikonfigurasikan dengan laluan, perisian tengah dan tetapan lain.

  • Perisian Tengah: Fungsi yang dilaksanakan semasa kitaran hayat permintaan, membolehkan anda melaksanakan tugas seperti pengelogan, pengesahan dan banyak lagi

Cukup mengenai Rangka Kerja Gin :) sekarang mari kita beralih ke topik utama dan bercakap tentang Ujian yang dijalankan.

Ujian 1 (Binaan Docker Biasa)

Dalam Ujian ini, kami akan menggunakan Imej Piawaian Rasmi/Go Base Biasa

# Official Go Base Image
FROM golang:1.21.0

# Create The Application Working Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy Source and Build The Application
COPY . .
RUN go build -o main .

# Expose The Port
EXPOSE 8081
CMD ["./main"]

Saiz Imej

Docker Images for Go (Golang) Small, Faster Docker Images and Security


Ujian 2 (Binaan Docker Berbilang Peringkat dengan Imej Alpine)

Dalam Ujian ini kita akan menggunakan versi Alpine bagi Go Base Image yang lebih ringan sedikit

# Official Go Apline Base Image
FROM golang:1.21.0-alpine as builder

# Create The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source & Build
COPY . .
RUN go build -o main .

# Final Image Creation Stage
FROM alpine:3.19

WORKDIR /root/

# Copy The Built Binary
COPY --from=builder /app/main .

# Expose the port
EXPOSE 8081
CMD ["./main"]

Saiz Imej
Docker Images for Go (Golang) Small, Faster Docker Images and Security

Di sini anda dapat melihat bahawa dengan binaan berperingkat saiz imej dikurangkan dengan ketara.


Ujian 3 (Binaan Tanpa Distro)

Dalam Ujian ini kami akan menggunakan Imej Pangkalan Go Tanpa Distro Google. Imej tanpa distro dikenali sebagai ringan dan selamat yang mengandungi hanya fail minimum yang diperlukan. Dalam hal ini, cengkerang nyahpepijat dan pakej yang tidak diperlukan ini dialih keluar. oleh itu, anda mengorbankan fleksibiliti untuk memiliki pengurus pakej dan shell.

# Build Stage
FROM golang:1.21.0 as builder

# Set The Application Directory
WORKDIR /app

# Copy and Download Dependencies
COPY go.mod go.sum .
RUN go mod download

# Copy The Application Source and Build the application
COPY . .
RUN CGO_ENABLED=0 go build -o main .

# Final Image Creation Stage
FROM gcr.io/distroless/static-debian12

# Copy the built binary
COPY --from=builder /app/main /
CMD ["/main"]

Saiz Imej
Docker Images for Go (Golang) Small, Faster Docker Images and Security


CGO_ENABLED=0: Ini ialah tetapan pembolehubah persekitaran yang melumpuhkan CGO (C-Go). CGO ialah ciri Go yang membenarkan pakej Go memanggil kod C. Menetapkan CGO_ENABLED=0 memastikan binaan tidak bergantung pada mana-mana perpustakaan C, menghasilkan binari statik sepenuhnya. Ini berguna untuk mencipta perduaan Go yang ringan dan mudah alih yang boleh dijalankan pada mana-mana sistem tanpa memerlukan kebergantungan tambahan.

Menggabungkan semuanya, RUN CGO_ENABLED=0 go build -o main . bermakna Docker akan melaksanakan arahan untuk membina aplikasi Go dalam direktori semasa, menghasilkan binari statik bernama utama yang tidak bergantung pada mana-mana perpustakaan C.

Ringkasan

Saiz Imej
Docker Images for Go (Golang) Small, Faster Docker Images and Security

Walaupun imej Distroless lebih besar sedikit daripada imej alpine, pertimbangan keselamatan/kelemahan mungkin memaksa untuk memilih Distroless!. Oleh itu fikirkan semua fakta ini dan pilih yang sepadan dengan keperluan anda

Alpine dengan Binaan Berbilang Peringkat ialah pilihan yang baik jika anda memerlukan lebih kawalan ke atas proses binaan dan jika isu keserasian dengan musl libc tidak satu kebimbangan. Ia memberikan fleksibiliti dan lebih kecil daripada banyak imej asas lain, tetapi masih termasuk lebih banyak komponen daripada imej Distroless yang boleh membawa kepada potensi kelemahan/ancaman keselamatan.

Imej Tanpa Distro Google sesuai untuk memaksimumkan keselamatan dan meminimumkan permukaan serangan. Mereka menyediakan persekitaran masa jalan yang sangat minimum, yang boleh memberi manfaat kepada sistem pengeluaran di mana keselamatan menjadi keutamaan. Walau bagaimanapun, anda mengorbankan fleksibiliti untuk memiliki pengurus pakej dan shell.

Syor:

Gunakan Alpine jika anda memerlukan fleksibiliti dan kawalan ke atas persekitaran binaan, dan jika isu keserasian dengan musl libc bukanlah masalah.

Gunakan Google Distroless jika keselamatan dan meminimumkan permukaan serangan adalah keutamaan anda dan anda boleh memastikan bahawa aplikasi anda mempunyai semua kebergantungan yang digabungkan dengan betul.

Semoga ini menarik dan terima kasih atas masa anda!

Atas ialah kandungan terperinci Imej Docker untuk Go (Golang) Imej dan Keselamatan Docker Kecil, Lebih Pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn