前言

  1. 想必大家都遇到过类似的困扰,拿到git上的一套代码,想在本机上运行,又缺少环境。配制环境,不是遇到缺少库,就是版本不兼容各种问题。
  2. 想必大家都经历过配置环境,即费时又费力,要是新一台电脑仍需要重新配置环境,如果没有公共服务器的话。哪有什么好用的工具,可以管理这些环境呢?
  3. 这时候就需要我们的 docker。docker 是什么?Docker 是一个开源的容器化平台,用于开发、运输和运行应用程序。它将应用程序及其依赖项打包到一个可移植的容器中,确保在任何环境中都能一致地运行。简单来说,就是只要一个人把运行环境配置好,把环境打包分享出来,其他人直接用 docker 加载这个文件,分分钟就可以运行代码。当然,你也可以把你的环境打包分享给其他人。

一、docker安装

1.1、下载docker安装包

wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz

1.2、解压

tar -zxvf docker-24.0.6.tgz

1.3、移动

移动到/usr/bin目录

sudo cp docker/* /usr/bin/

1.4、docker注册成系统服务

gedit /etc/systemd/system/docker.service

没有gedit的,下面命令安装
sudo apt update
sudo apt install gedit

复制下面内容写入docker.service文件

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

1.5、添加文件权限

sudo chmod +x /etc/systemd/system/docker.service
sudo systemctl daemon-reload 

1.6、设置开机启动

sudo systemctl enable docker.service

1.7、启动docker

sudo systemctl start docker

1.8、测试是否启动

sudo docker run hello-world

在这里插入图片描述到这里就算完成了,显示 unable to find image 先不用管

二、镜像加载

2.1、镜像准备

如果没有docker,按照上文一安装,如果有了 docker,需要一个已经打包完成的镜像

假设打包的镜像命名为 ros.tar。

2.2、加载镜像

docker load -i ros.tar	# ros.tar 修改为自己名字

如果镜像较大,需要等待数分钟

2.3、查看已加载镜像

docker images

这时候会显示镜像对应的属性表格

REPOSITORY TAG IMAGE ID CREATED SIZE

2.4、进入镜像

docker run -it  REPOSITORY:TAG   

假设 REPOSITORY 为 ros,TAG 为 latest,则

docker run -it  ros:latest 

三、打包镜像

同样的,我们也可以把自己的镜像打包分享给他人使用

下面以打包 ros2_humble ubuntu22.04 基础环境为例

3.1、创建 Dockerfile

基础环境最好通过 Dockerfile 创建,创建名为 Dockerfile 的文件

touch Dockerfile

复制以下内容

# 使用Ubuntu 22.04作为基础镜像
FROM ubuntu:22.04

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive

# 更新包管理器并安装ROS 2依赖
RUN apt-get update && apt-get install -y \
    locales \
    curl \
    gnupg2 \
    lsb-release \
    && locale-gen en_US.UTF-8 \
    && apt-get install -y software-properties-common \
    && add-apt-repository ppa:osrfoundation/osrf-ros2 \
    && apt-get update && apt-get install -y \
    ros-humble-desktop \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /workspace

# 启动bash
CMD ["/bin/bash"]

3.2、构建镜像

保存了上述 Dockerfile 文件,在同一目录下运行下面命令

docker build -t ros2-ubuntu .

如果这一步显示网络失败,需要梯子进行,我试过国内许多源,现在都被禁止了。如果有梯子,需进行如下设置。亲测有效,具体是参考一位博主的操作。

  1. 创建或编辑 Docker 的系统代理配置文件

    创建目录并编辑代理配置文件:

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
    
  2. 添加以下内容

    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:7890"
    Environment="HTTPS_PROXY=http://127.0.0.1:7890"
    Environment="NO_PROXY=localhost,127.0.0.1"
    

    注意:将 http://127.0.0.1:7890 替换为 Clash 监听的实际代理地址和端口。如果 Clash 使用其他端口,请相应调整。

  3. 保存并退出编辑器

  4. 重新加载 systemd 配置并重启 Docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  5. 验证配置

    尝试拉取一个小的 Docker 镜像,验证配置是否正确。例如:

    docker pull hello-world
    

3.3、运行容器

假设镜像名是ros2-ubuntu

docker run -it ros2-ubuntu

如果想在容器内部访问、编译本地代码。可以运行容器时使用-v选项将本地代码目录挂载到容器中。

docker run -it -v /home/jeff:/home ros2-ubuntu  

例如我把本地 /home/jeff 目录挂载到镜像 /home 目录下。如此在镜像home目录就可以访问 本机 /home/jeff 目录下的代码了

3.4、导出镜像

如果编译代码的时候发现镜像里缺少了一些库,想自己在镜像里安装,然后再打包出去,可以如此操作。

以安装 yaml-cpp 安装包为例。进入镜像安装 yaml-cpp 库
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

过程中不要删除容器 ,删除容器后 通过镜像进入需要重新安装 yaml-cpp 库。可以退出再进入容器。为了分享给其他伙伴,我们可以重新打包一份镜像,下次直接加载新镜像(里面有yaml-cpp库了)。

docker images # 查看 IMAGE ID
docker commit f59096ea53f1 yourname:latest	 # f59096ea53f1是 IMAGE ID
docker save -o ros2.tar 15d963d26fab  # 15d963d26fab 是IMAGE ID
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐