1.1 什么是镜像(Image)
镜像就是像照镜子一样。我们一般说的镜像是指给系统作个ghost镜像。这样可以在很短时间,很方便的还原出一个完整的系统来。镜像可以说是一种文件,比如iso,gho都属于镜像文件,镜像文件可以直接刻录到光盘中,也可以用虚拟光驱打开.
镜象就是一种文件形式,可以把许多文件做成一个镜象文件。比如你的系统,本来有很多文件,做成镜象后就一个文件,与GHOST等程序放在在一个盘里用GHOST等软件打开后,又恢复成许多文件,总之用镜象给你装系统就是原样复制一份现有系统的意思,当然里面的杀毒软件等也是一样复制过来的。
1.2 Image的获取
1.2.1 逐步的设置image的版本,标识,加载软件,监听端口,安装位置等参数
1.2.2 类似于github一样,直接从库中拉取,可在https://hub.docker.com/explore中查看需要的程序
1.3 Image的创建
1.3.1 创建一个go程序,直接输出hello,world就可以,如图:
1.3.2 在同一个目录下编写dockerfile文件,内容如下:
其中,FROM scratch 是从零开始,而不是其他的镜像
ADD 文件名 路径 (把文件加载到镜像中)
CMD * (运行程序)
注意:此时运行的路径不要和编写原hello的路径相同,否则会报错
1.3.3 运行命令 docker build -t go/hell .
参数说明:
-t: 该镜像的命名
.: 当前目录
1.3.4 结果查看
1.3.5 运行程序
1.3.6 删除镜像
如果想要删除镜像,必须先要删除容器,先用命令 docker ps -a 查看所有的进程
先删除运行中的容器: docker rm ID
最后才能删除镜像: docker rmi hello/go go/hell
查询结果,已删除 docker images
2.1 什么是Container
2.2 运行Container
2.2.1 如果直接运行docker run centos,并不会有什么效果,必须加入参数:-it,说明:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
如图:
我们进入了一个新的centos,如果我们新开一个ssh连接之前的终端,用docker ps -a命令查看,可显示此时容器在使用中
2.2.2 使用命令删除全部容器
之前已经介绍过了,我们可以使用docker rm ID命令来删除对应的容器,那么有没有一建删除的方法呢?答案是必须得有.
首先我们用 docker ps -a 命令来查看所有的进程
其实使用 docker ps -aq 可以得到全部的Container ID
最后我们封装一下命令: docker rm $(docker ps -aq) 就可以得到我们想要的结果(报错是因为有一个真在运行中容器)
3 制作DockerFile
我们已经知道了Image和Container之间的衔接就是利用DockerFile来维系的,只要创建好dockerfile,并使用docker build -t XXX 命令就可以创建一个基于原Centos或新的image,所以编写DockerFile文件尤其的重要.
3.1 FROM
3.2 LABEL(类似于注释)
3.3 RUN(运行)
3.4 WORKDIR(设置当前工作目录,和linux中的cd很相似)
3.5 ADD and COPY(添加文件到指定的目录)
3.6 ENV(设置常量)
3.7 CMD (用于执行命令)
3.8 ENTRYPOINT(一般会用于启动后台进程)
4.1 实战演练
4.1.1 运行go文件,并使用命令go run main.go实现web功能,具体的go文件如下:
package main
import (
"github.com/gin-gonic/gin"
"./model"
)
//中间件的定义
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Query("name")
password := c.Query("password")
if name == "admin" && password == "111111" {
c.String(200, "验证通过</br>")
//请求前
//前置操作
} else {
//数据挂起,打断
c.Abort()
c.String(200, "我是中间件,你没有权限")
}
}
}
func index(c *gin.Context) {
c.String(200, "日你大爷的")
}
func home(c *gin.Context) {
c.String(200, "hello home")
}
func login(c *gin.Context) {
c.String(200, "请先登陆!")
}
func ll(c *gin.Context) {
c.JSON(200, gin.H{"md": "请先登陆!", "Qqq": model.Qqq()})
}
func main() {
r := gin.Default()
//设置分组中间件
s := r.Group("/index", Logger())
{
s.GET("/index", index)
s.GET("/home", home)
}
r.GET("/login", login)
r.GET("/ll", ll)
r.Run(":80")
}
要实现功能,分析如下:
1.首先是必须搭建go的环境,可以用FROM golang来实现
2.其次是运行代码的时候,必须得加载go的第三方库gin,所以得RUN go get -u github.com/gin-gonic/gin
3.然后是我们的main.go文件得加载进来,可以用COPY main.go /app/来实现
4.最后就是我们去利用CMD ["go","run","main.go"]来运行我们的代码
编写DockerFile文件如下:
运行docker build -t ggg .后,我们可以看到运行成功;
最后运行镜像 docker run -p 88:88 ggg , 看到了我们容器已经运行成功
当然,如果想要一直后台稳定的运行,可以使用命令docker run -p 88:88 -d ggg,返回的便是id了
4.1.2 对container的操作
进入运行的容器中可以使用命令 docker exec -it af8f9e448dbc bash
停止运行的容器可用命令 docker stop af8f9e448dbc