在 Vscode 中搭建嵌入式 Linux 通用 windows、mac、linux 平台的 docker 容器开发环境

前言

在日常工作中,由于各种原因,我们的电脑可能与同事的电脑存在一些差异,有时候是操作系统的差异(A 同事用的是 Linux,B 同事的是 Windows,而你用的是 Mac),有时候是依赖库环境的差异(A 同事安装了 opencv 1.2,B 同事安装了 opencv 2.3)。而解决这些差异性的问题就成为了重中之重,好在现在世界上最流行的 IDE Vscode 提供了基于 docker 容器的开发环境构建,可以让不同平台不同环境下的电脑在开发时都保持一致,得到同样的开发体验。

本文将手把手教大家构建一个统一的 docker 容器开发环境,一旦环境搭建完成后,可以把之前的代码库分享给你的同事,让他和你一样得到相同的开发体验,解决了差异问题。话不多说,马上开始。

Docker

这里简单介绍下什么是 Docker。Docker 是一个开源的应用容器化平台,旨在通过简化软件的部署、扩展和运行,帮助开发者和运维人员更高效地管理应用。Docker 主要解决的是应用在不同环境中的一致性问题。它使用 容器 来封装应用及其所有依赖项,从而确保应用在不同环境中运行时能够保持一致性。

image.png

上图是 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 插件,点击安装。

image.png

接着,在你的开发目录或找一个测试目录下,创建 .devcontainer 文件夹,并在里面创建 devcontainer.json 文件,这样,我们的前期准备工作就做好了。

类似如下:

image.png

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 文件,因此左下方会自动弹出如下窗口:

image.png

点击 “在容器中重新打开”,之后等待 Vscode 自动进行镜像下载和启动容器,启动成功之后,左下角会显示当前正在容器中:

image.png

此时我们进入了一个容器开发环境,我们可以在里面安装各种 linux 软件,比如我安装了 neofetch,可以查看当前的容器系统信息:

image.png

至此,我们创建了一个简单的容器开发环境。你可以把项目推送到 git,同事拉下代码之后,也会构建相同的容器开发环境,你们获得了一致的开发体验。

但是,这里我安装了 neofetch,在你的同事电脑里,并不会有这个包,因为这个包不包含在镜像里面,它是和当前正在运行的容器绑定的,如果容器销毁了,你的包也就没了。对此,这里介绍一种真实开发中更常用的方法,就是为每个项目构建属于它的镜像。

为项目构建属于它的镜像

为项目构建属于它的镜像并不复杂,如果你有编写 Dockerfile 文件的基础,那么一看就懂。如果你没有编写过 Dockerfile,也不用紧张,Dockerfile 本质上就是一个配置文件,只要理解了配置项的含义,自然很快就能上手了,推荐参考 Dockerfile 官方文档

由于我们是做嵌入式 Linux 开发的,因此这里以构建一个嵌入式 linux 开发环境为例,当然做其他开发的小伙伴也可以参考,这篇文章也对前端、后端、ai等等开发人员通用。

首先,我们将 devcontainer.json 文件的内容清空,然后在 .devcontainer 文件夹下创建 Dockerfile 文件。此时的目录结构如下:

image.png

在这里,我要构建一个支持 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,专注于嵌入式+音视频+边缘计算领域,喜欢分享技术干货,欢迎关注我,一起学习进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值