记录一次dockerFile编写+上传docker hub

发布于 2020-08-25 22:09:17 阅读 75

最近在学习k8s,需要上传docker image至私有仓库或者docker hub中,公司暂时没有docker仓库,所以我就上传到了docker hub。

上传docker hub必须先注册docker账号。我们直接在官网注册一下很简单,然后在本机的docker登录一下,后面上传image时会用到这个账号。

我们先创建一个go的http服务

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    router := gin.Default()
    router.GET("/ping", func(c *gin.Context) {
        c.String(http.StatusOK, "pong")
    })
    router.Run(":8080")
}

众所周知,golang只要将代码编译成平台的可执行文件,那么我们可以在没有golang的环境下直接运行这个可执行的代码。本次提供的golang源代码只要运行go build -o main main.go,然后直接执行这个可执行文件即可运行,就像这样./main,我们就启动了这个http的服务。

然后我们创建一个dockerfile

FROM golang:alpine AS build
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -o  main main.go 

FROM alpine
COPY --from=build /app/main .
EXPOSE 8080
CMD [ "./main" ]

可以看到我们这个dockerfile有2段FROM。上面一段的配置仅用于golang项目的构建(也就是上面说到的go build 操作),下面一段的就是创建一个全新的容器,将上面编译好的可执行文件main复制到当前容器中,然后运行./main

配置讲解

因为docker在build的时候也是逐条执行,那么下面来逐条分解下配置这个dockerfile配置。

FROM golang:alpine AS build

FROM golang:alpine的意思就是当前的docker需要拉取golang的包,golang的版本是alpine,类似docker pull golang:alpine,这个alpine是专为容器设计的小型linux发行版本。AS build就是给当前的容器取一个别名,因为我们打包好后需要在无golang的环境中运行这个可执行文件,需要将可执行文件拷贝到无golang环境中。

RUN mkdir /app

RUN关键字其实就是执行命令的一起,在这一行,我们执行了mkdir /app这个命令。

COPY . /app

COPY关键字就是将当前的文件全部复制到刚刚我们创建的/app文件夹下面。

WORKDIR /app

WORKDIR是将后面跟的文件夹设置为当前的工作目录。在整个构建镜像过程中的,每一个RUN命令都是新建的一层。只有通过WORKDIR创建的目录才会一直存在。

RUN CGO_ENABLED=0 GOOS=linux go build -o  main main.go 

RUN后面跟着执行的go build的命令。

FROM alpine

alpine告诉docker使用一个alpine的专为容器开发的超级小的镜像。

COPY --from=build /app/main .

COPY --from=build就是将main这个可执行文件从build的容器中拷贝到当前的容器中

CMD [ "/main" ]

CMD执行/main这个可执行文件。

build

假设dockerfile的内容如上所示,那么此时我们先本地测试一下这个dockerfile是否能运行起来,和golang类似,我们先编译,然后运行。

$ docker build -t testgo .
$ docker run -d -p 8081:8080 --name myTestgo testgo

其中8081为本机的端口,8080为容器的端口,也就是http服务的8080端口。

此时我们可以打开浏览器访问http://127.0.0.1:8081/ping

此时我们可以进入容器进行操作(/bin/shor/bin/bash都可以试一试)

$ docker exec -it 7d2b512bf6b3 /bin/sh

上传docker hub

如果没问题,那么我们就开始上传了。

  • 首先检查docker是否登录,没有登录的,可以直接在命令行执行docker login
  • docker tag testgo:1.3 zmisgod/testgo:1.3 docker tag和git的tag类似,给这个image文件打一个tag,如果打了很多的tag,我们就可以通过docker pull zmisgod/testgo:1.3的方式拉取image。
  • docker push zmisgod/testgo:1.3 将image文件push到docker hub中