环境示意图
本机->服务器->docker容器
注意此处是有三个机器的
ssh -p 22 服务器用户名@服务器地址
2.服务器端执行代码,注意端口要选择没有使用端口号,例如下面的37.查看正在使用中的端口号可以用sudo ufw status verbose
#设置服务器上端口防火墙
sudo ufw status #查看状态,如果status:inactive,需要打开防火墙
sudo ufw enable #打开防火墙
sudo ufw status verbose #查看防火墙的详细配置
sudo ufw allow 37/tcp #允许使用37端口号
sudo ufw status verbose #查看防火墙的详细配置
#拉取镜像
sudo docker pull osrf/ros:foxy-desktop
#查看容器名称name,例如foxy-desktop
docker ps
#进入容器
sudo docker exec -it foxy-desktop /bin/bash
3.容器端代码
#需要在镜像中安装好环境:
apt update
apt-get install -y openssh-server
apt-get install -y vim
apt-get install -y tmux
#设置配置文件
vim /etc/ssh/sshd_config
#文件修改内容 可能不仅需要需改内容,还需要将相应的项的注释去掉,使配置生效
Port 22
PermitRootLogin yes
PasswordAuthentication yes
#重启ssh服务
service ssh restart #如果无法远程登录,可以exec进入容器后重启ssh服务,以便使新的配置生效
#设置容器的用户名和密码
adduser <username>
#将 `` 替换为您希望设置的用户名。
#系统会提示您设置密码和其他相关信息。请根据提示输入密码并完成用户创建过程
#运行以下命令将用户添加到 sudo 组(将 "freja" 替换为你的用户名):
usermod -aG sudo freja(可选)
#避免远程登录freja后无法使用sudo权限,这一行不一定有用。。。不行就docker登录,在root中直接使用sudo指令。然后ssh登录,使用一些不需要sudo的指令。没有root权限在安装cmake或者apt install或者sudo su等尝试获取权限时会报错: is not in the sudoers file. This incident will be reported.
cat /etc/passwd
#这将显示/etc/passwd文件的内容,其中包含了系统上的所有用户信息。每行代表一个用户,字段之间使用冒号进行分隔。通常情况下,用户信息包括用户名、密码(已加密)、用户ID、组ID、用户描述信息、主目录和默认shell。
直接关闭终端,不要退出,不要停止容器,保持容器持续运行状态
4.服务器端代码
#查看新拉取的容器osrf/ros:foxy-desktop的containerID
sudo docker ps
#配置好新的镜像后可以保存,方便后续使用。注意,此处之所以不直接用拉取的osrf/ros:foxy-desktop,是因为拉取的镜像没有sshserve。没法在docker run的阶段配置参数。所以需要commit一个新的环境。也许使用dockerfile能解决???待验证
#sudo docker commit containerID new_image_name(新镜像名)
sudo docker commit 87505434bd20 ros2_ssh
#sudo docker commit containerID 镜像名称
#查看新镜像
sudo docker images
#映射容器端口22到服务器端口37
sudo docker run -d -p 37:22 --name my_ros2_ssh ros2_ssh tail -f /dev/null
#例子:
#sudo docker run -d -p 37:22 --name my_container_name image_name tail -f 空设备文件
#其中, 使用 tail -f /dev/null 命令作为容器的主进程,它会阻塞并保持容器运行状态。/dev/null 是一个空设备文件,tail -f 命令会持续追踪该文件,实际上不会有任何输出。
两种登录方式:
A。本机端开启新终端,远程登陆docker
ssh -p 37 freja@xx.x.x.x
ssh -p 服务器被映射端口 容器用户名@<服务器地址>
B。服务器登录docker
#进入容器my_ros2_ssh
sudo docker exec -it my_ros2_ssh /bin/bash
方式A验证成功后,可以通过配置vscode的C:/user/.ssh/config的文件,远程登录docker
本机端开启终端
ssh -p 22 服务器用户名@服务器地址
服务器端执行代码,注意端口要选择没有使用端口号
#设置服务器上端口防火墙
sudo ufw status #查看状态,如果status:inactive,
sudo ufw enable #打开防火墙
sudo ufw allow 39/tcp #允许使用37端口号
sudo ufw status verbose #查看防火墙的详细配置
#创建容器
sudo docker run -d -p 39:22 --name my_ros2_ssh ros2_ssh tail -f /dev/null
#进入容器
sudo docker exec -it my_ros2_ssh /bin/bash
容器端代码
#查看配置文件
vim /etc/ssh/sshd_config
#重启ssh服务
service ssh restart
#设置容器的用户名和密码
adduser <username>
直接关闭终端,不要退出,不要停止容器,保持容器持续运行状态
本机端开启新终端
ssh -p 39 username@服务器地址
docker save -o <output-file-name>.tar <image-name>
其中:
是你要保存的输出文件的名称(包括路径),使用 .tar 扩展名,例如 myimage.tar。 是要保存的镜像的名称或 ID。例如,要保存名为 myimage 的镜像到 myimage.tar 文件中,可以运行以下命令:
docker save -o myimage.tar myimage
sudo docker stop container_name
sudo docker start container_name
sudo docker exec -it container_name /bin/bash
service ssh restart #在容器内重启ssh服务,这一行是关键
exit
删除不需要的容器
sudo docker rm container_name
尽管文件实际上存在,可能是因为编译器无法找到包含文件的路径。
要解决这个问题,你可以在 VS Code 中配置正确的包含路径。以下是一些可能的解决方法:
使用 c_cpp_properties.json 文件:在你的工作区中,可以创建一个名为 .vscode 的文件夹,并在其中创建一个名为 c_cpp_properties.json 的文件。在该文件中,添加以下内容
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/foxy/include" // 添加 ROS 2 的 include 路径
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
确保将 /opt/ros/foxy/include 替换为你所使用的 ROS 2 版本的正确路径。