Docker使用 | 青训营
什么是Docker ---- Docker类似一种虚拟机
通过架构图我们可以看到docker是在操作系统(OS)上面的一层,他不会像虚拟机一样模拟整个OS,所以在可以保证虚拟化的功能的前提下,他比虚拟机更加轻量。同时能保证在任意的环境都能运行,即与OS隔离
基本概念
docker种存在几个比较重要的概念
此处不讲解具体内部细节
只讲怎么简单方便的理解和使用
- 容器(Container)
- 镜像(Image)
- 数据卷(Volume)
容器
容器就可以看作一个个小的虚拟机,上面模拟这一个系统,运行着程序,对外提供服务
镜像
容器的一个备份,方便让别人使用
数据卷
容器和宿主主机的共享文件夹
下载安装
Windows
Docker: Accelerated, Containerized Application Development
去官网,然后下载Docker Desktop安装即可
Linux
Install Docker Engine | Docker Documentation
按照这个文档来按照
以Ubuntu举例子
Ubuntu
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证
sudo docker run hello-world
用docker部署go
一个简单的go项目
// main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"message": "pong",
})
})
r.Run()
}
// go.mod
module docker-example
go 1.20
这样我们的一个简单的http应用就做好了,通过GET请求,请求http://localhost:8080/ping
就会返回一个json
测试一下
运行
go run .
在浏览器打开http://localhost:8080/ping
成功
然后关闭
但是如果我需要这个服务一直运行,而不是关闭bash就停止,那么就需要用docker了
Dockerfile
通过编写Dockerfile我们可以构建自己的镜像,然后运行(搞个虚拟机一直运行我们的go程序)
我们在go.mod的同级目录下创建一个Dockerfile
├── Dockerfile
├── go.mod
└── main.go
然后我们在Dockerfile中写入一下内容
FROM golang:1.20
ENV GO111MODULE=on \
GOPROXY="https://goproxy.cn,direct" \
GO_MODE=release
WORKDIR /app
ADD . /app
RUN go build .
ENTRYPOINT ["./docker-example"]
我们来一行行解释
FROM golang:1.20
我们需要编译运行go程序,所以我们需要基于golang这个docker image来构建我们的程序
ENV GO111MODULE=on \
GOPROXY="https://goproxy.cn,direct" \
GO_MODE=release
我们需要设定一些环境变量让go顺利编译,同时因为是生产环境,所以GO_MODE=release
WORKDIR /app
WORKDIR表示在Container中我们程序的工作目录
ADD . /app
将.目录下的所有文件添加到Container中的/app目录下
RUN go build .
RUN就是在WORKDIR目录下执行命令,即在/app目录下执行go build .
构建镜像
sudo docker build -t docker-example .
-t 表示构建的镜像的标签(tag)也就是名字
.表示Dockerfile的位置
运行镜像
sudo docker run -d -p 9999:8080 docker-example
-d 表示后台运行 即退出bash以后也不会停止运行
-p 指定端口将container内部的8080端口放到宿主机的9999端口
这个时候我们再去访问http://localhost:9999/ping