wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz
tar -zxvf docker-24.0.6.tgz
移动到/usr/bin目录
sudo cp docker/* /usr/bin/
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
sudo chmod +x /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl enable docker.service
sudo systemctl start docker
sudo docker run hello-world
到这里就算完成了,显示 unable to find image 先不用管
如果没有docker,按照上文一安装,如果有了 docker,需要一个已经打包完成的镜像
假设打包的镜像命名为 ros.tar。
docker load -i ros.tar # ros.tar 修改为自己名字
如果镜像较大,需要等待数分钟
docker images
这时候会显示镜像对应的属性表格
REPOSITORY TAG IMAGE ID CREATED SIZE
docker run -it REPOSITORY:TAG
假设 REPOSITORY 为 ros,TAG 为 latest,则
docker run -it ros:latest
同样的,我们也可以把自己的镜像打包分享给他人使用
下面以打包 ros2_humble ubuntu22.04 基础环境为例
基础环境最好通过 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"]
保存了上述 Dockerfile 文件,在同一目录下运行下面命令
docker build -t ros2-ubuntu .
如果这一步显示网络失败,需要梯子进行,我试过国内许多源,现在都被禁止了。如果有梯子,需进行如下设置。亲测有效,具体是参考一位博主的操作。
创建或编辑 Docker 的系统代理配置文件:
创建目录并编辑代理配置文件:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
添加以下内容:
[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 使用其他端口,请相应调整。
保存并退出编辑器。
重新加载 systemd 配置并重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置
尝试拉取一个小的 Docker 镜像,验证配置是否正确。例如:
docker pull hello-world
假设镜像名是ros2-ubuntu
docker run -it ros2-ubuntu
如果想在容器内部访问、编译本地代码。可以运行容器时使用-v选项将本地代码目录挂载到容器中。
docker run -it -v /home/jeff:/home ros2-ubuntu
例如我把本地 /home/jeff 目录挂载到镜像 /home 目录下。如此在镜像home目录就可以访问 本机 /home/jeff 目录下的代码了
如果编译代码的时候发现镜像里缺少了一些库,想自己在镜像里安装,然后再打包出去,可以如此操作。
以安装 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
** 注:过程中不要 exit 退出镜像 ** 退出再进入,需要重新安装 yaml-cpp 库。为了不用反复安装,我们可以重新打包一份镜像,下次直接加载新镜像。
docker save -o ros2.tar my-id # ros2.tar可以换成自定义名称;my-image镜像名或ID。 docker images可以查看