بیاموزید که چگونه از Docker برای بسته بندی و استقرار کارآمد برنامه های Go خود استفاده کنید و آنها را قابل حمل و مدیریت آسان کنید.
Docker به دلیل سادگی و سهولت استفاده، محبوبترین فناوری کانتینریسازی است. Docker استرس ناشی از مسائل قابل حمل را در توسعه و توزیع نرم افزار کاهش می دهد. می توانید کانتینرهای docker خود را در اکثر ارائه دهندگان خدمات ابری مستقر کنید.
کانتینر کردن برنامه های Go خود با Docker می تواند به شما کمک کند از استقرار مداوم و قابل اعتماد در محیط های مختلف اطمینان حاصل کنید. میتوانید برنامههای Go خود را در محیطهای مختلفی مانند توسعه، مرحلهبندی، و تولید مستقر کنید. کانتینرهای Docker نسبت به ماشین های مجازی سنتی سبک وزن هستند و فضای کمتری را اشغال می کنند. این می تواند در هزینه های میزبانی صرفه جویی کند و همچنین می تواند استقرار شما را سریعتر کند.
راه اندازی یک وب سرور ساده در Go
کتابخانه استاندارد Go شامل بسته هایی است که برای راه اندازی یک وب سرور ساده به آن نیاز دارید.
ابتدا بسته های http، log و json را وارد کنید. شما از بسته http Go برای راه اندازی سرور و نقطه پایان درخواست GET استفاده خواهید کرد. بسته log برای ثبت خطاهای احتمالی در کنسول شما. بسته json برای رمزگذاری یک ساختار به JSON برای نقطه پایانی API.
import (
"encoding/json"
"log"
"net/http"
)
میتوانید یک نمونه ساختار را بهعنوان JSON بهعنوان پاسخی بر اساس اعتبار درخواست به مشتری کدگذاری کنید:
type Message struct {
Response string`json:"response"`
Description string`json:"description"`
}
اگر درخواست به نقطه پایانی یک درخواست GET باشد، تابع handler یک پیام موفقیت آمیز را به مشتری برمی گرداند.
// dockerTestEndpoint handles the API endpoint for testing Docker connectivity
func dockerTestEndpoint(writer http.ResponseWriter, request *http.Request) {
// Set the response header to indicate JSON content
writer.Header().Set("Content-Type," "application/json")
// If the request method is GET
if request.Method == "GET" {
// Set the response status code to 200 OK
writer.WriteHeader(http.StatusOK)
// Create a message struct for a successful response
message := Message{
Response: "Successful",
Description: "You've successfully hit the API endpoint " +
"From your Docker Container",
}
// Encode the message as JSON and send it as the response
err := json.NewEncoder(writer).Encode(&message)
if err != nil {
return
}
} else {
// If the request method is not GET
// Set the response status code to 400 Bad Request
writer.WriteHeader(http.StatusBadRequest)
// Create a message struct for a bad request response
message := Message{
Response: "Bad Request",
Description: "You've successfully hit the API endpoint From your " +
"Docker Container, But you made a bad request",
}
// Encode the message as JSON and send it as the response
err := json.NewEncoder(writer).Encode(&message)
if err != nil {
return
}
}
}
شما تابع handler را در تابع اصلی با مسیر به صورت /api/docker/go تنظیم می کنید. تابع کنترل کننده dockerTestEndpoint تأیید می کند که درخواست به کنترل کننده یک درخواست GET است. اگر یک درخواست GET باشد، یک نمونه ساختار Message instantated را بر اساس وضعیت درخواست برای مشتری رمزگذاری می کند.
در اینجا نحوه نصب تابع هندلر در مسیر و راه اندازی سرور برای اجرا در پورت 8080 آمده است:
func main() {
// Register the handler function 'dockerTestEndpoint'
// to handle requests for the "/api/docker/go" URL.
http.HandleFunc("/api/docker/go", dockerTestEndpoint)
// Start the HTTP server and listen for incoming requests on port 8080.
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatalln("There's an error with the server:", err)
}
}
تابع اصلی نقطه ورودی سرور است که به پورت 8080 گوش می دهد. روش HandleFunc مسیرها را بر روی تابع کنترلر نصب می کند. متد ListenAndServe سرور را روی پورت میزبان محلی مشخص شده 8080 راه اندازی می کند.
شروع به کانتینر کردن برنامه های Go خود با Docker
پس از نصب و راهاندازی Docker، برای ایجاد و ساختن یک تصویر Docker برای برنامه Go خود به یک فایل Docker به نام Dockerfile نیاز دارید. شما دستوراتی را برای تصویر پایه و دستوراتی برای کپی کردن فایل ها، افزودن دایرکتوری کاری و اجرای برنامه در Dockerfile مشخص خواهید کرد.
این دستور را در ترمینال فضای کاری خود اجرا کنید تا یک Dockerfile ایجاد کنید.
touch Dockerfile
شما دستورات ساخت تصویر Docker خود را در Dockerfile مشخص خواهید کرد.
اگر فایلی وجود دارد که می خواهید از تصویر Docker خود جدا کنید، می توانید از یک فایل .dockerignore استفاده کنید. فایلهای .dockerignore دقیقاً مانند فایلهای .gitignore کار میکنند.
touch .dockerignore
در مرحله بعد، دستورات ساخت را در Dockerfile خود برای محفظه کردن برنامه های خود مشخص می کنید.
تعریف دستورات در Dockerfile
Dockerfiles بر اساس مشخصات پروژه شما قابل تنظیم است. شما دستوراتی را برای ساختن تصویر پایه برای ساخت برنامه تعریف خواهید کرد.
در اینجا نمونه ای از محتویات یک Dockerfile است که سرور وب را در بالا می سازد:
# Use a Golang base image
FROM golang:latest
# Set the working directory inside the container
WORKDIR /app
# Copies all the files in the local directory to the working directory in the container
COPY . .
# Download the Go module dependencies
RUN go mod download
# Build the Go application
RUN go build -o app
# Set the entry point for the application
ENTRYPOINT ["./app"]
Dockerfile از golang: آخرین تصویر پایه برای ساخت برنامه پس از تنظیم دایرکتوری کاری روی /app استفاده می کند.
Dockerfile فایل ها را با دستور COPY کپی می کند و وابستگی ها را با دستور RUN دانلود می کند.
فایل یک عملیات ساخت و اجرا را با دستور RUN مشخص میکند، سپس دستور را تنظیم میکند تا زمانی که ظرف با دستور CMD شروع میشود، اجرا شود.
Dockerfile را در همان فهرستی که فایلهای go.mod و main.go خود ذخیره میکنند. سپس این دستور را اجرا کنید تا یک تصویر Docker از این Dockerfile بسازید:
docker build -t GolangTutorial .
دستور بالا یک تصویر Docker با آموزش تگ golang ایجاد می کند. با این دستور می توانید یک کانتینر را اجرا کنید:
docker run -p 8080:8080 golangtutorial
این فرمان پورت 8080 را از کانتینر به پورت 8080 در لوکال هاست دستگاه میزبان نگاشت می کند. می توانید سرور در حال اجرا در ظرف Docker را از دستگاه میزبان درخواست کنید.
در اینجا نتیجه ارسال درخواست CURL به سرور است که این بار در Docker اجرا می شود:
می توانید از Docker Compose برای ارکستراسیون کانتینر استفاده کنید
Docker Compose ابزاری است که می توانید از آن برای هماهنگی (کار با بسیاری از) کانتینرهای Docker استفاده کنید. Docker Compose به شما امکان می دهد یک برنامه چند کانتینری را در یک فایل YAML تعریف کنید. شما می توانید با یک دستور کل برنامه را اجرا و مدیریت کنید.
می توانید از Docker Compose برای استقرار و مدیریت برنامه های پیچیده کانتینری استفاده کنید. Docker Compose مدیریت را با استقرار خودکار و مداوم ساده می کند.