本文不會解釋 Docker 是如何在背景工作的,相反,本文將解釋 Dockerfile 和 docker-compose.yml 檔案中編寫的每個程式碼的用途,以便我們可以為其他專案編寫 Docker 配置。
例如,我們需要一些帶有 Dockerfile 和 docker-compose 的項目,這裡我們將使用名為 Ecom 的 Golang 項目作為範例。若要使用 Dockerfile,您需要按照 README 中的說明設定本機資料庫。
用於建立容器映像的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)
您可以使用指令 sudo docker image ls 查看映像列表
# 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
您現在可以測試使用 Postman 或其他應用程式使用 API。
Docker Compose 用於製作多個容器服務並在 Docker 內運作。在這個專案 docker-compose.yml 中,我們將解釋 4 個服務。
# 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" ]
讓我們試試看 Docker Compose
sudo docker build .
此指令將為每個服務建立映像並執行每個容器。
sudo docker run --rm --network host --env-file .env 98bc0128576e
您可以查看我們的 docker-compose.yml 建立的容器。
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 的容量。
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 所建立的映像。
您可以根據 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
或如果你想刪除 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
(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中文網其他相關文章!