Создание простого веб-приложения 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 контейнера.
После выполнения этого задания:
Мы успешно создали простой образ 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.
Как видно на изображении, размер нашего оптимизированного изображения теперь составляет всего 7 МБ. Это значительное уменьшение по сравнению с первоначальным размером в 900 МБ. Отличная работа! 🚀
Наконец, просто запустите и проверьте этот образ. Это ваша задача 😇😇😇