• 对服务器上的容器进行端口映射:远程登录


    环境示意图

    本机->服务器->docker容器

    注意此处是有三个机器的

    1. 本机,实际操纵的电脑或笔记本,有可视化。
    2. 服务器,本机操作的远程服务器或者工作站。
    3. docker容器,配置在服务器上的虚拟环境。
      如果想要登录docker容器,通常是ssh到服务器,然后docker exec到容器。需要执行两个步骤。
      如果想本机直接一步ssh登录到docker容器。需要将docker的22端口映射到服务器一个没有使用的端口.例如,37。也就是登录服务器端口22(默认)是登录到服务器。登录到docker只需要将端口参数修改为映射端口即可。另外为了登录docker,root用户可能不好直接登录,需要docker容器除了root用户之外,创建一个新的用户。
      综上,登录docker需要服务器地址,服务器被映射端口,docker用户名。即:ssh -p 映射端口 username@服务器地址
      步骤:
      1.本机端开启终端
    ssh -p 22 服务器用户名@服务器地址
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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。
    直接关闭终端,不要退出,不要停止容器,保持容器持续运行状态
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    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 命令会持续追踪该文件,实际上不会有任何输出。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    两种登录方式:

    A。本机端开启新终端,远程登陆docker

    ssh -p 37 freja@xx.x.x.x
    ssh -p 服务器被映射端口 容器用户名@<服务器地址>
    
    • 1
    • 2

    B。服务器登录docker

    #进入容器my_ros2_ssh
    sudo docker exec -it my_ros2_ssh /bin/bash
    
    • 1
    • 2

    方式A验证成功后,可以通过配置vscode的C:/user/.ssh/config的文件,远程登录docker

    使用配置好ssh server的镜像

    本机端开启终端

    ssh -p 22 服务器用户名@服务器地址
    
    • 1

    服务器端执行代码,注意端口要选择没有使用端口号

    #设置服务器上端口防火墙
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    容器端代码

    #查看配置文件
    vim /etc/ssh/sshd_config
    #重启ssh服务
    service ssh restart
    #设置容器的用户名和密码
    adduser <username>
    直接关闭终端,不要退出,不要停止容器,保持容器持续运行状态
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    本机端开启新终端

    ssh -p 39 username@服务器地址
    
    • 1

    配置好的容器保存为新的镜像

    docker save -o <output-file-name>.tar <image-name>
    
    • 1

    其中:

    • 是你要保存的输出文件的名称(包括路径),使用 .tar 扩展名,例如 myimage.tar
    • 是要保存的镜像的名称或 ID。

    例如,要保存名为 myimage 的镜像到 myimage.tar 文件中,可以运行以下命令:

    docker save -o myimage.tar myimage
    
    • 1

    重启容器后导致无法ssh

    sudo docker stop container_name
    sudo docker start container_name
    sudo docker exec -it container_name /bin/bash
    service ssh restart #在容器内重启ssh服务,这一行是关键
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5

    删除不需要的容器

    sudo docker rm container_name
    
    • 1

    VS Code 中遇到 “cannot open source file” 错误

    尽管文件实际上存在,可能是因为编译器无法找到包含文件的路径。

    要解决这个问题,你可以在 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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    确保将 /opt/ros/foxy/include 替换为你所使用的 ROS 2 版本的正确路径。

  • 相关阅读:
    深入浅出排序算法之堆排序
    免死金牌?最容易被甩锅的“精神疾病”(非抑郁症)
    聊聊 mysql 事务?(二:redo log保证事务持久性)
    day44 类和对象
    身体是革命的本钱,希望大家编程之余努力搞好身体
    FastAPI 学习之路(二)
    HTML5 游戏开发实战 | 贪吃蛇
    新型多功能6轴小型机器人
    073:vue+openlayers拖拽实现放大所选区域 (DragZoom示例代码)
    用HTML+CSS做一个漂亮简单的音乐网站
  • 原文地址:https://blog.csdn.net/sinat_21699465/article/details/133694003