以前在公司的时候,使用同事准备的容器化环境,直接在 Docker 内进行开发,爽歪歪呀。也是在那时了解了容器化开发的知识,可惜了,现在用不到那种环境了。所以打算自己在本地也整一个个人的开发环境,不过因为我本地已经按照好了开发环境(我现在主要使用Go,平时会写一些Python脚本,所以我本地安装了它们两个),也就没有动力推动自己去学习了。因为这个想法已经拖了很久了,再拖下去就不可能再去弄了。所以,今天就激进一点,直接把本地的开发环境卸载,强迫自己去开始容器化开发环境。
不过,这里我只卸载了 Go 的开发环境,因为 Python 是解释型语言,在本地有一个还是很有必要的。
然后打开 VSCode,可以发现 Go 的插件已经报错了,哈哈。
因为现在用的是 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
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.18
WORKDIR /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 verify
COPY . .
具体的内容可以看上面推荐的 VSCode 官方文档,里面已经说得很详细了。不过我之前使用的是 attaching 到一个正在运行的容器,这次使用的是其它的方式。
然后会让你选择,我这里只选择安装一个 zsh (alpine),不过第一次启动还是有点慢了。如果你感觉无聊的话,可以看看日志输出,这样可以缓解等待的焦虑。
这里可以直接安装 zsh 还是非常棒的!
这里我就只是在命令行启动项目了,因为我也没有安装相关的 golang 插件,它提示我安装了,我没有安装,也可以在插件那里选择你想要的进行安装。
VSCode 还是很人性的,自动给开了端口转发,不需要手动设置了(因为你现在是在容器中的,不能从外部直接访问的)。
这里我就简单的演示一下吧,因为这个 golang 的镜像可能不太合适,所以我还是需要弄一个自己的定制开发环境才比较好(也就是一个 Dockfile 或者复杂一点 docker-compose.yaml
)。
Dev Container