Создание простого веб-приложения Hello World с помощью Docker и Golang

✋ Прежде чем перейти к коду…

– Что такое Docker 😦 ?
Docker – это бесплатный инструмент, который помещает ваше приложение и все его содержимое в аккуратную коробку, называемую контейнером. Эта коробка работает одинаково везде – на вашем компьютере, сервере, 🖇️or в облаке. Это избавляет от проблем типа “это работает на моей машине” и делает ваше приложение удобным для переноски. Docker и подобные ему инструменты упрощают процесс создания контейнеров и делают его очень удобным для создания программного обеспечения.

Я предполагаю, что вы это понимаете 😎. Если у вас нет базовых знаний о Docker, посмотрите это видео на YouTube. Это видео – культовое, которое я когда-либо видел 🚀.
Video Link 🖇️

Давайте кодировать 👩‍💻

⚠️ Убедитесь, что вы установили docker и golang в своей системе.

  • 1. > Первый шаг

Для начала выберите любую IDE, например VSCode, Atom, IntelliJ или Eclipse – выбор за вами.
В данном примере я выбрал vs code.

  • > Второй шаг

Откройте и настройте основы вашего проекта

Структура моего проекта такова:

├── Dockerfile
├── go.mod
└── main.go

В файле main.go я создал базовый hello world api, используя пакет http

main.go

package main

import "net/http"

func main() {
    http.HandleFunc("/", hellowordhandler)

    http.ListenAndServe(":9000", nil)
}

func hellowordhandler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World"))
}

  • > Третий шаг

Наконец мы завершили базовую настройку проекта. Далее мы переходим к Dockerfile (Dockerfile – это набор инструкций для создания контейнера Docker).

Dockerfile

# Base Image
FROM golang:latest

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy everything from the current directory to the PWD(Present Working Directory) inside the container
COPY . .

# Download all the dependencies
RUN go mod download

# Build the Go app
RUN go build -o main .

# Expose port 8080 to the outside world
EXPOSE 8080

# Command to run the executable
CMD ["./main"]
  • > Forth Step

Создайте этот образ Docker

Чтобы собрать этот образ Docker, выполните следующую команду:

docker build -t hello-word . 

В этой команде -t указывает имя тега для нашего конечного образа (в данном случае “hello-world”), а . означает, что Dockerfile находится в текущем каталоге. Точка (.) означает, что контекст сборки – это текущий каталог, и Docker будет использовать найденный в нем Dockerfile для создания образа.


Загрузка ⭕. Этот процесс может занять более 1 минуты.

Последний шаг

После этого вы выполняете другую команду.

docker images

В результате вы можете увидеть изображение hello-world на их.

Затем запустите изображение.

docker run -p 9000:9000 hello-world

Флаг -p используется для сопоставления портов. Он сопоставляет порт хост-машины с портом контейнера. В данном случае он сопоставляет порт 9000 на хосте с портом 9000 на контейнере. Таким образом, любой трафик, приходящий на хост-машину по порту 9000, будет перенаправлен на порт 9000 контейнера.

После выполнения этого задания:

Project final result

Мы успешно создали простой образ Docker Hello World, который послужит полезной отправной точкой для новичков. Однако стоит отметить, что текущий подход приводит к относительно большому размеру образа, около 900 МБ, что может быть не оптимальным. В духе постоянного совершенствования я готов оказать поддержку и дать рекомендации. Если вы проявите интерес и участие к этому посту, я с радостью расскажу вам о том, как значительно уменьшить размер изображения до менее чем 10 МБ. Давайте вместе отправимся в это путешествие к более эффективным и оптимизированным образам Docker!

Как уменьшить размер образа Docker?

В ходе работы над этим проектом я столкнулся с некоторыми серьезными проблемами, о которых подробно рассказал в последнем разделе этого поста. Одна из заметных проблем – конечный размер изображения, который вырос примерно до 900 МБ. Это довольно удивительно для приложения “Hello, World!”.

Сегодня мы попробуем уменьшить размер нашего изображения. Lets Gooooo…


Начнем:

# Base Image
FROM golang:latest

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy everything from the current directory to the PWD(Present Working Directory) inside the container
COPY . .

# Download all the dependencies
RUN go mod download

# Build the Go app
RUN go build -o main .

# Expose port 8080 to the outside world
EXPOSE 8080

# Command to run the executable
CMD ["./main"]

Это докер-файл нашего последнего созданного проекта

Давайте все изменим

# Base Image
FROM golang:latest as builder

# Set the Current Working Directory inside the container
WORKDIR /app

# Copy everything from the current directory to the PWD(Present Working Directory) inside the container
COPY . .

# Download all the dependencies
RUN go mod download

# Build the Go app
RUN go build -o main .

# Start fresh from a smaller image
FROM scratch

# Set the Current Working Directory inside the container
WORKDIR /root

# Copy the Pre-built binary file from the previous stage
COPY --from=builder /app/main .

# Expose port 8080 to the outside world
EXPOSE 8080

# Command to run the executable
CMD ["./main"]

Я изменил некоторые части в нашем старом файле. Изменения есть: ✒️

FROM golang:latest as builder
This line creates a new stage named “builder.” It’s like setting up a separate workspace to build our Go application.

FROM scratch
This line starts a fresh, minimal image from scratch for our final Docker image.

COPY --from=builder /app/main .
Instead of copying everything from the original workspace, we only copy the essential built binary (main) from the “builder” stage.

WORKDIR /root
In the final image, we set a smaller working directory to keep things tidy.

Создайте оптимизированный образ Docker 📦

Наконец, мы завершили кодирование. Давайте создадим наш оптимизированный образ Docker. Откройте терминал и перейдите в каталог, содержащий ваш Dockerfile. Выполните следующую команду: ⌨️
docker build -t {имя_образа} .
Эта команда указывает Docker на сборку образа на основе инструкций в вашем Dockerfile и помечает его именем “optimized-hello-world”. Символ . в конце указывает на то, что Dockerfile находится в текущем каталоге.

Проверьте оптимизированный размер изображения ✅

После завершения процесса сборки вы можете проверить размер оптимизированного образа Docker, выполнив следующую команду в терминале: ⌨️
docker images
Эта команда отобразит список образов Docker в вашей системе. Найдите образ с тегом “hello-world”. Вы должны увидеть уменьшенный размер, подтверждающий, что вы успешно оптимизировали свой образ Docker.

Final show images

Как видно на изображении, размер нашего оптимизированного изображения теперь составляет всего 7 МБ. Это значительное уменьшение по сравнению с первоначальным размером в 900 МБ. Отличная работа! 🚀

Наконец, просто запустите и проверьте этот образ. Это ваша задача 😇😇😇

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *