Как использовать команду docker init для контейнеризации приложения на Go

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь контейнеризовать приложение на Go с помощью команды docker init. Практическое занятие начинается с проверки правильной установки Docker Desktop на виртуальной машине (VM) LabEx, включая проверку версии Docker и запуск контейнера hello-world для того, чтобы убедиться, что Docker работает как ожидается.

В последующих шагах вы инициализируете проект на Go с помощью команды docker init, настроите сгенерированный Dockerfile и файл Compose специально для приложения на Go, а в конце соберете и запустите приложение на Go с использованием Docker Compose. Этот практический опыт предоставит вам навыки, необходимые для эффективного контейнеризации приложений на Go с использованием современных инструментов Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555164{{"Как использовать команду docker init для контейнеризации приложения на Go"}} docker/logs -.-> lab-555164{{"Как использовать команду docker init для контейнеризации приложения на Go"}} docker/create -.-> lab-555164{{"Как использовать команду docker init для контейнеризации приложения на Go"}} docker/pull -.-> lab-555164{{"Как использовать команду docker init для контейнеризации приложения на Go"}} docker/version -.-> lab-555164{{"Как использовать команду docker init для контейнеризации приложения на Go"}} docker/build -.-> lab-555164{{"Как использовать команду docker init для контейнеризации приложения на Go"}} end

Установка Docker Desktop и проверка Docker Init

На этом шаге мы проверим, что Docker правильно установлен на виртуальной машине (VM) LabEx. На виртуальной машине LabEx уже предустановлен Docker Engine, поэтому мы проверим версию Docker и запустим простой контейнер "hello-world", чтобы убедиться, что все работает как ожидается.

Сначала проверим версию Docker. Откройте терминал на виртуальной машине LabEx. Вы можете найти значок терминала на рабочем столе или в меню приложений.

Выполните следующую команду в терминале:

docker --version

Эта команда отобразит версию Docker, установленную на системе. Вы должны увидеть вывод, похожий на следующий:

Docker version 20.10.21, build xxxxxxx

Если вы видите версию Docker, это означает, что Docker установлен правильно. Если вы столкнулись с ошибкой, обратитесь в службу поддержки.

Далее запустим контейнер "hello-world". Это простой контейнер, который выводит сообщение в консоль и затем завершает работу.

Выполните следующую команду в терминале:

docker run hello-world

Перед выполнением команды вам нужно скачать образ hello-world с Docker Hub. Docker Hub - это публичный реестр Docker-образов.

Выполните следующую команду для скачивания образа:

docker pull hello-world

Эта команда загружает образ hello-world с Docker Hub на вашу локальную машину. Вы должны увидеть вывод, похожий на следующий:

Using default tag: latest
latest: Pulling from library/hello-world
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Теперь выполните команду docker run hello-world еще раз:

docker run hello-world

Эта команда запустит контейнер hello-world. Вы должны увидеть вывод, похожий на следующий:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Это сообщение показывает, что Docker работает правильно и вы успешно запустили свой первый контейнер!

Инициализация проекта на Go с помощью Docker Init

На этом шаге мы инициализируем новый проект на Go и используем команду docker init для генерации необходимых файлов Dockerfile и docker-compose.yml. Это станет отправной точкой для контейнеризации нашего приложения на Go.

Сначала создадим новую директорию для нашего проекта на Go. Откройте терминал на виртуальной машине LabEx и выполните следующие команды:

mkdir my-go-app
cd my-go-app

Эти команды создают новую директорию с именем my-go-app в директории ~/project, а затем изменяют текущую директорию на my-go-app.

Далее нам нужно инициализировать модуль Go. Это создаст файл go.mod, который отслеживает зависимости нашего проекта.

Выполните следующую команду в терминале:

go mod init my-go-app

Эта команда инициализирует новый модуль Go с именем my-go-app. Вы должны увидеть вывод, похожий на следующий:

go: creating new go.mod: module my-go-app
go: to add module requirements and sums:
        go mod tidy

Теперь создадим простое приложение на Go. Создайте новый файл с именем main.go в директории my-go-app с помощью редактора nano:

nano main.go

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

package main

import "fmt"

func main() {
	fmt.Println("Hello, Docker!")
}

Это простая программа на Go, которая выводит "Hello, Docker!" в консоль.

Сохраните файл и выйдите из редактора nano, нажав Ctrl+X, затем Y, а затем Enter.

Теперь мы будем использовать команду docker init для генерации файлов Dockerfile и docker-compose.yml. Однако на виртуальной машине LabEx по умолчанию не установлен Docker Compose. Мы должны установить его сначала.

Скачайте последнюю версию Docker Compose с помощью curl:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Сделайте бинарный файл Docker Compose исполняемым:

sudo chmod +x /usr/local/bin/docker-compose

Проверьте установку, проверив версию Docker Compose:

docker-compose --version

Вы должны увидеть вывод, похожий на следующий:

docker-compose version 1.29.2, build xxxxxxx

Теперь, когда Docker Compose установлен, мы можем продолжить с использованием docker init.

Выполните следующую команду в терминале:

docker init

Команда docker init задаст ряд вопросов для настройки файлов Dockerfile и docker-compose.yml. Вот рекомендуемые ответы для этого практического занятия:

  • What do you want to call this application? my-go-app
  • What port is this app listening on? 3000 (Это заполнитель, в этом простом примере мы на самом деле не будем использовать порт)
  • What is the main file to execute? main.go
  • Would you like to include the Docker Compose configuration? Yes
  • Please choose a Docker Compose version: 2.0

После ответа на эти вопросы команда docker init сгенерирует файл Dockerfile и файл docker-compose.yml в директории my-go-app.

Вы можете просмотреть содержимое сгенерированных файлов с помощью команды cat:

cat Dockerfile
cat docker-compose.yml

Эти файлы предоставляют базовую конфигурацию для сборки и запуска нашего приложения на Go в Docker-контейнере. На следующем шаге мы настроим эти файлы так, чтобы они лучше соответствовали нашим потребностям.

Настройка сгенерированных файлов Dockerfile и Compose для проекта на Go

На этом шаге мы настроим файлы Dockerfile и docker-compose.yml, сгенерированные на предыдущем шаге. Мы оптимизируем Dockerfile для сборки нашего приложения на Go и настроим файл docker-compose.yml для запуска нашего приложения.

Сначала изучим сгенерированный файл Dockerfile. Откройте файл Dockerfile в директории my-go-app с помощью редактора nano:

nano Dockerfile

Сгенерированный файл Dockerfile может выглядеть примерно так:

## syntax=docker/dockerfile:1

FROM golang:latest AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o my-go-app

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/my-go-app .

EXPOSE 3000

CMD ["./my-go-app"]

В этом Dockerfile используется многостадийная сборка. Первая стадия (builder) использует образ golang:latest для сборки приложения на Go. Вторая стадия использует образ alpine:latest для запуска приложения.

Давайте изменим Dockerfile, чтобы использовать определенную версию Go и оптимизировать процесс сборки. Замените содержимое файла Dockerfile следующим:

## syntax=docker/dockerfile:1

FROM golang:1.17 AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o my-go-app

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/my-go-app .

CMD ["./my-go-app"]

Мы изменили базовый образ для стадии сборки на golang:1.17. Это гарантирует, что мы используем определенную версию Go для сборки нашего приложения.

Сохраните файл и выйдите из редактора nano.

Теперь изучим сгенерированный файл docker-compose.yml. Откройте файл docker-compose.yml в директории my-go-app с помощью редактора nano:

nano docker-compose.yml

Сгенерированный файл docker-compose.yml может выглядеть примерно так:

version: "3.9"
services:
  my-go-app:
    build: .
    ports:
      - "3000:3000"

В этом файле docker-compose.yml определяется одна служба с именем my-go-app. Он указывает, что служба должна быть собрана из текущей директории (.) и что порт 3000 должен быть открыт.

Поскольку наше приложение на самом деле не слушает порт, мы можем удалить раздел ports. Измените файл docker-compose.yml следующим образом:

version: "3.9"
services:
  my-go-app:
    build: .

Сохраните файл и выйдите из редактора nano.

На этом шаге мы настроили файлы Dockerfile и docker-compose.yml так, чтобы они лучше соответствовали нашим потребностям. На следующем шаге мы соберем и запустим наше приложение на Go с помощью Docker Compose.

Сборка и запуск приложения на Go с помощью Docker Compose

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

Сначала перейдите в директорию my-go-app в терминале:

cd ~/project/my-go-app

Для сборки Docker-образа нашего приложения выполните следующую команду:

docker-compose build

Эта команда соберет Docker-образ на основе файла Dockerfile в текущей директории. Вы должны увидеть вывод, похожий на следующий:

Building my-go-app
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM golang:1.17 AS builder
 ---> xxxxxxxxxxxxxxxx
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 3/6 : COPY go.mod go.sum ./
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 4/6 : RUN go mod download && go mod verify
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 5/6 : COPY . .
 ---> xxxxxxxxxxxxxxxx
Step 6/6 : RUN go build -o my-go-app
 ---> Running in xxxxxxxxxx
Removing intermediate container xxxxxxxxxx
 ---> xxxxxxxxxxxxxxxx
Successfully built xxxxxxxxxxxxxxxx
Successfully tagged my-go-app_my-go-app:latest

Этот вывод показывает, что Docker-образ был успешно собран.

Теперь, чтобы запустить приложение, выполните следующую команду:

docker-compose up

Эта команда запустит контейнер, определенный в файле docker-compose.yml. Вы должны увидеть вывод, похожий на следующий:

Starting my-go-app_my-go-app_1 ... done
Attaching to my-go-app_my-go-app_1
my-go-app_1  | Hello, Docker!
my-go-app_my-go-app_1 exited with code 0

Этот вывод показывает, что наше приложение на Go было выполнено и вывело "Hello, Docker!" в консоль. Затем контейнер завершил работу с кодом 0, что указывает на успешное выполнение.

Чтобы остановить контейнер, нажмите Ctrl+C в терминале.

Вы также можете запустить контейнер в фоновом режиме, добавив флаг -d в команду docker-compose up:

docker-compose up -d

Это запустит контейнер в фоне. Чтобы просмотреть логи контейнера, выполните следующую команду:

docker logs my-go-app_my-go-app_1

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

docker-compose down

Эта команда остановит и удалит контейнер.

На этом шаге мы успешно собрали и запустили наше приложение на Go с использованием Docker Compose. Это демонстрирует, как Docker Compose может упростить процесс управления контейнеризованными приложениями.

Резюме

В этом практическом занятии мы начали с проверки успешной установки Docker Desktop на виртуальной машине LabEx. Это включало проверку версии Docker с помощью команды docker --version и подтверждение корректной установки. Затем мы извлекли образ hello-world из Docker Hub с использованием команды docker pull hello-world и запустили контейнер с помощью команды docker run hello-world, чтобы убедиться, что Docker работает должным образом и выводит подтверждающее сообщение в консоль.

Этот первый шаг создал рабочее окружение Docker, заложив основу для последующих шагов, связанных с использованием команды docker init для контейнеризации приложения на Go.