Рубрики
Uncategorized

Docker Training — моя первая сборка Docker

Цель этого проекта — не научиться строить API в Голанге или что -то еще. Если хочешь… Tagged with Docker, DevOps, Tulciory.

Docker Training (6 серии деталей)

Цель этого проекта — не научиться строить API в Голанге или что -то еще. Если вы хотите узнать больше о фрагменте ниже, не стесняйтесь копаться через Идти Док . Теперь давайте создадим файлы и начнем.

Чтобы начать, нам нужно создать проект для хранения нашего приложения, с которым мы будем работать. Создайте следующую структуру. Мы будем продолжать заполнять больше, пока мы пойдем позже.

DockerTraining/
    go-rest-api/
        main.go
    dockerfile      

Инициализировать папку как проект GO

$ GO111MODULE=on go mod init helloFromIntegratnIO

Добавить следующий код в main.go

package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func helloFromIntegratnIO(w http.ResponseWriter, r *http.Request) {
    message := "Hello From Integratn.IO"
    if m := os.Getenv("MESSAGE"); m != "" {
        message = m
    }
    fmt.Fprintf(w, "%s\n", message)
    fmt.Println("Endpoint Hit: helloFromIntegratnIO")
}

func handleRequests() {
    http.HandleFunc("/", helloFromIntegratnIO)
    log.Fatal(http.ListenAndServe(":10000", nil))
}

func main() {
    fmt.Println("Starting Web Server")
    fmt.Println("Preparing to handle requests")
    fmt.Println("Ready for requests")
    handleRequests()
}

Там не так много. Мы создаем авторитет ответов, который печатает немного текста, когда вы попадаете в приложение на порту 10000.

Давайте заполним наш Dockerfile.

FROM golang:alpine
# Keep older versions of Go behaving the same as the latest
ENV GO111MODULE=on \
    CGO_ENABLED=1
# Install git.
# Git is required for fetching the dependencies.
RUN apk update && apk add --no-cache git
WORKDIR $GOPATH/src/integratnio/go-rest-api/
COPY go-rest-api .
# Fetch dependencies.
# Using go get.
RUN go get -d -v
# Build the binary.
RUN go build -o /go/bin/hello
ENTRYPOINT ["/go/bin/hello"]

Выглядит знакомо, верно?

Давайте пройдемся через это еще раз. Мы объявили наше базовое изображение с От инструкция Тогда мы используем Запустить инструкция по установке git. Используется Workdir Чтобы изменить путь, над которым мы работаем. Скопировано в нашем коде с Копия инструкция Использовал БЕЖАТЬ Снова командуйте, чтобы получить любые возможные зависимости, которые были необходимы для нашей программы. Еще одно последнее использование Запустить Чтобы построить наше приложение в исполняемый файл. Тогда наконец мы объявили наш Intrypoint с последней инструкцией, указывающей на то, где находится наше приложение.

Теперь мы готовы, наконец, пройти через сборку. Давайте выпустим нашу первую команду Docker.

Запустить $ Docker Build. -t Hellofromintegratnio

Давайте посмотрим на вывод.

✭ ᐅ docker build . -t helloFromIntegratnIO
Sending build context to Docker daemon  84.48kB
Step 1/7 : FROM golang:alpine
alpine: Pulling from library/golang
596ba82af5aa: Pull complete 
344f2904b0c6: Pull complete 
d3bda26d9fa1: Pull complete 
24e1a14bb4a2: Pull complete 
f0b175b107d5: Pull complete 
Digest: sha256:07ec52ea1063aa6ca02034af5805aaae77d3d4144cced4e95f09d62a6d8ddf0a
Status: Downloaded newer image for golang:alpine
 ---> 6af5835b113c
Step 2/7 : RUN apk update && apk add --no-cache git
 ---> Running in db684e4aab79
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
v3.13.0-114-g822507f819 [https://dl-cdn.alpinelinux.org/alpine/v3.13/main]
v3.13.0-115-g41ee0c8f55 [https://dl-cdn.alpinelinux.org/alpine/v3.13/community]
OK: 13880 distinct packages available
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/6) Installing brotli-libs (1.0.9-r3)
(2/6) Installing nghttp2-libs (1.42.0-r1)
(3/6) Installing libcurl (7.74.0-r0)
(4/6) Installing expat (2.2.10-r1)
(5/6) Installing pcre2 (10.36-r0)
(6/6) Installing git (2.30.0-r0)
Executing busybox-1.32.1-r0.trigger
OK: 19 MiB in 21 packages
Removing intermediate container db684e4aab79
 ---> 80212a0a3d3b
Step 3/7 : WORKDIR $GOPATH/src/mypackage/myapp/
 ---> Running in 60c0c79d0d5c
Removing intermediate container 60c0c79d0d5c
 ---> 29ab2f51aa11
Step 4/7 : COPY go-rest-api .
 ---> 7ded2d7874e0
Step 5/7 : RUN go get -d -v
 ---> Running in da6e8b285779
Removing intermediate container da6e8b285779
 ---> f7eb2d97bd6f
Step 6/7 : RUN go build -o /go/bin/hello
 ---> Running in 0e503ced7243
Removing intermediate container 0e503ced7243
 ---> 21bbd2acaf3c
Step 7/7 : ENTRYPOINT ["/go/bin/hello"]
 ---> Running in 42165a2c670f
Removing intermediate container 42165a2c670f
 ---> 86fd2d2eb271
Successfully built 86fd2d2eb271
Successfully tagged helloFromIntegratnIO:latest

Так что здесь происходит?

Шаг 1/7: наш От Инструкция потребляется, и мы видим, что она получает все слои, необходимые для создания нашего базового изображения.

Шаг 2/7: Запустить выполняет, и есть несколько нормальных Apt вывод, пока он устанавливает GIT и необходимые зависимости.

Шаг 3/7: мы видим Workdir Установите наш новый путь, в котором мы работаем.

Шаг 4/7: Копия Втягивает наш исходный код в изображение.

Шаг 5/7: Запустить использует исполняемый файл GO для получения зависимостей для нашего приложения. Что -то, чтобы заметить здесь. Мы никогда не устанавливались локально. Все это работает в контейнере сборки. Пока базовое изображение, с которого вы работаете, имеет двоичный, который вам нужен, или вы добавляете его в контейнер, как. Вы можете запустить все, что вам нужно в контейнере, не беспокоясь о чем -то локально на вашей машине.

Шаг 6/7 Запустить Использует исполняемый файл GO для создания приложения.

Шаг 7/7 Intrypoint объявляет, что начать с контейнера.

Изображение построено. Но куда это ушло? Давайте используем Docker Image LS найти Это

ᐅ docker image ls
REPOSITORY          TAG       IMAGE ID            CREATED             SIZE
helloFromIntegratnIO    latest    dee090a053a3        About an hour ago   321MB

Вот как этот вывод разрушается:

Репозиторий: Имя, которое мы дали наше изображение.

Тег: Последний всегда самая недавно созданная версия изображения.

Идентификатор изображения: это уникальный хэш, который идентифицирует наше изображение

Создано: как давно Изображение было создано

РАЗМЕР: Размер нашего изображения.

Давайте возьмем быструю секунду и поговорим о тегах. Теги важны. Это отличный способ ссылаться на то, какую версию нашего изображения работает. Они помогают нам быть декларативными в том, что мы работаем в любой среде. Итак, давайте создадим приложение с фактическим тегом вместо последнего.

ᐅ docker build . -t helloFromIntegratnIO:dev
Sending build context to Docker daemon  100.9kB
Step 1/7 : FROM golang:alpine
 ---> 6af5835b113c
Step 2/7 : RUN apk update && apk add --no-cache git
 ---> Using cache
 ---> 80212a0a3d3b
Step 3/7 : WORKDIR $GOPATH/src/integratnio/go-rest-api/
 ---> Using cache
 ---> 75eb0766eb86
Step 4/7 : COPY go-rest-api .
 ---> Using cache
 ---> 9ea13e96b401
Step 5/7 : RUN go get -d -v
 ---> Using cache
 ---> cf8a5cf85856
Step 6/7 : RUN go build -o /go/bin/hello
 ---> Using cache
 ---> e4e107828679
Step 7/7 : ENTRYPOINT ["/go/bin/hello"]
 ---> Using cache
 ---> dee090a053a3
Successfully built dee090a053a3
Successfully tagged helloFromIntegratnIO:dev

Подожди секунду. Этот вывод выглядит по -разному. Что случилось?

Вот одно из преимуществ Docker. Ваш кэш Docker поддерживает историю ваших изображений и слоев, используемых для создания этих изображений. Если ваш DockerFile и ваш код не изменились, он будет использовать кэшированное изображение для создания этого уровня. Поскольку все, что мы делали, это повторно преодолели изображение, он только что потреблял кэш вниз.

Давайте снова посмотрим на наши изображения.

/Volumes/CaseSensitive/docker-training (main ✘)✹ ᐅ docker image ls                              
REPOSITORY            TAG        IMAGE ID            CREATED             SIZE
helloFromIntegratnIO  dev        dee090a053a3        About an hour ago   321MB
helloFromIntegratnIO  latest     dee090a053a3        About an hour ago   321MB
                     86fd2d2eb271        About an hour ago   321MB

Итак, у нас есть девчонка тег, которую мы только что создали. Но давайте посмотрим на Идентификатор изображения Анкет Dev ярлык и Последний тег имеет одинаковое Идентификатор изображения . Это то, что мы хотим, потому что это самое недавно созданное изображение.

Так что это такое изображение? Если вы прокрутите вверх. Вы увидите, что Идентификатор изображения соответствует Идентификатор изображения от нашей первой сборки. Это показывает вам, что происходит, когда вы не помечаете свои изображения. Если вы создали другое изображение, используя Dev ярлык. То же самое произойдет с этим изображением. Но это локальное тестирование, а не выпуск производства. Так что нет большого значения.

Docker Training (6 серии деталей)

Оригинал: «https://dev.to/jamesatintegratnio/docker-training-2-my-first-docker-build-3d6d»