上文我们简单了解到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端口
本文目标 基于公共镜像,构建自己的个性化应用镜像
这里需要理解几个概念
- 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端口
构建成功!
然后,把打包的惊喜传到公共镜像库中,提供给其他人下载使用
- 打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
大功告成