首頁 >後端開發 >Golang >初學者的 Docker 實踐 Golang Dev

初學者的 Docker 實踐 Golang Dev

Susan Sarandon
Susan Sarandon原創
2024-11-04 05:36:29922瀏覽

目錄

  1. 概述
  2. 先決條件
  3. Dockerfile
  4. Docker 組合
    • Nginx
    • Mysql
    • 遷移
    • API
    • 自訂
  5. 參考文獻

概述

本文不會解釋 Docker 是如何在背景工作的,相反,本文將解釋 Dockerfile 和 docker-compose.yml 檔案中編寫的每個程式碼的用途,以便我們可以為其他專案編寫 Docker 配置。

先決條件

例如,我們需要一些帶有 Dockerfile 和 docker-compose 的項目,這裡我們將使用名為 Ecom 的 Golang 項目作為範例。若要使用 Dockerfile,您需要按照 README 中的說明設定本機資料庫。


Dockerfile

用於建立容器映像的Dockerfile。 (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
  • FROM golang:1.23.0 AS 建置階段,這是我們應用程式的鏡像,它類似於我們將 Go 引擎下載到我們的機器上,Docker 需要特定的映像來執行我們的程式碼。 (1)(2)

  • WORKDIR /app 這是我們希望程式碼在 /app 執行的工作目錄。

  • COPY go.mod go.sum ./ 此程式碼會將 go.mod 和 go.sum 檔案從本機複製到 Docker 上的 ./ 目錄。

  • RUN go mod download 這將在 Docker 上執行指令 go mod download

  • 複製。 。此程式碼會將所有檔案和資料夾專案從本機電腦複製到 Docker。

  • RUN CGO_ENABLED=0 GOOS=linux go build -o /api ./cmd/main.go 此程式碼將執行指令在 Linux 作業系統上建置 Golang 應用程式到 Docker 上的 /api 資料夾。

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

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

    EXPOSE 8080

    ENTRYPOINT [ "/api" ]
  • 從頭開始,作為建置-發布-階段從頭開始,用於建立僅包含應用程式所需內容的最小映像。

  • WORKDIR / 我們將使用 root / 作為工作目錄。

  • COPY --from=build-stage /api /api 這會將目錄 /api 從鏡像建置階段複製到 build-realease-stage 鏡像上的 /api。

  • EXPOSE 8080 這將公開連接埠 8080,以便我們可以在 Docker 外部使用連接埠 8080 存取 API。

  • ENTRYPOINT [ "/api" ] 這將在 /api 設定預設執行檔

讓我們試試我們的 Dockerfile。

sudo docker build .

docker build 將我們的專案建置成映像。您可以新增標籤 -t project-ecom 來更輕鬆地識別您建立的鏡像。 (3)

Hands On Docker For Beginners Golang Dev

您可以使用指令 sudo docker image ls 查看映像列表

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

然後執行我們的 Docker 映像
--rm 停止時移除容器
--網路主機將 docker 應用程式連接到本機 (4),(5)
--env-file .env 透過 .env 檔案存取環境值
98bc0128576e docker 映像 ID

Hands On Docker For Beginners Golang Dev

恭喜

您現在可以測試使用 Postman 或其他應用程式使用 API。

Hands On Docker For Beginners Golang Dev


Docker 組合

Docker Compose 用於製作多個容器服務並在 Docker 內運作。在這個專案 docker-compose.yml 中,我們將解釋 4 個服務。

Nginx 代理

# 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:這是服務名稱
  • image: nginxproxy/nginx-proxy:1.6 這是我們將要使用的映像,類似於 Dockerfile 中的 FROM。
  • 網路:這是服務將使用的 Docker 內部網路。
  • ports: 這是設定服務使用的連接埠 : , 80 是 HTTP 預設連接埠
  • Volume:這是儲存該服務資料的持久性卷, : ; :ro(唯讀)。
  • 環境:這是使用環境變數。 (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:這是服務名稱
  • image: mysql:8.0 此服務使用 Image mysql 版本 8.0
  • 網路:此服務使用名為 new 的自訂網絡,然後使用別名資料庫的新網絡
  • healthcheck:這是透過執行測試來檢查服務運行情況,測試:mysqladmin ping -h database -u ${DB_USER} --password=${DB_PASSWORD} 此測試 ping mysql 資料庫。
  • Volume:這是在磁碟區內儲存持久性資料。
  • ports:這是服務將使用的端口,在此服務中我們使用 3308 作為本地計算機端口,因為端口 3306 已用於我們本地計算機上的 mysql。
  • 環境:這是使用環境變量,在這個mysql服務中我們需要root密碼和資料庫名稱。 (7)

遷移

sudo docker build .
  • migrate-up:這是服務名稱
  • image: 遷移/遷移此服務使用 migrate Image
  • 網路:此服務使用與資料庫服務相同的新網路
  • 卷:本地 ./cmd/migrate/migrations 中的遷移資料已複製到服務目錄 /migrations
  • 命令:這是在此服務上執行命令,["-path", "/migrations", "-database", "${CONNECT_DB}", "-verbose", "up"] 此指令類似 migrate -path /migrations -database mysql://root:some-secret-password@tcp(database:3306)/ecom -verbose up. (9)
  • links:將服務連結到另一個服務,此遷移服務連結到資料庫服務
  • depends_on:這使得此服務在特定條件後執行,db:condition:service_healthy這意味著當db服務測試得到結果service_healthy時,將執行遷移服務。

應用程式介面

# 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:這是服務名稱
  • 網路:這是該服務的網絡,該服務使用新的網絡,因此它可以連接到服務資料庫,也可以連接到服務nginx使用的預設網路。
  • build:這是使用 Dockerfile 建置服務。
  • restart:每當服務出現故障時,該服務將重新啟動
  • Volume:這是儲存在磁碟區 /go/src/api 上的持久性資料。
  • ports:此服務的連接埠。
  • 環境:此服務所需的環境值。
  • links: 這個服務連結到 db 服務,因為它需要使用 mysql 資料庫。
  • depends_on:此服務將在幾個條件下執行,當migrate-up時:已經service_completed_successively時,當db測試結果為service_healthy時,以及當nginx service_started時

風俗

# 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_data 的自訂磁碟區:
  • 網路:這創建了一個名為 new 的自訂網絡

讓我們試試看 Docker Compose

sudo docker build .

此指令將為每個服務建立映像並執行每個容器。

Hands On Docker For Beginners Golang Dev


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

您可以查看我們的 docker-compose.yml 建立的容器。

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

您可以檢查我們建立的 docker-compose.yml 的容量。

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}

您可以查看我們的 docker-compose.yml 所建立的映像。

Hands On Docker For Beginners Golang Dev


恭喜

您可以根據 README 上的文件使用 Postman 或其他應用程式測試我們專案中的 Consume API。

如果你完成了,你可以停止容器,

  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

或如果你想刪除 docker compose 內的所有容器服務,你可以運行,

# 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


參考

(1)Dockerfile參考
(2)Docker基礎映像
(3)Docker建置
(4)Docker網路教學
(5)Docker網路驅動
(6)編寫Dockerfile
(7)Docker Hub Mysql
(8)Nginx-Proxy 文檔
(9)Golang遷移

以上是初學者的 Docker 實踐 Golang Dev的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn