docker专项(二)构建属于自己的个性化镜像

616 阅读2分钟

上文我们简单了解到docker的基本使用。我们借助公共镜像库可以下载各种各样的镜像, 如 nginx等等。像常用的公共镜像,我们都可以从公开的公共镜像库中获得。但是实际的项目开发中,有公用的镜像是不够的,我们总一些特殊的,差异化的需求。

so,本文来简单介绍一下,打包属于自己的应用镜像

一 ,先看一下传统的应用运行模式,以一个简单的web应用为例子

web应用代码如下(go语言 gin框架)

package main

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

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
    c.String(200, "Hello, 欢迎欢迎")
    })
    r.Run(":8888")
}

执行一下

$ go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /                         --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8888

浏览器访问一下 8888端口

image.png

本文目标 基于公共镜像,构建自己的个性化应用镜像

这里需要理解几个概念

  • Dockerfile文件 可以理解构建镜像的脚本,先提前贴出我的构建镜像内容
FROM golang:latest

WORKDIR /hone/gotest/

ADD main.go /hone/gotest/

EXPOSE 8888

RUN cd /hone/gotest/ \
&& export GOPROXY=https://mirrors.aliyun.com/goproxy/ \
&& go mod init demo \
&& go mod tidy \
&& go build -o test


CMD /hone/gotest/test

这里先分别说明一下几个关键字

  • FROM golang:latest (基于 golang:latest镜像进行构建)
  • WORKDIR /hone/gotest/ (设置工作目录 docker登陆后进入的目录)
  • ADD main.go /hone/gotest/ (将 main.go 添加到镜像中)
  • EXPOSE 8888 (只是语义说明该镜像暴露的是8888端口,并没有实际功能)
  • RUN ....(执行shell脚本 这里要注意,尽量不要使用多个run 因为执行一次run都会多一层,最后可能导致镜像变得很大)
  • CMD (docker run 的时候执行的命令,这里要注意,如果执行的命令不是一直占用的,会退出整个docker)
执行构建
$ docker build -t test:v1.0 .
[+] Building 0.1s (9/9) FINISHED
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 37B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/golang:latest           0.0s
 => [1/4] FROM docker.io/library/golang:latest                             0.0s
 => [internal] load build context                                          0.0s
 => => transferring context: 29B                                           0.0s
 => CACHED [2/4] WORKDIR /hone/gotest/                                     0.0s
 => CACHED [3/4] ADD main.go /hone/gotest/                                 0.0s
 => CACHED [4/4] RUN cd /hone/gotest/ && export GOPROXY=https://mirrors.a  0.0s
 => exporting to image                                                     0.0s
 => => exporting layers                                                    0.0s
 => => writing image sha256:f592419339ea4c9d10f507e376e8ebf91ff712ce2ffae  0.0s
 => => naming to docker.io/library/test:v1.0                               0.0s

构建完毕之后 我们看一下 多了一个 test:v1,0的镜像

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         v1.0      f592419339ea   17 minutes ago   1.04GB
gotest       v1.0      d5142a3f413f   4 months ago     1.1GB
nginx        latest    605c77e624dd   4 months ago     141MB
golang       latest    276895edf967   4 months ago     941MB
centos       latest    5d0da3dc9764   7 months ago     231MB

那么,我们就用上文的知识执行一下我们刚构建的镜像

$ docker run -itd --name gotest -p 999:8888 test:v1.0
c770f0ee8c4403c12e46a96061b310255f97ff57772f8be0830a0f43b5d63663

看一下容器的运行情况

 docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                   NAMES
c770f0ee8c44   test:v1.0   "/bin/sh -c /hone/go…"   40 seconds ago   Up 39 seconds   0.0.0.0:999->8888/tcp   gotest

访问一下本地的999端口

image.png

构建成功!

然后,把打包的惊喜传到公共镜像库中,提供给其他人下载使用

  • 打tag
docker tag test:v1.0 jinanaav666/golang:demo
  • 推送
$ docker push jinanaav666/golang:demo
The push refers to repository [docker.io/jinanaav666/golang]
a9822e3dc8d3: Pushed
f91467ad3318: Pushed
86a458465c9c: Pushed
d82b47d992c3: Mounted from library/golang
2fa2c70b216a: Mounted from library/golang
bab89c562840: Mounted from library/golang
26a504e63be4: Mounted from library/golang
8bf42db0de72: Mounted from library/golang
31892cc314cb: Mounted from library/golang
11936051f93b: Mounted from library/golang
demo: digest: sha256:e468c4de176f061723ba9018999ba551b2103c7fa2826cef745ffdbf2d8465ed size: 2422

image.png 大功告成