1

一、Docker 基本概念

在开始使用Docker之前,首先要了解Docker中的概念和它们之间的关系,否则直接上手可能会搞得一头雾水。Docker中最重要的三个概念就是:镜像、容器、库。

镜像:是一个包含了应用程序和其运行时依赖环境的只读文件。

容器:它是构建容器的模板,通过一个镜像我们可以构造出很多相互独立但运行环境一样的容器。

库:Docker提供了Hub来保存公有或私有的镜像,也允许第三方搭建。

为什么使用Docker

Docker 提供了一个简便的运行环境,大大减少了运维的操作,解决了以前部署环境不同的情况。
上线一个项目,直接 Copy 一个镜像就行了。

Docker相关技术
容器隔离:采用libcontainer取代了LXC作为默认容器。通过内核的pid、net、ipc、mnt和uts等命名空间实现对进程、网络、消息、文件系统和主机名的隔离。
资源调配:通过cgroups控制资源的度量和分配。
可移植性:利用AUFS实现对容器的快速更新。AUFS具有层的概念,每次修改都是在已有的只写层进行增量修改,修改内容形成新的文件层而不影响原有的层。
安全性:通过命名空间的隔离和cgroups审计,并配合一系列工具如SELinux等来保证安全。

二、制作dockerfile文件

go 代码文件:

package main

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

func main() {
    r := gin.Default()
    r.GET("/", handlerindex)
    r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

func handlerindex(ctx *gin.Context) {
    log.Println("hello world handlerindex")
    ctx.JSON(http.StatusOK, `handlerindex`)
}

Dockerfile 文件:

#源镜像
FROM golang:latest
#FROM golang:1.17 as build
#作者
MAINTAINER Razil "test2022@163.com"
## 在docker的根目录下创建相应的使用目录
RUN mkdir -p /www/webapp
## 设置工作目录
WORKDIR /www/webapp
## 把当前(宿主机上)目录下的文件都复制到docker上刚创建的目录下
COPY . /www/webapp
#将服务器的go工程代码加入到docker容器中
#ADD . $GOPATH/src/github.com/mygohttp
#go构建可执行文件
RUN go build main.go
#暴露端口
EXPOSE 8080

RUN chmod +x main
ENTRYPOINT ["./main"]

## 启动docker需要执行的文件
#CMD go run main.go
#最终运行docker的命令
#ENTRYPOINT  ["./mygohttp"]
1.dockerfile 制作
dockerfile 制作的源镜像我们可以在 hub.docker.com 找到 golang官方提供的源镜像,我们采用golang:latest。
注意dockerfile文件名称必须是Dockerfile,其文件必须再工程目录下。

2.执行dockerfile,并生成docker镜像
在当前目录下,执行 docker build -t  mygohttp .
docker images
镜像编译完成,完整大小739M,对于线上的部署,无论是编译时间还是大小都是不合适的,后面会增加scratch镜像,用来解决这个问题。

3.docker运行mygohttp
docker run --name mygohttp -p 8080:8080 -d mygohttp

此时便启动了docker容器。
我们可以在 http://127.0.0.1:8080/ 访问该服务。

或者
docker run -d --name golang -p 8080:8080 --net mynet --ip 172.172.0.10 -v /Volumes/work/www/Go/webapp/:/www/webapp goweb
## 这里创建的docker名字为“golan” 名称应该写在 --name 之后;
## 网络的设置,我使用了自定义的docker网络设置,见前面的几个关于docker的内容;
## 创建共享目录,吧宿主机的“/Volumes/work/www/Go/webapp/” 文件夹同步到到 docker下的 /www/webapp ,这个目录也就是我们再创建镜像时候设置的工作目录
## 使用我们刚刚创建的镜像"goweb"
## 映射宿主机的 8080端口到docker上的8080端口


###go语言工程制作yaml文件,并部署到kubernetes
1.1.制作yaml文件
首先基于现有的docker镜像,制作出deployment和service。

2.部署mygohttp服务
kubectl create -f kube-mygohttp.yaml

此时我们可以通过 http://10.7.28.129:30836 访问。
通过 kubectl logs -f 实时查看日志。
###2. 基于scratch镜像编译
scratch 是一个特殊的镜像,它是一个虚拟镜像,也就是一个空白镜像;利用Golang的静态化编译无依赖性,可以大幅度减少编译时间和镜像大小。
##编译Golang
基于scratch必须先打包,然后才能进行运行,直接运行命令
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .

GOOS=linux 是将交叉编译的目标设置为Linux,这样你在Mac或者Win下也不会出现问题。
-installsuffix cgo 是为了在静态编译中导入net

##创建Dockerfile-test
FROM scratch
ADD main /
WORKDIR /
EXPOSE 8081
CMD ["/main"]

##编译镜像以及执行
docker build -f  Dockerfile-test  -t  myscratch .
docker run --name mygohttp -p 8081:8081 -d mygohttp

常用docker命令:

查询容器:
docker ps -a

删除容器
docker rm 6bf7c8fb514f
注意:rm 命令后面的是containerID 根据各自情况变化


删除images
docker image rm hello-world


停止服务
docker stop mygohttp
删除container实例
docker rm mygohttp
删除container镜像
docker rmi mygohttp

资料参考:
https://blog.csdn.net/niyueli...
https://blog.csdn.net/niyueli...
https://studygolang.com/artic...

ubuntun 下安装 docker

https://www.jianshu.com/p/c27...


goper
413 声望26 粉丝

go 后端开发