主机环境
系统 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
WORKDIR /home/nuctech
USER nuctech
ENV DISPLAY :0
CMD imagename
EOF
注释:
ros:kinetic-robot:为ros版本,可根据所需版本获取
imagename :镜像build名称前后保持一致
3 设置环境变量(物理机)
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
可以编辑这个文件将以上两个值写入,便可永久生效每次重启后便可不在设置。
vim /etc/environment
4 生成临时文件.docker.xauth(物理机)
在/tmp目录下,生成临时文件.docker.xauth
sudo xauth nlist :0 | sed -e ‘s/^…/ffff/’ | xauth -f $XAUTH nmerge -
5 创建ROS容器(物理机)
sudo docker run -ti --name gui -v
X
S
O
C
K
:
XSOCK:
XSOCK:XSOCK -p 3306:3306 -p 8080:8080 -v
X
A
U
T
H
:
XAUTH:
XAUTH:XAUTH -e XAUTHORITY=$XAUTH imagename /bin/bash
如提示输入登录密码,则输入登录密码即可
创建成功自动进入容器
apt-get update(容器内)
apt-get install -qqy x11-apps(容器内)
–name 后为容器名称
–imagename 镜像名称
-p 标识来指定容器端口绑定到主机端口。绑定后访问主机ip:端口便可访问容器程序,若需绑定多个 端口可多次使用-p参数
6 容器导入导出(物理机)
6.1 导出容器–docker export
导出容器快照(建议容器暂停后操作)
sudo docker export -o 容器快照名.tar container_name
或
sudo docker export container_id > 容器快照名.tar
-o表示输出到
例:使用sudo docker ps -a 查看所有容器
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
F91CAB8069E4 kinetic-robot … … … … gui
使用以上容器id导出操作如下:
sudo docker export F91CAB8069E4>gui.tar
导出完成后,会产生该快照文件
6.2 导入容器–docker import
可以随时导入容器快照
sudo docker import [options] file|URL|- [REPOSITORY[:TAG]]
例:使用sudo docker images 查看所有镜像信息
sudo docker import gui.tar gui:wqtest
sudo docker images
PEPOSITOTY TAG IMAGE ID CREATED SIZE
gui:wqtest latest 1d90cb6b6694 1min ago 1.51GB
导入镜像后创建容器重复2-5章节
注:gui.tar 导入容器的快照名称
gui:wqtest 为容器导入后设置镜像名称及tag版本
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
X
S
O
C
K
:
XSOCK:
XSOCK:XSOCK -v
X
A
U
T
H
:
XAUTH:
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 docker容器中文件的上传与下载(物理机)
8.1 上传文件
sudo docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
[OPTIONS]:保持源目标中的链接
例:sudo docker cp /root/test.txt ecef8319d2c8:/root/
将当前系统/root/test.txt拷贝到容器id为ecef8319d2c8的/root/目录
8.2 下载文件
sudo docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
[OPTIONS]:保持源目标中的链接
sudo 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.查看镜像 sudo docker images
4.删除镜像 sudo 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.进入容器 sudo docker exec -it containerid/name /bin/bash
10.退出容器exit
11.关闭容器sudo docker stop containerid/name
12.查看主机端口 sudo netstat -tlpn
13.来查看当前映射的端口配置sudo docker port containerid
14.创建文件夹 mkdir name
15.查看文件夹内容 ll
9.2 关机重启后进入容器需执行
1.XSOCK=/tmp/.X11-unix
2.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 containerid
6.sudo docker exec -it conatinerid /bin/bash
10 常见问题
docker.xauth
描述:
执行sudo xauth nlist :0 | sed -e ‘s/^…/ffff/’ | xauth -f
X
A
U
T
H
n
m
e
r
g
e
−
报
以
下
问
题
1
、
X
a
u
t
h
:
f
i
l
e
/
t
m
p
/
d
o
c
k
e
r
.
x
a
u
t
h
d
o
e
s
n
o
t
e
x
i
s
t
解
决
方
案
:
可
以
去
/
t
m
p
目
录
下
查
看
,
若
文
件
已
产
生
该
文
件
,
可
忽
略
该
问
题
2
、
d
o
c
k
e
r
.
x
a
u
t
h
为
目
录
不
可
写
解
决
方
案
:
方
案
一
:
关
机
重
启
,
再
次
设
置
环
境
变
量
方
案
二
:
删
除
/
t
m
p
下
d
o
c
k
e
r
.
x
a
u
t
h
文
件
夹
,
再
次
执
行
环
境
变
量
M
I
T
−
M
A
G
I
C
−
C
O
O
K
I
E
−
1
K
e
y
E
r
r
o
r
:
描
述
:
在
容
器
中
执
行
程
序
报
M
I
T
−
M
A
G
I
C
−
C
O
O
K
I
E
−
1
K
e
y
E
r
r
o
r
:
C
a
n
’
t
o
p
e
n
d
i
s
p
l
a
y
:
:
0
解
决
方
案
:
此
时
执
行
在
主
机
中
执
行
x
h
o
s
t
+
s
i
:
l
o
c
a
l
u
s
e
r
:
r
o
o
t
再
次
执
行
程
序
问
题
解
决
。
E
r
r
o
r
:
c
a
n
’
t
o
p
e
n
d
i
s
p
l
a
y
描
述
:
在
容
器
中
执
行
程
序
报
E
r
r
o
r
:
c
a
n
’
t
o
p
e
n
d
i
s
p
l
a
y
:
解
决
方
案
:
先
查
看
主
机
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: 解决方案: 先查看主机
XAUTHnmerge−报以下问题1、Xauth:file/tmp/docker.xauthdoesnotexist解决方案:可以去/tmp目录下查看,若文件已产生该文件,可忽略该问题2、docker.xauth为目录不可写解决方案:方案一:关机重启,再次设置环境变量方案二:删除/tmp下docker.xauth文件夹,再次执行环境变量MIT−MAGIC−COOKIE−1KeyError:描述:在容器中执行程序报MIT−MAGIC−COOKIE−1KeyError:Can’topendisplay::0解决方案:此时执行在主机中执行xhost+si:localuser:root再次执行程序问题解决。Error:can’topendisplay描述:在容器中执行程序报Error:can’topendisplay:解决方案:先查看主机DISPLAY的值echo $DISKPLAY若为空则依次在主机和容器中执行export DISPLAY=:0,若主机值不为空则仅在容器中执行即可,再次执行程序问题解决。
port is already allocated
描述:
创建容器时报port is already allocated
解决方案:
表示当前主机中已有容器占用该端口,可使用sudo netstat -tlpn
查看当前主机被暂用端口,此时修改当前映射的主机端口即可。
Unable to locate package x11-apps
描述:
容器内安装x11-apps报apt-get install -qqy x11-apps以上错误
解决方案:
更新下apt-get update源后再次执行apt-get install -qqy x11-apps问题解决
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)