在 Vscode 中搭建嵌入式 Linux 通用 windows、mac、linux 平台的 docker 容器开发环境
在日常工作中,由于各种原因,我们的电脑可能与同事的电脑存在一些差异,有时候是操作系统的差异(A 同事用的是 Linux,B 同事的是 Windows,而你用的是 Mac),有时候是依赖库环境的差异(A 同事安装了 opencv 1.2,B 同事安装了 opencv 2.3)。而解决这些差异性的问题就成为了重中之重,好在现在世界上最流行的 IDE Vscode 提供了基于 docker 容器的开发环
前言
在日常工作中,由于各种原因,我们的电脑可能与同事的电脑存在一些差异,有时候是操作系统的差异(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,专注于嵌入式+音视频+边缘计算领域,喜欢分享技术干货,欢迎关注我,一起学习进步。
更多推荐


所有评论(0)