在第一个终端:
sudo docker pull osrf/ros:kinetic-desktop
sudo docker run -it ros:kinetic
source ros_entrypoint.sh
roscore
在另外一个终端:
sudo docker ps -l
sudo docker exec -it compassionate_cartwright bash
source ros_entrypoint.sh
rostopic list
安装RabbitMQ
sudo docker pull rabbitmq
sudo docker run -di --name rabbitmq -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq
sudo docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_management
新建一个Dockerfile
FROM ros:kinetic-ros-base
WORKDIR /root
# ROS setting
RUN /bin/bash -c "mkdir -p robot_ws/src"
#RUN cd robot_ws/src && /bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_init_workspace"
#RUN cd robot_ws && /bin/bash -c "source /opt/ros/kinetic/setup.bash; catkin_make"
#RUN cd /root && echo source /root/robot_ws/devel/setup.bash >> .bashrc
ENV ROS_PACKAGE_PATH=/root/robot_ws:$ROS_PACKAGE_PATH
ENV ROS_WORKSPACE=/root/robot_ws
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y ssh-client
#RUN DEBIAN_FRONTEND=noninteractive ssh-keygen
# clone repository
WORKDIR /root
#RUN cd robot_ws && git clone [email protected]:robots/robot_ws_src.git src --recursive
构建镜像
sudo docker build -t robot .
运行容器
sudo docker run -it robot
重新构建镜像
整体思路:运行一个容器,在运行容器的基础上添加需要的服务,然后导出为新的images。
sudo docker ps -a
sudo docker commit 845e8472f250 centos:v1
命令中的一串数字是刚才运行container’s ID
数字后面的是新建镜像的repository:tag
docker push 注意事项
sudo docker login -u username -p password
sudo docker images
sudo docker tag imagename:tag youraccount/imagename
sudo docker push youraccount/imagename
sudo docker pull youraccount/imagename
安装docker-compose
pip install pyrsistent==0.16.1
运行docker(arm)
sudo docker run --net host -it --privileged -v /dev:/dev 116.62.202.42:5001/robot_arm_v1
运行docker(amd)
sudo docker run --net host -it --privileged -v /dev:/dev 116.62.202.42:5001/robot_amd_v1
docker自启动ros
sudo docker run --net host -it --privileged -v /dev:/dev 116.62.202.42:5001/robot_amd_v4 /sbin/init
docker自启动ros(后台启动)
sudo docker run --net host -itd --privileged -v /dev:/dev 116.62.202.42:5001/robot_amd_v4 /sbin/init
docker自启动ros(后台启动)带name
sudo docker run --net host -itd --name robot --privileged -v /dev:/dev 116.62.202.42:5001/robot_amd_v4 /sbin/init
docker容器开机自启动
sudo docker run --net host -itd --name robot --restart=always --privileged -v /dev:/dev 116.62.202.42:5001/robot_amd_v4 /sbin/init
关闭docker容器开机自启动
sudo docker ps -l
sudo docker stop CONTAINER ID
sudo docker rm CONTAINER ID
sudo docker run --net host -itd --name robot --restart=no --privileged -v /dev:/dev 116.62.202.42:5001/robot_amd_v4 /sbin/init
在另外一个窗口
sudo docker exec -it robot bash
docker login 报【Error response from daemon: Get https://172.17.8.201:8002/v2/: http: server gave HTTP response to HTTPS client】
原因:docker镜像仓库暂不支持https
解决方案:
在”/etc/docker/“目录下,创建”daemon.json“文件(如果有的话直接覆盖)。在文件中写入
{ "insecure-registries":["172.17.8.201:8003"] }
然后重启docker服务
就OK啦
docker 传输文件
sudo docker cp 本地文件的路径 container_id:<docker容器内的路径>
登录docker
sudo docker login -u touchair -p P@ssw0rd 116.62.202.42:5001
sudo docker push 116.62.202.42:5001/robot_arm_v1
sudo docker push 116.62.202.42:5001/robot_amd_v1
arm版本
sudo docker pull 116.62.202.42:5001/robot_arm_v1
amd版本
sudo docker pull 116.62.202.42:5001/robot_amd_v1
安装rabbitmq
sudo docker pull rabbitmq:management
sudo docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
镜像加速
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com" #官方提供的国内镜像加速器地址
],
"insecure-registries": ["116.62.202.42:5001"]
}
重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
docker运行rabbitmq冲突
docker: Error response from daemon: Conflict. The container name "/rabbitmq" is already in use by container
sudo docker ps -a
sudo docker stop CONTAINER ID
sudo docker rm CONTAINER ID
sudo docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
关于udev无法启动的问题* udev does not support containers, not started
Then, I change the init script in /etc/init.d/udev, comments next 2 parts:
1) Comments next:
#if ! ps --no-headers --format args ax | egrep -q '^\['; then
# log_warning_msg "udev does not support containers, not started"
# exit 0
#fi
2) Comments next:
#if [ ! -w /sys ]; then
# log_warning_msg "udev does not support containers, not started"
# exit 0
#fi
QT安装报错
apt-get install libx11-dev libxext-dev libxtst-dev
完全删除安装的docker安装包
dpkg -l | grep docker
sudo apt remove --purge docker-ce docker-ce-cli docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
设置Docker容器日志大小
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"insecure-registries": ["116.62.202.42:5001"]
}
max-size=500m,意味着一个容器日志大小上限是500M,
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json
注:设置后只对新添加的容器有效。
重启docker守护进程
sudo systemctl daemon-reload
sudo systemctl restart docker
docker宿主机通过htop查看进程,发现有agetty进程100%占用CPU资源
解决方法
引起这个问题的原因是在使用"docker run"运行容器时使用了 "/sbin/init"和"--privileged"参数
在宿主机以及Container中运行下述命令
sudo systemctl stop [email protected]
sudo systemctl mask [email protected]