Heim  >  Artikel  >  Backend-Entwicklung  >  Praktischer Docker für Anfänger Golang Dev

Praktischer Docker für Anfänger Golang Dev

Susan Sarandon
Susan SarandonOriginal
2024-11-04 05:36:29862Durchsuche

Inhaltsverzeichnis

  1. Übersicht
  2. Voraussetzung
  3. Docker-Datei
  4. Docker Compose
    • Nginx
    • MySQL
    • Migrieren
    • API
    • Benutzerdefiniert
  5. Referenzen

Überblick

In diesem Artikel wird nicht erklärt, wie Docker im Grunde funktioniert. Stattdessen wird in diesem Artikel der Zweck jedes Codes erläutert, der in die Docker-Datei und die Datei docker-compose.yml geschrieben wurde, damit wir unsere Docker-Konfiguration für andere Projekte schreiben können.

Voraussetzung

Wir benötigen zum Beispiel ein Projekt mit Dockerfile und Docker-Compose, hier würden wir als Beispiel das Golang-Projekt namens Ecom verwenden. Um Dockerfile verwenden zu können, müssen Sie die lokale Datenbank wie in der README-Datei beschrieben einrichten.


Docker-Datei

Docker-Datei, die zum Erstellen eines Container-Images verwendet wird.(6)

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
  • VON golang:1.23.0 In der Build-Phase ist dies ein Image für unsere App. Es ist ähnlich, als würden wir die Go-Engine auf unsere Maschine herunterladen. Docker benötigt ein spezifisches Image, um unseren Code auszuführen.(1)(2)

  • WORKDIR /app Dies ist das Arbeitsverzeichnis, in dem unser Code unter /app ausgeführt werden soll.

  • KOPIEREN Sie go.mod go.sum ./. Dieser Code kopiert die Dateien go.mod und go.sum vom lokalen Computer in das Verzeichnis ./ auf Docker.

  • RUN go mod download Dies führt den Befehl go mod download auf Docker aus

  • KOPIEREN . . Dieser Code kopiert alle Datei- und Ordnerprojekte vom lokalen Computer nach Docker.

  • RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go Dieser Code führt den Befehl zum Erstellen der Golang-App unter Linux im Ordner /api auf Docker aus.

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
  • VON Grund auf als Build-Release-Stadium, um minimale Bilder zu erstellen, die nur genau das enthalten, was eine Anwendung benötigt.

  • WORKDIR / wir verwenden root / als Arbeitsverzeichnis.

  • COPY --from=build-stage /api /api Dadurch wird das Verzeichnis /api von der Image-Build-Phase nach /api auf dem Build-Release-Stage-Image kopiert.

  • EXPOSE 8080 Dadurch wird Port 8080 verfügbar gemacht, sodass wir mit Port 8080 außerhalb von Docker auf die API zugreifen können.

  • ENTRYPOINT [ "/api" ] Dadurch wird die standardmäßige ausführbare Datei unter /api festgelegt

Probieren wir unsere Docker-Datei aus.

sudo docker build .

Docker Build, um unser Projekt in ein Image zu integrieren. Sie können die Tags -t project-ecom hinzufügen, um die von Ihnen erstellten Bilder leichter zu identifizieren.(3)

Hands On Docker For Beginners Golang Dev

Sie können die Bilderliste mit dem Befehl sudo docker image ls

überprüfen

Hands On Docker For Beginners Golang Dev

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go

Dann führen Sie unser Docker-Image aus
--rm, um den Container zu entfernen, wenn er angehalten wird
--network host zum Verbinden der Docker-App mit der Localhost-Maschine (4),(5)
--env-file .env, um über die .env-Datei auf den Umgebungswert zuzugreifen
98bc0128576e Docker-Image-ID

Hands On Docker For Beginners Golang Dev

Herzlichen Glückwunsch

Sie können jetzt testen, ob Sie die API mit Postman oder anderen Apps nutzen möchten.

Hands On Docker For Beginners Golang Dev


Docker Compose

Docker Compose wurde verwendet, um mehrere Containerdienste zu erstellen und in Docker auszuführen. In diesem Projekt docker-compose.yml gibt es 4 Dienste, die wir erklären werden.

Nginx-Proxy

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
  • nginx: Dies ist der Dienstname
  • Bild: nginxproxy/nginx-proxy:1.6 Dies ist das Bild, das wir verwenden werden, ähnlich wie FROM bei Dockerfile.
  • Netzwerke: Dies ist das Netzwerk innerhalb von Docker, das der Dienst verwenden wird.
  • Ports: Hiermit legen Sie den Port für den Dienst fest, der verwendet. : , 80 ist der Standardport für HTTP
  • Volumes: Dies ist ein persistentes Volume zum Speichern von Daten für diesen Dienst, : :ro (schreibgeschützt).
  • Umgebung: Hiermit wird eine Umgebungsvariable verwendet.(8)

MySQL

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
  • db: Dies ist der Dienstname
  • image: mysql:8.0 Dieser Dienst verwendet Image mysql Version 8.0
  • Netzwerke: Dieser Dienst verwendet ein benutzerdefiniertes Netzwerk mit dem Namen „New“ und dann das neue Netzwerk mithilfe der Aliasnamen-Datenbank
  • Gesundheitscheck: Hiermit wird der Dienstbetrieb durch Ausführen eines Tests überprüft. Test: mysqladmin ping -h Datenbank -u ${DB_USER} --password=${DB_PASSWORD} Dieser Test pingt eine MySQL-Datenbank.
  • Volumes: Hiermit werden persistente Daten innerhalb des Volumes gespeichert.
  • Ports: Dies ist der Port, den der Dienst verwenden wird. In diesem Dienst verwenden wir 3308 als Port für die lokale Maschine, da Port 3306 bereits für MySQL auf unserer lokalen Maschine verwendet wird.
  • Umgebung: Hiermit wird eine Umgebungsvariable verwendet. In diesem MySQL-Dienst benötigen wir ein Root-Passwort und einen Datenbanknamen.(7)

Wandern

sudo docker build .
  • migrate-up: Dies ist der Dienstname
  • Bild: Diesen Dienst migrieren/migrieren, Bild migrieren
  • verwenden
  • Netzwerke: Dieser Dienst nutzt das Netzwerk neu, genauso wie der DB-Dienst
  • Volumes: Die Migrationsdaten von lokal ./cmd/migrate/migrations wurden in das Serviceverzeichnis /migrations kopiert
  • Befehl: Hiermit wird ein Befehl für diesen Dienst ausgeführt, ["-path", "/migrations", "-database", "${CONNECT_DB}", "-verbose", "up"] Dieser Befehl ähnelt migrate -path /migrations -database mysql://root:some-secret-password@tcp(database:3306)/ecom -verbose up. (9)
  • Links: Dies dient zum Verknüpfen des Dienstes mit einem anderen Dienst, dieser Migrationsdienst ist mit dem Datenbankdienst verknüpft
  • depend_on: Dies sorgt dafür, dass dieser Dienst nach einer bestimmten Bedingung ausgeführt wird, db: Bedingung: service_healthy. Dieser mittlere Migrationsdienst wird ausgeführt, wenn der DB-Diensttest das Ergebnis service_healthy erhält.

API

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go
  • API: Dies ist der Dienstname
  • Netzwerke: Dies ist das Netzwerk für diesen Dienst. Dieser Dienst verwendet das neue Netzwerk, damit er eine Verbindung zur Dienstdatenbank herstellen kann. Außerdem wird eine Verbindung zum standardmäßigen Netzwerk hergestellt, das vom Dienst Nginx verwendet wird.
  • Build: Hiermit wird der Dienst erstellt, dieser Dienst verwendet Dockerfile.
  • Neustart: Dieser Dienst wird bei jedem Dienstausfall neu gestartet
  • Volumes: Dies sind persistente Daten, die auf dem Volume /go/src/api.
  • gespeichert sind
  • ports: Port für diesen Dienst.
  • Umwelt: Umweltwert, den dieser Dienst benötigt.
  • Links: Dieser Dienst ist mit dem DB-Dienst verknüpft, da er die MySQL-Datenbank nutzen muss.
  • hängt davon ab: Dieser Dienst wird unter mehreren Bedingungen ausgeführt, wenn die Migration erfolgt: bereits service_completed_successfully, wenn das DB-Testergebnis service_healthy ist und wenn nginx service_started ist

Brauch

# Deploy application binary into a lean image
FROM scratch AS build-realease-stage
    WORKDIR /

    COPY --from=build-stage /api /api

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
  • Volumes: Dieses erstellte benutzerdefinierte Volume mit dem Namen db_data:
  • Netzwerke: Dadurch wurden benutzerdefinierte Netzwerke mit dem Namen „Neu“ erstellt

Probieren wir unser Docker Compose aus

sudo docker build .

Dieser Befehl erstellt Bilder für jeden Dienst und führt jeden Container aus.

Hands On Docker For Beginners Golang Dev


sudo docker run --rm --network host --env-file .env 98bc0128576e

Sie können den Container überprüfen, den unser docker-compose.yml erstellt hat.

Hands On Docker For Beginners Golang Dev


  nginx:
    image: nginxproxy/nginx-proxy:1.6
    networks:
      - default
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      HTTPS_METHOD: nohttps

Sie können überprüfen, wie viel unser docker-compose.yml erstellt hat.

Hands On Docker For Beginners Golang Dev


  db:
    image: mysql:8.0
    networks:
      new:
        aliases:
          - database
    healthcheck:
      test: mysqladmin ping -h database -u ${DB_USER} --password=${DB_PASSWORD}
    volumes:
      - db_data:/var/lib/mysql
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}

Sie können Bilder überprüfen, die unser docker-compose.yml erstellt hat.

Hands On Docker For Beginners Golang Dev


Herzlichen Glückwunsch

Sie können die Consume API aus unserem Projekt basierend auf der Dokumentation in README mit Postman oder anderen Apps testen.

Wenn Sie fertig sind, können Sie den Behälter mit
stoppen

  migrate-up:
    image: migrate/migrate
    networks:
      - new
    volumes:
      - ./cmd/migrate/migrations:/migrations
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    command: ["-path", "/migrations", "-database", "${CONNECT_DB}", "-verbose", "up"]
    links:
      - db
    depends_on:
      db:
        condition: service_healthy

Hands On Docker For Beginners Golang Dev

Oder wenn Sie alle Containerdienste in Docker Compose löschen möchten, können Sie Folgendes ausführen:

# Build application from source
FROM golang:1.23.0 AS build-stage
    WORKDIR /app

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

    COPY . .

    RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go

Hands On Docker For Beginners Golang Dev


Referenzen

(1)Dockerfile-Referenz
(2)Docker-Basisbild
(3)Docker Build
(4)Docker-Netzwerk-Tutorials
(5)Docker-Netzwerktreiber
(6)Schreiben einer Docker-Datei
(7)Docker Hub Mysql
(8)Nginx-Proxy-Dokumente
(9)Golang-Migration

Das obige ist der detaillierte Inhalt vonPraktischer Docker für Anfänger Golang Dev. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn