以前在公司的时候,使用同事准备的容器化环境,直接在 Docker 内进行开发,爽歪歪呀。也是在那时了解了容器化开发的知识,可惜了,现在用不到那种环境了。所以打算自己在本地也整一个个人的开发环境,不过因为我本地已经按照好了开发环境(我现在主要使用Go,平时会写一些Python脚本,所以我本地安装了它们两个),也就没有动力推动自己去学习了。因为这个想法已经拖了很久了,再拖下去就不可能再去弄了。所以,今天就激进一点,直接把本地的开发环境卸载,强迫自己去开始容器化开发环境。
卸载本地的开发环境
不过,这里我只卸载了 Go 的开发环境,因为 Python 是解释型语言,在本地有一个还是很有必要的。
然后打开 VSCode,可以发现 Go 的插件已经报错了,哈哈。
安装 Docker Desktop
因为现在用的是 Windows,不是 Linux 了,所以先在 Windows 上安装 Docker Desktop。不过我还是更喜欢在 Linux 上面开发,Windows 的话,无法使用哪些命令行工具了。
我这里只有一个 Docker,因为我尝试开启它的 Kubernetes,但是一直都无法启动,不知道是哪里的问题了。然后我就转向了 Rancher Desktop 了,不过 Docker Desktop 的 docker 功能还是不错的,用 docker 的话就用它了。如果是 k8s 再用 Rancher desktop。
拉取镜像
这里可以看出,两个镜像的大小差距还是蛮大的。其实看 golang 的镜像 tag 就能看出来了,它是基于 alpine 这个 Linux 发行版的。那么什么是 alpine 呢,这里简单提一嘴吧,这个名字是欧洲的 阿尔卑斯山,看下面的封面也能看出来了。它明显的特点就是小,大概只有 5 MB。
所以,这个 golang 的镜像,几乎全部内容都是 go 本身的东西了。但是 Python 就不一样了,因为它是一个解释型的语言,所以一般都是用那种比较大的镜像来作为基础镜像。
注意:这里的 golang 镜像是我在 docker hub 随便选择的,它可能太简陋了。如果是用作开发镜像的话,可以选择基于 Ubuntu 的更加丰富(这里不说它大,因为大是缺点,丰富是优点)的镜像。
docker hub 的 golang 镜像官方用法
有些同学可能网络不是很通畅,我这里把这块内容截取过来了,我们照着下面的用法做就行了。
PS: 为什么大是缺点?因为东西越多,潜在的漏洞就越多;反之,漏洞就越少,更加的安全。这里可以简单了解一下 CVE:What is a CVE
Hello World
docker run --rm -it python:3.12 python -c 'print("Hello World")'
这个例子算是比较简单的了,它也说明了基于容器进行开发的可能性。
我们再来看一个比较复杂的,golang 的例子吧,我在本地 hello 下,建立了一个 main.go
文件。
启动 golang 的镜像,把本地目录下的 main.go 挂载到容器的 /go/src/hello 下,并启动一个交互式的 shell 终端。
这里要了解一下容器挂载的知识:
那么你可能还需要了解一下 UFS 的知识了,不过长话短说,挂载目录就是把一个特定的本地目录挂载到容器目录下。
更进一步
前面介绍了一些简单的东西,直接启动一个镜像的方式演示是一个极佳的示例,但是对于真正的开发来说还是过于简陋了。如果需要在容器内开发,还是要构建一个自己的镜像才是比较好的方式。而且真正的开发需要的环境还是要复杂的多了。工欲善其事必先利其器,既然是开发当然需要一个趁手的工具了,这里我用的是 VSCode。
安装相关插件
强烈推荐大家阅读 VSCode 官方的 documentation: Developing inside a Container 在容器内开发
然后注意看上面的第二个框选内容,它(Dev Containers extention)支持两种基本的操作模型:
- 你可以使用一个容器作为你的全职开发环境
- 你可以连接到一个正在运行的容器去检查它。
在项目(随便一个项目,就算是刚才用作演示的 hello 也可以的)中创建一个 Dockerfile
FROM golang:1.20.11-alpine3.18WORKDIR /usr/src/app
# pre-copy/cache go.mod for pre-downloading dependencies and only redownloading them in subsequent builds if they change
COPY go.mod go.sum ./
RUN go mod download && go mod verifyCOPY . .
具体的内容可以看上面推荐的 VSCode 官方文档,里面已经说得很详细了。不过我之前使用的是 attaching 到一个正在运行的容器,这次使用的是其它的方式。
然后会让你选择,我这里只选择安装一个 zsh (alpine),不过第一次启动还是有点慢了。如果你感觉无聊的话,可以看看日志输出,这样可以缓解等待的焦虑。
这里可以直接安装 zsh 还是非常棒的!
这里我就只是在命令行启动项目了,因为我也没有安装相关的 golang 插件,它提示我安装了,我没有安装,也可以在插件那里选择你想要的进行安装。
VSCode 还是很人性的,自动给开了端口转发,不需要手动设置了(因为你现在是在容器中的,不能从外部直接访问的)。
这里我就简单的演示一下吧,因为这个 golang 的镜像可能不太合适,所以我还是需要弄一个自己的定制开发环境才比较好(也就是一个 Dockfile 或者复杂一点 docker-compose.yaml
)。
PS
Dev Container