扩展了一个Golang项目:开发人员的综合指南
#go #docker #containers #dockerhub

介绍

Docker是开发人员使用的一种流行工具,可在容器化的,隔离的环境中创建和运行应用程序。容器是独立的单元,其中包括应用程序的所有必要组件,例如代码,库和软件包。通过使用Docker,开发人员可以为其应用程序创建容器,并在不同的机器和环境中轻松共享和部署它们。这对于确保兼容性并避免与机器上其他软件发生冲突特别有用。

要说明,想象一下您有制作蛋糕的食谱。可以将Docker与包含所有组件和烹饪说明的容器进行比较无论您身在何处,都可以烤蛋糕。

总体而言,Docker使开发人员更容易创建,打包和部署其应用程序,并为运行它们提供了一个一致且可靠的环境。

虚拟化与容器化

在虚拟化中,一种称为主机的操作系统用于构建包括操作系统的真实计算机的虚拟复制品。结果,几台具有自己的操作系统和资源的虚拟计算机可以在同一物理硬件上运行。 VirtualBox和VMware是虚拟化软件的两个示例。

另一方面,容器化涉及将应用程序的依赖项捆绑到单个软件包中。容器比虚拟机更有效,因为它们轻巧,快速并共享主机操作系统内核。 Docker是一个软件容器化示例。

Virtual Machine vs Docker Container

Docker的不同组成部分:

这是对Docker不同组件的简要说明:

Docker Engine:这是Docker的核心组成部分,负责建造和运行容器。这是一个轻巧的运行时,可在主机机器上运行并管理容器。

Docker Hub:这是一个基于云的存储库,Docker用户可以在容器图像上存储,共享和协作。它提供了一个集中位置,用于查找和下载预构建的图像,以及用于发布和分发图像的平台。

docker cli:这是Docker的命令行接口,用于与Docker Engine进行交互以及管理容器,图像,网络和卷。

docker桌面:这是一个桌面应用程序,它为在Windows和MacOS上使用Docker的用户界面提供了一个桌面应用程序。它包括Docker Engine,Docker CLI和用于管理容器和图像的图形用户界面。它还包括用于使用Docker开发和部署应用程序的其他工具和服务。

必需的Docker命令

在对容器进行扩展之前,拥有基本码头命令的基本知识很有用。

  1. docker build:用于从dockerfile构建docker映像。

  2. docker run:用于从图像运行Docker容器。

  3. docker ps:用于列出所有运行的容器。

  4. docker stop:用于停止运行的容器。

  5. docker rm:用于卸下容器。

  6. docker rmi:用于删除图像。

  7. docker pull:用于从Docker注册表中摘下图像。

  8. docker push:用于将图像推到码头注册表。

  9. docker network:用于管理Docker网络。

  10. docker-compose:用于定义和运行多容器Docker应用程序。

对上述docker命令有基本的了解是有帮助的。

dockerfile和 docker-compose文件

dockerfile: dockerfile是一个文本文件,其中包含构建docker映像的说明。 Dockerfile就像一个食谱,告诉Docker如何创建应用程序的图像。它包括有关应用程序需要运行的信息。当您使用Dockerfile构建图像时,Docker会创建一个可以运行应用程序及其所有依赖项的软件包,称为Docker Image。该软件包可用于启动Docker容器。

docker-compose文件:一个称为Docker-Compose的YAML文件定义了多容器Docker应用程序。它用于指定程序的组成部分,它们的关系以及它们之间的依赖性。 Docker-Compose文件提供了一种简单的方法来组织容器部署和缩放,并使您能够以单个应用程序运行许多容器。

让我们对一个Golang项目进行停靠:

让我们从了解Dockerfile开始。

FROM golang:latest

# Set the working directory
WORKDIR /app

# Copy the go.mod and go.sum files
COPY go.mod go.sum ./

# Download all the dependencies
RUN go mod download

# Copy the rest of the project files
COPY . .

# Build the binary
RUN go build -o main .


EXPOSE 5000

# Start the application
CMD ["./main"]
  1. FROM golang:latest:此命令告诉Docker从预建的Golang环境开始以运行您的应用程序。

  2. WORKDIR /app:在应用程序将要使用的容器内设置目录。

  3. COPY go.mod go.sum ./:将项目的go.modgo.sum文件(项目的依赖项)复制到容器中。

  4. RUN go mod download:下载您项目的go.mod文件中列出的所有依赖项。

  5. COPY . .:将项目中的所有剩余文件复制到容器中。

  6. RUN go build -o main .:将您的项目的GO代码编译成名为main的二进制文件。

  7. EXPOSE 5000:您的应用程序将在端口5000上收听传入的流量。

  8. CMD ["./main"]:通过运行上一步中构建的main二进制启动应用程序。

创建Docker映像:

在终端中运行以下命令以构建图像。

docker build -t go_server .

docker命令中的-t标志用于标记具有特定名称和版本号的图像。

命令中的.(点)是指dockerfile所在的当前目录。这告诉Docker使用当前目录中的Dockerfile来构建图像。

Docker image build process

运行一个容器:

docker run -d -p 5000:5000 --name go_server go_server

docker命令中的--name标志允许我们为容器提供一个特定的名称,以便我们将来可以轻松地参考它。

-p标志用于将容器的端口5000映射到本地计算机上的端口,这使我们可以在Web浏览器中查看应用程序。这里的5000:5000表示Host_Port:Container_Port

-d标志用于以“分离”模式运行容器,这意味着容器将在后台运行,从而使我们可以使用终端执行其他任务。

现在您可以通过我们本地计算机上的5000端口访问GO项目。

该项目依赖于Redis,该项目无法使用单个Dockerfile运行。他们将必须分别设置两个应用程序,构建Docker映像并运行多个命令。此外,这些命令可能很长且复杂。为了解决这个问题,我们需要使用 docker组成,这使我们能够定义并运行多个Docker容器作为一个应用程序。通过使用Docker Compose,我们可以与Golang应用程序容器一起运行REDIS容器,以确保所有必要的服务可用于应用程序正常运行。

为了利用Docker组成,有必要了解YAML。

yaml(“ yaml ain't markup语言”的缩写)是一种文本文件格式,用于以人类可读的方式存储和传输数据。它类似于其他文件格式,例如XML或JSON,但更易于读写。它通常用于用于软件应用程序的配置文件中,包括Docker组合,以指定设置和选项。

这是 docker-compose.yaml 文件:

version: '3'

services:
  go-server:
    build: .
    environment:
      - PORT=5000
      - DOMAIN=localhost:5000
      - DB_ADDRESS=redis:6379
      - DB_PASSWORD=
      - API_QUOTA=10
    ports:
      - "5000:5000"
    depends_on:
      - redis
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - .data:/data
    environment:
      - REDIS_PASSWORD=
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 10s
      timeout: 5s
      retries: 5

以下是此特定文件中关键命令的说明:

  • version: '3':指定所使用的docker构成文件语法的版本。

  • services:定义将作为应用程序的一部分运行的不同容器。

  • build: .:指定应从当前目录(.)构建go-server容器,其中包含dockerfile。

  • environment:设置go-server容器的环境变量。

  • ports:从go-server容器映射端口5000到主机上的端口5000。

  • depends_on:指定必须在go-server容器之前启动redis容器。

  • image: redis:指定应该使用redis docker image创建redis容器。

  • volumes:将音量从主机机器安装到redis容器。

  • healthcheck:指定运行命令以检查redis容器的健康。 intervaltimeoutretries选项确定运行健康检查命令的频率和多长时间。

如果在github(例如github)上向公众访问该文件,将环境变量放入Docker-Compose文件中可能是危险的。为了防止这种情况,建议使用.env文件中的环境变量,而不是直接编写敏感数据。

做到这一点的一种方法是将所有敏感信息作为环境变量存储。在执行Docker-Compose命令时,我们可以利用--env-file参数从文件导入环境变量。

docker-compose --env-file .env up

将图像推到dockerhub

现在是时候将图像推入公共存储库,例如 dockerhub。

  1. 如果您在Dockerhub中没有帐户,请在https://hub.docker.com/上注册一个免费帐户。

  2. 使用docker login命令从命令行登录到Docker Hub。这将提示您获取Docker Hub用户名和密码。

  3. 按照图像。标签应包括您要使用的Docker Hub用户名,存储库名称以及您要使用的版本/标签。

    docker push rwiteshbera/go-server:1.0.0
    

Docker push

  1. 现在,如果您打开Dockerhub,您将看到上传的图像。

DockerHub

资源

如果您是Docker的新手,并且想了解更多信息,则有大量资源可帮助您入门。强烈推荐的两个受欢迎的YouTube教程是:

这两个教程都是结构良好的,易于遵循的,并提供实用的示例,以帮助您更好地了解Docker。

结论

我希望您现在了解Docker的必要性以及如何利用它。订阅我的新闻通讯,以获取更多这样的内容。如果您喜欢阅读本文,请考虑在社交媒体上与您的同事和朋友分享。此外,您可以在Twitter上关注我,以获取有关技术和编码的更多更新。谢谢您的阅读!