主机环境
系统Ubuntu 16.04
1安装docker
1.1在线安装
默认使用当前最新版本
1.更新apt包索引:
sudo apt-get update
2.安装以下包以使apt可以通过HTTPS使用存储库(repository):
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
3.添加Docker官方的GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4.使用下面的命令来设置stable存储库:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
5.再更新一下apt包索引:
sudo apt-get update
6.安装最新版本的Docker CE:
sudo apt-get install -y docker-ce
7.查看当前版本验证是否成功:
docker --version显示当前版本表示安装成功
2拉取镜像
将拉取的ros镜像,安装x11-apps用于弹出gui,设置display变量,进行build产生新镜像
sudo docker build -t imagename - << __EOF__
FROM ros:kinetic-robot
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD imagename __EOF__
注释:
ros:kinetic-robot:为ros版本,可根据拉取所需镜像及版本
imagename :镜像build名称前后保持一致
3设置环境变量
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
4生成临时文件.docker.xauth
在/tmp目录下,生成临时文件.docker.xauthsudo xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
5创建ROS容器
sudo docker run -ti --name gui -v $XSOCK:$XSOCK -p 3306:3306 -p 8080:8080 -v $XAUTH:$XAUTH -e XAUTHORITY=$XAUTH imagename /bin/bash
--name 后为容器名称
--imagename 镜像名称
-p 标识来指定容器端口绑定到主机端口。绑定后访问主机ip:端口便可访问容器程序,若需绑定多个 端口可多次使用-p参数
6 容器导入导出
6.1导出容器--docker export
可以随时导出容器快照
docker export -o 容器快照名.tar container_name
或
docker export container_id > 容器快照名.tar
-o表示输出到
例:
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
F91CAB8069E4 kinetic-robot ...... ...... ..... ..... gui
docker export F91CAB8069E4>gui.tar
导出完成后,会产生该快照文件
6.2 导入容器--docker import
可以随时导入容器快照
docker import [options] file|URL|- [REPOSITORY[:TAG]]
例:
sudo docker import gui.tar gui:wqtest
docker images
PEPOSITOTY TAG IMAGE ID CREATED SIZE
gui:wqtest latest 1d90cb6b6694 1min ago 1.51GB
7 ROS多机通信
目标:将2台主机中的容器可相互访问,相互操作
场景:有2台主机主机ip分别是主机A:192.168.28.161 主机B192.168.28.172
------------------------------------------------------------------------------------------------------
主机A:
进入容器中安装SVN客户端
sudo start docker newgui
sudo docker exec -it newgui /bin/bash
apt-get install subversion
主机B
sudo docker run -ti --name gui -p 3690:3690 -v $XSOCK:$XSOCK -v $XAUTH:$XAUTH -e XAUTHORITY=$XAUTH imagename /bin/bash
上图3690为SVN服务器默认端口。
apt-get install subversion //安装svn服务器
svnserve --version //显示版本表示安装成功
创建仓库、添加权限可参考以下连接
https://blog.csdn.net/zengsange/article/details/80618301
svnserve -d -r /usr/svn/ //启动SVN服务
本次用于测试创建仓库名为repository
测试通信:
主机A-newgui容器内:
cd /svn/test
svn co svn://192.168.28.172:3690/repository //将主机B gui容器中svn服务器代码checkout到本地,
touch 161.txt /
svn add 161.txt
svn ci -m“192.168.28.161”161.txt
主机B-svn容器内
cd /usr/test/repository
svn update
以上操作均成功,表示主机A-newgui容器和主机B-svn容器可通信
8.1上传文件
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
[OPTIONS]:保持源目标中的链接
例:docker cp /root/test.txt ecef8319d2c8:/root/
将当前系统/root/test.txt拷贝到容器id为ecef8319d2c8的/root/目录
8.2下载文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
[OPTIONS]:保持源目标中的链接
例:docker cp ecef8319d2c8:/root/test.txt /root/
将容器id为ecef8319d2c8的/root/test.txt下载到当前系统/root/目录中
9相关命令
9.1 docker相关命令
1.查看docker服务是否启动systemctl status docker
2.启动docker服务sudo systemctl start docker
3.查看镜像docker images
4.删除镜像 docker rmi images id
5.查看当前活动容器sudo docker ps
6.查看所有容器sudo docker ps -a
7.删除容器sudo docker rm containerid/names
8.启动容器sudo docker start containerid/name
9.容器内可使用exit退出容器 sudo docker exec -it containerid/name
10.关闭容器sudo docker stop containerid/name
11.查看主机端口 sudo netstat -tlpn
12.查看当前映射的端口配置docker port containerid容器端口
9.2关机重启后进入容器需执行
1.XSOCK=/tmp/.X11-unix2.XAUTH=/tmp/.docker.xauth
3.xhost +si:localuser:root
4.sudo xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
5.sudo docker start yourcontainer6.sudo docker exec -it yourconatiner /bin/bash
10常见问题
docker.xauth
描述:
执行sudo xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -报以下问题
1、Xauth: file /tmp/docker.xauth does not exist
解决方案:
可以去/tmp目录下查看,若文件已产生该文件,可忽略该问题
2、docker.xauth为目录不可写
解决方案:
方案一:关机重启,再次设置环境变量
方案二:删除/tmp下docker.xauth文件夹,再次执行环境变量
MIT-MAGIC-COOKIE-1 KeyError:
描述:
在容器中执行程序报MIT-MAGIC-COOKIE-1 KeyError:Can’t open display: :0
解决方案:
此时执行在主机中执行xhost +si:localuser:root再次执行程序问题解决。
Error:can’t open display
描述:
在容器中执行程序报Error:can’t open display:
解决方案:
先查看主机$DISPLAY的值echo $DISKPLAY若为空则依次在主机和容器中执行export DISPLAY=:0,若主机值不为空则仅在容器中执行即可,再次执行程序问题解决。
port is already allocated
描述:
创建容器时报port is already allocated
解决方案:
表示当前主机中已有容器占用该端口,可使用sudo netstat -tlpn
查看当前主机被暂用端口,此时修改当前映射的主机端口即可。