ubuntu docker ROS主从机配置 screen ssh基本使用方法

目录

1.docker安装

2.docker简单命令 

 3.镜像的使用

 4.主从机配置

5.screen简单使用

6.SSH远程登录

 7.docker进阶使用


部分参考https://blog.csdn.net/qq_42800654/article/details/125470763?spm=1001.2014.3001.5502

 部分issue已经commit在原博客下

1.docker安装

sudo apt-get -y install docker.io

2.docker简单命令 

查看已有镜像

sudo docker images

 删除镜像

sudo docker rmi 镜像名字
或者
sudo docker rmi 镜像名字 -f (-f表示强制)

查看所有容器

sudo docker ps    (查看运行着的容器)

sudo docker ps -a (-a表示查看所有容器)

 让运行着的docker容器停止

sudo docker stop 容器名字

删除容器

sudo docker rm 容器名字
或者
sudo docker rm 容器名字 -f

 退出容器

终端输入exit
或者
Ctrl + D

 保存镜像

sudo docker commit 容器名字 镜像名字

镜像的导出和加载

docker save -o 名字.tar 镜像名字
docker load -i 名字.tar	

 3.镜像的使用

先load一下镜像的tar文件,以我自己的lamp为例

sudo docker load -i lamp.tar

一定要加sudo不然会报错 

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post

然后查看镜像列表就能看到有这么一个镜像了

 接着将其实例化为容器

sudo docker run -it --gpus all lamp:v2

 --gpus all表示会使用gpu

 若要共享宿主机的所有网络 加上--network host

sudo docker run -it --gpus all --network host lamp:v2

 进入容器

docker exec -it ec5b035002de /bin/bash

假如报错 Error response from daemon: Container ******* is not running说明容器没有运行

使用以下命令让容器运行起来

sudo docker start 容器名字

这样就能进入容器了

 

 4.主从机配置

我的这个镜像里有一个安装好lamp的ubuntu18.04,之后就相当于有了多台电脑了,可以配置一下主从机跑多机协同探测。

将docker里面的Ubuntu配置成主机,电脑本来的ubuntu配置成从机,反过来的话就按照类似步骤配置一下。

使用ifconfig查看docker容器内的ubuntu的IP以及本来电脑ubuntu的IP

docker的

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第1张图片

自己电脑的

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第2张图片

 然后改docker的~/.bashrc文件,和自己电脑的~/.zshrc(我用的是zsh)如果是bash的话就是~/.bahsrc文件。

docker(主机)

在.bashrc里面添加以下两行

export ROS_HOSTNAME=主机IP
export ROS_MASTER_URI=http://主机IP:11311

自己电脑从机

添加以下两行

export ROS_HOSTNAME=从机IP
export ROS_MASTER_URI=http://主机IP:11311

加完之后分别source一下

效果:

(1)改完之后从机开roscore会提示warning

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第3张图片

 (2)因为播放rosbag必须开roscore,所以就在主机开roscore,从机播包演示一下

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第4张图片

左终端为docker右终端为自己电脑ubuntu,这两个终端相互独立。

5.screen简单使用

因为docker只能开一个终端,这就令人十分抓狂,第一种方法是使用screen,类似于一个虚拟桌面,可以实现当前窗口和任务分离,也就是可以后台运行程序。

首先安装screen

sudo apt-get install screen

 screen简单命令

列出当前所有的session

screen -ls

创建一个新的窗口

screen -S 窗口名

进入一个窗口 

screen -r 窗口名

退出一个窗口

Ctrl + A + D

 清除dead状态窗口

screen -wipe

shell脚本编写示例 ,创建一个叫 xxx.sh的shell文件

#! /bin/bash
echo "roscore start"
nohup roscore &
sleep 10
echo "rostopic list start"
screen -d -m -S topic bash -c 'rostopic list; exec /bin/bash'

 Linux screen命令 | 菜鸟教程

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第5张图片  

 这样在docker中执行上面的shell文件,在从机播放rosbag的时候就可以在主机docker终端内查看rostopic了,因为rostopic命令在这里只执行一次,所以在roscore开了之后10s内播放rosbag,不然可能topic list看不到

过程如下

在doocker内 bash xxx.sh执行脚本

在从机播包

使用screen -r 看那一下topic窗口

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第6张图片

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第7张图片

最后别忘了关掉他们

pkill ros
pkill screen

6.SSH远程登录

https://blog.csdn.net/li528405176/article/details/82810342?spm=1001.2014.3001.5506

(1)docker添加新用户

 上面使用screen在docker里面还是用着不怎么方便,所以这里使用ssh远程登录这个docker,之后使用vscode调试代码。

进入容器后默认为root用户,使用passwd root命令更改密码,虽然显示更改成功,但是在从机处ssh登录时无论如何也登录不进去,密码不正确。

经过一天的搜索后,放弃了更改root密码,决定另辟蹊径,干脆在docker里面再创建一个新用户。

创建新用户

sudo adduser 用户名

 输入两次密码   输入 回车 * N   最后yes 

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第8张图片

给新创建的用户添加权限,不然普通用户执行sudo会报错 xxxis not in the sudoers file. This incident will be reported.

chmod u+w /etc/sudoers
vim /etc/sudoers
模仿root那一行在下面添加一行
用户名 ALL=(ALL:ALL) ALL

切换到新创建的用户

su 用户名

 之前root用户留下来的文件是只读的,

可以用sudo chmod 777或者sudo chmod u+w为其添加权限。

比较粗暴的 sudo chmod 777 * 全部添加。

(2)从机远程登录

ssh 主机用户名@主机IP地址

 输入密码就可以ssh进去了

(3) vscode SSH远程登录

首先安装一下扩展Remote-SSH

然后Ctrl + shift + P

输入RemoteSSH 找到add new SSH host

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第9张图片

 写你要ssh的远程主机IP

选第一个config

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第10张图片

之后回到第一布,选择connect to host

ubuntu docker ROS主从机配置 screen ssh基本使用方法_第11张图片

 选择刚才输入的IP

 

在新窗口中输入密码就可以ssh进去了 

 我之前开过这个文件夹所以有记录,如果想进行操作的话就Ctrl + ~打开集成终端正常操作吧。

 ubuntu docker ROS主从机配置 screen ssh基本使用方法_第12张图片

 有的目录下的东西不能修改,使用命令 sudo chmod 777 -R 目标目录   就ok了

 7.docker进阶使用

举个例子:比如我们现在有电脑1(或者服务器)和电脑2都连接在局域网下,docker的容器在电脑1,而我们自己在电脑2上,通过vscode(也就是第六部分)我们可以ssh连接到电脑1,在vscode的集成终端可以打开电脑1里面的容器,然而这样我们使用code命令只能打开电脑1自己的(也就是主机)的任何文件和代码,而不能使用vscode进一步打开容器中的代码和文件,只能用vim,这样太麻烦了。

于是我们把我们的代码放在docker外面(电脑1的某个地方,也就是主机的某个地方)

也就是docker 的Volume挂载操作

【docker系列】使用Volume方式挂载容器数据卷_字母哥哥的博客-CSDN博客_docker volume 挂载文件

 目前刚学了简单操作

就是在启动镜像时,多添加一些参数

-v 主机里面想要在docker环境下运行的目录:docker容器中的目录(可以是原来没有的,会自动创建一个)

以我上面的举例就是

sudo docker run -it -v /home/mwy/lamp_ws:/home/mwy/ --gpus all lamp:v3

 可以看到docker的/home下多了mwy目录

 可以看到我们主机里面的代码已经在里面了

而且可以在docker环境内 、电脑1内(可通过vscode)、电脑2(ssh连接到电脑1)(可通过vscode)对同一份东西进行更改。

你可能感兴趣的:(ubuntu,容器,linux,docker,ssh)