什么是docker
Docker是一种开源的容器化平台,可以让开发者打包他们的应用程序及其依赖项到一个可移植的容器中,然后发布到任何支持Docker的机器上运行,而不用担心环境变量和依赖关系的问题。容器是一种轻量级、独立于平台的软件包,包含应用程序及其依赖项,可以在任何环境中运行。Docker利用容器技术,可以实现快速部署、易移植、高效、可扩展的应用程序打包和交付。
为什么要使用docker?
使用Docker进行软件开发有多个优势:
-
环境一致性:Docker容器可以确保开发、测试和生产环境的一致性,避免了因环境差异导致的问题。
-
快速部署:Docker容器可以快速部署应用程序及其依赖项,大大缩短了部署时间。
-
资源利用率:Docker容器共享宿主机的内核,因此可以更有效地利用系统资源,提高系统的利用率。
-
易于扩展:Docker容器可以很容易地扩展,可以根据需要快速地启动更多的容器实例。
-
隔离性:虽然不如传统虚拟机那样严格,但Docker容器提供了一定程度的隔离性,使得不同容器中的应用程序彼此独立运行。
-
版本控制:Docker容器可以像代码一样进行版本控制,可以方便地管理和回滚容器的版本。
因此,使用Docker进行软件开发可以提高开发效率、降低运维成本、确保应用程序的一致性和可移植性,是现代软件开发中的一种重要工具。
对于Kerloud飞控开发而言,由于代码在快速更新,所依赖的系统软件变化很大。很多时候往往需要花费很多时间在搭建开发环境,以及处理其他软件的系统依赖冲突问题,比如常见的python版本问题,在这种情况下,使用docker进行飞控软件开发就很省时省力了。
docker与虚拟机的区别
有的朋友会问,我习惯使用虚拟机进行开发,两者有什么区别?Docker和传统虚拟机之间有几个关键区别:
-
资源占用:传统虚拟机需要在宿主机上运行完整的操作系统,因此占用的资源较多。而Docker容器共享宿主机的操作系统内核,因此更加轻量级,占用的资源更少。
-
启动时间:传统虚拟机启动时间较长,因为需要启动完整的操作系统。而Docker容器启动速度很快,因为只需加载应用程序及其依赖项。
-
性能:由于Docker容器与宿主机共享内核,因此在性能方面通常优于传统虚拟机。
-
隔离性:虽然Docker容器提供了一定程度的隔离性,但是传统虚拟机在这方面更加严格,因为每个虚拟机都有自己的操作系统内核。
-
部署和管理:Docker容器可以更容易地部署和管理,因为可以使用Docker提供的工具和命令进行操作。传统虚拟机的管理相对更加复杂。
总的来说,Docker适用于需要快速部署、资源占用少、易管理的场景,而传统虚拟机适用于需要更严格隔离性或运行不同操作系统的场景。
如何使用docker进行Kerloud飞控固件开发
使用docker进行Kerloud飞控固件的编译可以非常愉快,下面以ubuntu系统为例(可以是从16.04到目前最新的22.04的任意版本)。
(1)我们首先在系统中安装docker工具,
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
将docker添加到docker group,这样每次启动docker不用sudo权限
sudo groupadd docker # Add your user to the docker group.
sudo usermod -aG docker $USER # Log in/out again before using docker!
(2)下载docker镜像
我们使用px4官方维护的ros melodic镜像,
https://hub.docker.com/r/px4io/px4-dev-ros-melodic
docker pull px4io/px4-dev-ros-melodic
下载完成后,我们可以通过下述指令查看本地的镜像有哪些,
docker image ls
(3)下载Kerloud飞控源代码
我们通过git指令把Kerloud飞控的开源代码下载到~/src目录下,然后切换到v1.10.0分支(其他分支也可以)
git clone --recursive https://github.com/cloudkernel-tech/firmware
git checkout master_kerloud_v1.10.0
(4)从docker镜像启动docker container
启动时我们需要设置~/src/文件夹和usb端口映射到container中的对应位置,并且保证GUI软件在container中可以显示
# enable access to xhost from the container
xhost +
# Run docker
docker run -it --privileged \
--env=LOCAL_USER_ID="$(id -u)" \
-v /home/$USER/src: /home/user/src:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=:0 \
-p 14570:14570/udp \
--name=kerloud_ros_melodic_container px4io/px4-dev-ros-melodic:latest bash
指令执行后会自动进入container的bash终端。如果使用了nvidia的显卡,则需要安装nvidia官方的container-toolkit,同时指令调整为:
# enable access to xhost from the container
xhost +
# Run docker
docker run -it --privileged \
--env=LOCAL_USER_ID="$(id -u)" \
-v /home/$USER/src:/home/user/src:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
--env=NVIDIA_VISIBLE_DEVICES=all -env=NVIDIA_DRIVER_CAPABILITIES=all \
--runtime=nvidia \
-e DISPLAY=:0 \
-p 14570:14570/udp \
--name=kerloud_ros_melodic_container px4io/px4-dev-ros-melodic:latest bash
如果需要退出container,则只需要在终端输入exit即可,通过docker ps -a指令我们可以查看目前主机存在的container。
(5)在container中编译代码
在主机终端,
# start the container
docker start kerloud_ros_melodic_container
# open a new bash shell in this container, root privilege is guaranteed
docker exec -it kerloud_ros_melodic_container bash
在container终端,
echo “export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/bin:\$PATH” >> /root/.bashrc
bash /root/.bashrc
cd /home/user/src/Firmware
git config --global --add safe.directory ‘*’
# install px4 development toolchain
cd Tools/setup/custom
bash ubuntu.sh
# build for kerloud mini autopilot
make px4_fmu-v3_default
也可以支持gazebo仿真,
cd /home/src/Firmware
make px4_sitl_default gazebo
回到教程目录: Kerloud飞控系列教程(1):目录