目录
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在原博客下
sudo apt-get -y install docker.io
查看已有镜像
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
先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 容器名字
这样就能进入容器了
我的这个镜像里有一个安装好lamp的ubuntu18.04,之后就相当于有了多台电脑了,可以配置一下主从机跑多机协同探测。
将docker里面的Ubuntu配置成主机,电脑本来的ubuntu配置成从机,反过来的话就按照类似步骤配置一下。
使用ifconfig查看docker容器内的ubuntu的IP以及本来电脑ubuntu的IP
docker的
自己电脑的
然后改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
(2)因为播放rosbag必须开roscore,所以就在主机开roscore,从机播包演示一下
左终端为docker右终端为自己电脑ubuntu,这两个终端相互独立。
因为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命令 | 菜鸟教程
这样在docker中执行上面的shell文件,在从机播放rosbag的时候就可以在主机docker终端内查看rostopic了,因为rostopic命令在这里只执行一次,所以在roscore开了之后10s内播放rosbag,不然可能topic list看不到
过程如下
在doocker内 bash xxx.sh执行脚本
在从机播包
使用screen -r 看那一下topic窗口
最后别忘了关掉他们
pkill ros
pkill screen
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
给新创建的用户添加权限,不然普通用户执行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
写你要ssh的远程主机IP
选第一个config
之后回到第一布,选择connect to host
选择刚才输入的IP
在新窗口中输入密码就可以ssh进去了
我之前开过这个文件夹所以有记录,如果想进行操作的话就Ctrl + ~打开集成终端正常操作吧。
有的目录下的东西不能修改,使用命令 sudo chmod 777 -R 目标目录 就ok了
举个例子:比如我们现在有电脑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)对同一份东西进行更改。