使用Docker镜像构建Go应用的实现方法

使用Docker镜像构建Go应用是目前比较流行的一种构建和部署应用的方式。下面,我将详细讲解如何使用Docker镜像构建Go应用的实现方法,包括两条示例说明。

1. 环境准备

在进行Docker镜像构建之前,需要进行以下环境准备:

  1. 安装Docker:Docker可以在官网上下载并安装(https://www.docker.com/get-started)。
  2. 安装Go:Go可以在官网上下载并安装(https://golang.org/dl/)。

2. 创建Go应用

首先,需要创建一个简单的Go应用,例如一个“Hello World”程序。在本例中,创建一个名为main.go的文件,内容如下:

package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}

3. 创建Dockerfile

接下来,需要创建一个Dockerfile文件,用于构建Docker镜像。在本例中,创建一个名为Dockerfile的文件,内容如下:

# 使用官方的 Golang 镜像作为构建环境
FROM golang:alpine AS builder

# 设置工作目录
WORKDIR /app

# 将代码加入镜像中
COPY . .

# 构建二进制文件
RUN GOOS=linux GOARCH=amd64 go build -o main main.go

# 使用最小化的 alpine 镜像作为运行环境
FROM alpine:latest

# 设置工作目录
WORKDIR /app

# 从之前构建的镜像中将二进制文件复制到 alpine 镜像中
COPY --from=builder /app/main .

# 运行二进制文件
CMD ["./main"]

以上Dockerfile包含了两个部分。第一部分以golang:alpine镜像为基础创建一个builder,设置工作目录,将代码加入镜像中,然后构建二进制文件。第二部分以alpine:latest镜像为基础创建一个新的镜像,将之前构建的二进制文件从builder镜像中复制到新的镜像中,并设置工作目录和运行二进制文件。

4. 构建Docker镜像

在Dockerfile和Go程序创建完成后,进入Dockerfile所在目录,执行以下命令来构建Docker镜像:

docker build -t my-go-application .

其中,my-go-application是镜像的名称,.表示Dockerfile所在的当前目录。

5. 运行Docker镜像

构建Docker镜像完成后,可以使用以下命令来运行该镜像:

docker run -it --rm my-go-application

其中,-it参数表示以交互模式和终端模式运行容器,--rm参数表示容器停止后自动删除。

6. 示例1:使用Docker Compose构建多容器Go应用

在本示例中,将创建一个包含多个容器的Docker Compose项目,其中包括Go应用、MySQL数据库和phpMyAdmin数据库管理工具。

6.1 创建一个新的Go应用

首先,创建一个名为main.go的文件,内容如下:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "net/http"
    "os"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "root:password@tcp(db:3306)/testdb")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello World!")
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

以上Go应用连接到一个名为testdb的MySQL数据库,并在/路径下返回Hello World!字符串。

6.2 创建Docker Compose文件

接下来,创建一个名为docker-compose.yml的文件,内容如下:

version: "3.9"

services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db

  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: testdb

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "8081:80"

以上Docker Compose文件定义了三个服务:

  1. app服务:使用Dockerfile构建Go应用,并将容器内的8080端口映射到主机的8080端口。
  2. db服务:使用MySQL官方镜像创建一个MySQL数据库容器,并设置数据库的root密码为password,创建一个名为testdb的数据库。
  3. phpmyadmin服务:使用phpMyAdmin官方镜像创建一个PHPMyAdmin容器,连接到db服务之上,并将容器内的80端口映射到主机的8081端口。

6.3 运行Docker Compose

在Docker Compose文件所在目录下,使用以下命令来启动所有的容器:

docker-compose up

运行完上述命令后,访问http://localhost:8080http://localhost:8081可以分别查看Go应用和phpMyAdmin数据库管理工具。

6.4 停止Docker Compose

使用以下命令来停止Docker Compose:

docker-compose down

7. 示例2:使用Docker Swarm构建Go应用

在本示例中,将创建一个包含多个服务的Docker Swarm集群,其中包括Go应用和MongoDB数据库。

7.1 创建一个新的Go应用

首先,创建一个名为main.go的文件,内容如下:

package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://mongo:27017"))
    if err != nil {
        log.Fatal(err)
    }

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        collection := client.Database("testdb").Collection("test")
        result, err := collection.InsertOne(context.Background(), map[string]string{"name": "John"})
        if err != nil {
            log.Fatal(err)
        }
        fmt.Fprintf(w, "Inserted document with ID %v\n", result.InsertedID)
    })

    log.Fatal(http.ListenAndServe(":8080", nil))
}

以上Go应用连接到一个名为testdb的MongoDB数据库,并在/路径下向test集合插入一个名为John的文档。

7.2 创建Docker Compose文件

接下来,创建一个名为docker-compose.yml的文件,内容如下:

version: "3.9"

services:
  app:
    image: go-app
    deploy:
      replicas: 4
    ports:
      - "8080:8080"
    environment:
      MONGODB_URI: mongodb://mongo:27017
    networks:
      - webnet

  mongo:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: password
    networks:
      - webnet

networks:
  webnet:

以上Docker Compose文件定义了两个服务:

  1. app服务:使用Docker镜像构建Go应用,并在Docker Swarm集群中启动4个实例,将容器内的8080端口映射到主机的8080端口,并将MongoDB的URI设置为环境变量。
  2. mongo服务:使用MongoDB官方镜像创建一个MongoDB数据库容器,并设置数据库的root用户名和密码。

7.3 创建Docker Swarm集群

在执行以下命令之前,需要确保已经初始化Docker Swarm集群:

docker swarm init

7.4 构建和发布Docker镜像

首先,使用以下命令将Go应用构建成Docker镜像,并将其上传至Docker Hub:

docker build -t my-go-app .
docker tag my-go-app:latest my-dockerhub-account/my-go-app:latest
docker push my-dockerhub-account/my-go-app:latest

其中,my-dockerhub-account为Docker Hub账户名。

7.5 部署Docker服务

接着,使用以下命令创建一个名为webnet的覆盖网络,并启动appmongo服务:

docker network create --driver overlay webnet
docker stack deploy -c docker-compose.yml my-application

其中,my-application为服务的名称。

7.6 检查服务状态

使用以下命令检查已经启动的服务状态:

docker stack ps my-application

如果一切正常,则应该可以看到在Docker Swarm集群中启动了4个Go服务实例。当访问http://localhost:8080时,可以看到Go应用向MongoDB数据库中插入一个文档。

7.7 清除服务

使用以下命令清除所有服务:

docker stack rm my-application
docker network rm webnet

总结

本文分别介绍了使用Docker镜像构建Go应用的基本步骤、使用Docker Compose构建多容器Go应用的示例,以及使用Docker Swarm构建Go应用的示例。使用Docker镜像构建Go应用可以使得应用打包、部署和迁移更加方便、快速和高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Docker镜像构建Go应用的实现方法 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 浅谈Windows平台上Docker安装与使用

    那我来给您详细讲解一下 “浅谈Windows平台上Docker安装与使用” 的完整攻略,并且包含两个示例说明。 安装Docker 首先,我们需要去Docker官网下载适用于Windows平台的Docker Desktop 软件并进行安装。在安装过程中需要注意选择启用 “WSL 2 on Windows 10 Home” 或 “Docker Desktop f…

    Docker 2023年5月15日
    00
  • Docker如何挂载mysql

    下面是Docker如何挂载mysql的完整攻略,包含两个示例说明的过程: 1. 准备MySQL配置文件 Docker需要通过挂载MySQL的配置文件来启动数据库服务,因此在开始挂载之前,需要先准备好MySQL的配置文件。我们可以在本地创建一个my.cnf文件,然后将其挂载到Docker容器内部。 以下是示例的MySQL配置文件my.cnf: [client]…

    Docker 2023年5月16日
    00
  • 09–Docker 安装tomcat9

    1.在hub.docker.com中获取tomcat拉取地址   docker pull tomcat:9.0.41-jdk8-corretto    2.查看Dockerfile   中WORKDIR 为/user/local/tomcat,CATALINA_HOME为/user/local/tomcat    注:查看CATALINA_HOME主要是为了…

    Docker 2023年4月12日
    00
  • 基于docker的 Hyperledger Fabric 多机环境搭建(上)

    环境:ubuntu 16.04 Docker  17.04.0-ce go 1.7.4 consoul v0.8.0.4   ======================================================================= 一、项目准备 想必能搜到这篇文章的人对Hyperledger Fabric(以下简称Fab…

    Docker 2023年4月16日
    00
  • Docker存储驱动之OverlayFS简介

      OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性:   1) 更简单地设计;   2) 从3.18开始,就进入了Linux内核主线;   3) 可能更快一些。  因此,OverlayFS在Docker社区关注度提高很快,被很多人认为是AUFS的继承者。就像宣称的一样,OverlayFS还很年轻。所以,在生成…

    Docker 2023年4月11日
    00
  • docker 学习之一 装MySQL 供远程使用 Linux

    docker MySQL Linux 远程连接 服务提供 因为Linux发行版本的问题折腾了好久,尽量使用LTS的版本。其他版本有时候缺的东西太多了,对新手相当不友好。 大概花了几天实在没招了,下了个LTS的版本,再装时正常了。按照官方文档都可以搞定了。 使用这个版本的ubuntu-22.04.2-desktop-amd64.iso的,官网上下的,用虚拟机弄…

    2023年4月9日
    00
  • Docker介绍下载安装、制作镜像及容器、做目录映射、做端口映射

    在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。在实际的生…

    Docker 2023年4月13日
    00
  • Spring Boot工程发布到Docker

    先聊聊闲话 搞过企业级的application运维的同仁肯定深有感触,每个application的功能交叉错杂,数据交换就让人焦头烂额(当然这和顶层业务设计有关系), 几十个application发布,代码修改,打包,发布,再上dev/staging/prod三个代码版本,时刻要保证他们三个的环境依赖一致,比如jdk,webserver,appserver,…

    Docker 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部