本文不会解释 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中文网其他相关文章!