1.Docker是什么
引用菜鸟教程中的话
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
2. 安装Docker
2.1 安装
以下使用的是阿里云购置的99元服务器,配置是2C2G,操作系统是ubuntu 22.04
我们可以输入以下指令来安装docker,稍等片刻即可安装完毕
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
首先设置环境路径
export PATH=$PATH:/usr/bin/docker
设置完毕后输入,启动docker
sudo systemctl start docker
之后输入设置开机自启
sudo systemctl enable docker
此时输入docker,即可看到
2.2切换国内源
此时可能在拉取一些镜像的时候速度不够快,我们可以切换国内源来解决,不过最好的情况还是在网络环境良好的情况下拉取国外源,更加全面
首先输入
vi /etc/docker/daemon.json
然后在其中输入
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
保存后输入
systemctl daemon-reload
systemct restart docker
之后输入
docker info
即可看到如下内容
3. 构建一个镜像
3.1 本地测试
我接下来将通过将一个go项目的打包成镜像并运行来展示一次简易的流程。
我们新建一个go项目,然后写入如下内容,再执行go run指令
package main
import (
"fmt"
"log"
"net/http"
)
func hello(w http.ResponseWriter, req *http.Request) {
_, err := fmt.Fprintf(w, "Hello, Wwh!\n")
if err != nil {
return
}
}
func add(w http.ResponseWriter, req *http.Request) {
number1 := req.URL.Query().Get("number1")
number2 := req.URL.Query().Get("number2")
_, err := fmt.Fprintf(w, "result = "+(number1+number2))
if err != nil {
return
}
}
func main() {
http.HandleFunc("/hello", hello)
http.HandleFunc("/add", add)
log.Fatal(http.ListenAndServe("0.0.0.0:8000", nil))
}
运行起来后我们测试一下hello接口
> curl http://localhost:8000/hello
Hello, Wwh!
再测试一下add接口
> curl http://localhost:8000/add\?number1\=1\&number2\=2
result = 12%
可以看到接口正常工作
3.2 开始打包
然后我们现在需要在同个目录下编写Dockerfile来打包镜像
# 使用 golang:alpine 作为构建镜像
FROM golang:alpine AS builder
# 设置工作目录
WORKDIR /workspace
# 复制源代码
COPY . .
# 编译 Go 应用程序
RUN go build -o main .
# 使用 alpine:3.19 镜像作为最终镜像
FROM alpine:3.19
# 设置工作目录
WORKDIR /workspace
# 复制编译好的二进制文件
COPY --from=builder /workspace/main /workspace/main
# 设置入口点
ENTRYPOINT ["/workspace/main"]
然后我们在当前目录输入
docker build -t go-example .
docker build:这是 Docker 命令,用于构建 Docker 镜像。-t go-example:-t选项用于指定镜像的名称和标签。go-example是镜像的名称,.是标签(通常为latest)。.:这是上下文路径,表示 Docker 构建镜像时使用的上下文目录。.表示当前目录。
稍等片刻即可完成打包
我们输入docker images
可以查看刚才打好的镜像
4. 运行镜像
在终端输入
docker run -d -p 6666:8000 go-example
docker run:这是 Docker 命令,用于运行一个新的容器。-d:-d选项表示在后台(detached mode)运行容器,即容器在后台运行,不会占用当前终端。-p 6666:8000:-p选项用于端口映射。6666:8000表示将容器的8000端口映射到主机的6666端口。go-example:这是要运行的 Docker 镜像的名称。
然后我们输入docker ps查看运行中的镜像
可以看到镜像正常运行,我们将服务器的端口对外开放,然后使用curl方式试一下
> curl http://47.93.83.136:6666/add\?number1\=233\&number2\=666
result = 233666
> curl http://47.93.83.136:6666/hello
Hello, Wwh!
OK!运行成功!
上述两个接口对于公网也是开放的,欢迎体验。