面向初学者的 Docker 实践 Golang Dev
目录
- 概述
- 先决条件
- Dockerfile
-
Docker 组合
- Nginx
- Mysql
- 迁移
- API
- 自定义
- 参考文献
概述
本文不会解释 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)
您可以使用命令 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 组合
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 .
此命令将为每个服务创建映像并运行每个容器。
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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

goisidealforbeginnersandsubableforforcloudnetworkservicesduetoitssimplicity,效率和concurrencyFeatures.1)installgromtheofficialwebsitealwebsiteandverifywith'.2)

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。
