Heim >Backend-Entwicklung >Golang >Praktischer Docker für Anfänger Golang Dev
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.
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, 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)
Sie können die Bilderliste mit dem Befehl sudo docker image ls
überprüfen
# 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
Sie können jetzt testen, ob Sie die API mit Postman oder anderen Apps nutzen möchten.
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.
# 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
# Deploy application binary into a lean image FROM scratch AS build-realease-stage WORKDIR / COPY --from=build-stage /api /api EXPOSE 8080 ENTRYPOINT [ "/api" ]
sudo docker build .
# 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
# Deploy application binary into a lean image FROM scratch AS build-realease-stage WORKDIR / COPY --from=build-stage /api /api EXPOSE 8080 ENTRYPOINT [ "/api" ]
Probieren wir unser Docker Compose aus
sudo docker build .
Dieser Befehl erstellt Bilder für jeden Dienst und führt jeden Container aus.
sudo docker run --rm --network host --env-file .env 98bc0128576e
Sie können den Container überprüfen, den unser docker-compose.yml erstellt hat.
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.
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.
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
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
(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!