前言
在日常工作中,由于各种原因,我们的电脑可能与同事的电脑存在一些差异,有时候是操作系统的差异(A 同事用的是 Linux,B 同事的是 Windows,而你用的是 Mac),有时候是依赖库环境的差异(A 同事安装了 opencv 1.2,B 同事安装了 opencv 2.3)。而解决这些差异性的问题就成为了重中之重,好在现在世界上最流行的 IDE Vscode 提供了基于 docker 容器的开发环境构建,可以让不同平台不同环境下的电脑在开发时都保持一致,得到同样的开发体验。
本文将手把手教大家构建一个统一的 docker 容器开发环境,一旦环境搭建完成后,可以把之前的代码库分享给你的同事,让他和你一样得到相同的开发体验,解决了差异问题。话不多说,马上开始。
Docker
这里简单介绍下什么是 Docker。Docker 是一个开源的应用容器化平台,旨在通过简化软件的部署、扩展和运行,帮助开发者和运维人员更高效地管理应用。Docker 主要解决的是应用在不同环境中的一致性问题。它使用 容器 来封装应用及其所有依赖项,从而确保应用在不同环境中运行时能够保持一致性。
上图是 Docker 的 LOGO,这个 LOGO 很形象的概况了 Docker 的用途。鲸鱼上面的箱子就像一个个容器,每个容器都是相互隔离的,互不干扰。而鲸鱼就像宿主机,支撑着整个容器的运行。
我们的开发环境就在放在一个个的容器里面,比如 A 项目用 A 容器作为开发环境,它可能包含 opencv 2.1 的版本,而 B 项目用 B 容器作为开发环境,它可能包含 opencv 4.2 的版本,它们之间互不干扰。
在你所在的操作系统下载 Docker 软件,可以参考 Docker 官网的安装教程,由于比较简单,这里不过多赘述。
安装之后,在你的终端输入 docker -v
命令,如果打印 Docker 的版本信息,则说明 Docker 安装成功。
在 Vscode 中搭建 Docker 容器开发环境
安装插件
打开扩展商店,搜索 ms-vscode-remote.remote-containers
插件,点击安装。
接着,在你的开发目录或找一个测试目录下,创建 .devcontainer
文件夹,并在里面创建 devcontainer.json
文件,这样,我们的前期准备工作就做好了。
类似如下:
devcontainer.json
文件的用途是配置容器开发环境,比如指定容器镜像、端口映射、文件挂载等。
使用别人构建好的镜像
最简单的使用方式,就是使用别人已经构建好的镜像容器作为我们的开发环境,比如 Docker Hub 上有很多现成的镜像,我们可以直接拿来使用。
比如,我希望能让开发这个项目的小伙伴都在 ubuntu20.04 的环境下进行。下面的配置文件,使用的是 Docker Hub 上的 ubuntu:20.04
镜像,并在启动容器时安装 code-spell-checker
插件。
{
"name": "Ubuntu 20.04",
"image": "docker.io/library/ubuntu:20.04",
"customizations": {
"vscode": {
"settings": {},
"extensions": [
"streetsidesoftware.code-spell-checker"
]
}
}
}
将上面配置复制到 devcontainer.json
文件中,然后重新打开项目,此时,Vscode 会检测到你的项目有 devcontainer.json
文件,因此左下方会自动弹出如下窗口:
点击 “在容器中重新打开”,之后等待 Vscode 自动进行镜像下载和启动容器,启动成功之后,左下角会显示当前正在容器中:
此时我们进入了一个容器开发环境,我们可以在里面安装各种 linux 软件,比如我安装了 neofetch
,可以查看当前的容器系统信息:
至此,我们创建了一个简单的容器开发环境。你可以把项目推送到 git,同事拉下代码之后,也会构建相同的容器开发环境,你们获得了一致的开发体验。
但是,这里我安装了 neofetch
,在你的同事电脑里,并不会有这个包,因为这个包不包含在镜像里面,它是和当前正在运行的容器绑定的,如果容器销毁了,你的包也就没了。对此,这里介绍一种真实开发中更常用的方法,就是为每个项目构建属于它的镜像。
为项目构建属于它的镜像
为项目构建属于它的镜像并不复杂,如果你有编写 Dockerfile 文件的基础,那么一看就懂。如果你没有编写过 Dockerfile,也不用紧张,Dockerfile 本质上就是一个配置文件,只要理解了配置项的含义,自然很快就能上手了,推荐参考 Dockerfile 官方文档。
由于我们是做嵌入式 Linux 开发的,因此这里以构建一个嵌入式 linux 开发环境为例,当然做其他开发的小伙伴也可以参考,这篇文章也对前端、后端、ai等等开发人员通用。
首先,我们将 devcontainer.json
文件的内容清空,然后在 .devcontainer
文件夹下创建 Dockerfile
文件。此时的目录结构如下:
在这里,我要构建一个支持 C、C++ 开发的 ubuntu22.04 环境,并且项目使用到 ffmpeg 和 opencv 的开发库,Dockerfile
的内容如下:
# 使用ubuntu22.04,配置c、c++开发环境
FROM ubuntu:22.04
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 安装必要的工具
RUN sed -i s@/ports.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && apt-get update && apt-get install -y \
build-essential \
cmake \
git \
vim \
tmux \
curl \
wget \
zsh \
clangd
RUN sed -i s@/ports.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && apt-get update && \
apt-get install -y pkg-config \
libopencv-dev \
libavcodec-dev \
libavformat-dev \
libavfilter-dev \
libavutil-dev \
libswscale-dev
CMD ["/bin/zsh"]
将上述代码复制到 Dockerfile
文件中。接着,重新编辑 devcontainer.json
文件,将下面的内容复制到里面。
{
// 容器的名称
"name": "c_c++_dev",
// 构建配置
"build": {
// 指定Dockerfile文件路径
"dockerfile": "Dockerfile"
},
// VSCode的自定义配置
"customizations": {
"vscode": {
// VSCode设置
"settings": {},
// 需要安装的VSCode扩展
"extensions": [
// C/C++开发必备扩展
"ms-vscode.cpptools"
]
}
},
// 指定容器内的用户为root
"remoteUser": "root"
}
跟之前的步骤一样,左下角会弹出提示框,点击 “在容器中重新打开”,等到片刻,Vscode 会构建镜像并启动容器。
接着我们可以打开终端,查看我们已经安装的 apt 包。
root@b1388da62614:/workspaces/c_c++_dev# apt list --installed | grep libopencv-dev
libopencv-dev/jammy,now 4.5.4+dfsg-9ubuntu4 amd64 [installed]
可以看到,我在 Dockerfile
中指定安装的 libopencv-dev
包成功了。这样做的优点是你和你的同事都不需要再单独去安装各种包,直接开箱即用,解决了开发环境混乱的问题。
devcontainer.json
配置文件还有很多配置项,具体可以参考 官方文档。
总结
本文介绍了如何在 Vscode 中搭建嵌入式 Linux 通用 windows、mac、linux 平台的 docker 容器开发环境,并介绍了两种构建容器开发环境的方法。
- 第一种方法使用别人已经构建好的镜像,适合快速上手,但无法满足个性化需求。
- 第二种方法为每个项目构建属于它的镜像,适合需要个性化配置的场景,可以满足各种开发需求。
希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言讨论。
我是 Leon_Chenl,一个爱运动的 boy,专注于嵌入式+音视频+边缘计算领域,喜欢分享技术干货,欢迎关注我,一起学习进步。