文章目录

  • 一、整个流程
  • 1. 安装docker
  • 2. 拉取一个基础的docker镜像
  • 方式1: 命令交互创建dockerHub已有的镜像
  • 方式2:编写Dockerfile文件
  • 3. 通过镜像生成容器
  • 3.1 查看所有镜像
  • 3.2 通过镜像生成容器
  • 3.2.1 通过指令生成镜像
  • 3.2.2 编写脚本.sh进入docker镜像
  • 4. 进入容器之后
  • 5. 保存对容器做的修改至镜像
  • 6. 打包本地-->tar
  • 7. 上传镜像到dockerHub
  • 二、多个终端


一、整个流程

1. 安装docker

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates software-properties-common curl
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo service docker start
sudo chmod 777 /var/run/docker.sock

2. 拉取一个基础的docker镜像

方式1: 命令交互创建dockerHub已有的镜像

例1:拉取一个ubuntu20.04

docker pull ubuntu:20.04
#docker pull ubuntu:【tag】

例2:拉取Ubuntu18.04和对应版本的ros

docker pull osrf/ros:melodic-desktop-full

提示:这里的ubuntu:20.04osrf/ros:melodic-desktop-full可以通过https://hub.docker.com进行搜索

方式2:编写Dockerfile文件

docker build -t xhglz/cvlife:orbslam3 -f Docker/Dockerfile .
# docker build -t 【镜像名称】:【版本】 -f 【Dockerfile 文件地址】 .

【镜像名称】规范:用户名/镜像名;例如:lessle6/ubuntu
注意:最后面一个英文句号 .
其中Dockerfile 文件如下:

FROM osrf/ros:melodic-desktop-full
USER root
ENV DEBIAN_FRONTEND noninteractive
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV HOME=/root SHELL=/bin/bash
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn

RUN apt-get update -q --fix-missing && \
    apt-get -y install --no-install-recommends apt-utils software-properties-common && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE && \
    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE && \
    add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u

RUN apt-get update -q --fix-missing && \
    apt-get install -y --no-install-recommends --allow-unauthenticated \
    build-essential cmake gcc g++ clang git pkg-config libpython2.7-dev python-pip libusb-1.0-0-dev \
    libgl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols libglew-dev libglfw3-dev \
    libatlas-base-dev libgoogle-glog-dev libgflags-dev libgtk2.0-dev libavcodec-dev libavformat-dev \
    libswscale-dev librealsense2-dkms librealsense2-utils librealsense2-dev librealsense2-dbg \
    ros-melodic-uvc-camera ros-melodic-image-view ros-melodic-usb-cam python-catkin-tools \
    python-rosdep python-rosinstall python-rosinstall-generator python-wstool

# RUN git config --global http.proxy http://127.0.0.1:7890
# RUN git config --global http.postBuffer 20000000

ENV EIGEN3_VERSION="3.1.0"
RUN git clone https://gitlab.com/libeigen/eigen.git && \
    cd eigen && git checkout tags/${EIGEN3_VERSION} && \
    mkdir build && cd build && \
    cmake -DCMAKE_BUILD_TYPE=RELEASE \
          -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
    cmake --build . && make install

ENV Pangolin_VERSION="v0.6"
RUN git clone https://github.com/stevenlovegrove/Pangolin.git && \
    cd Pangolin && git checkout tags/${Pangolin_VERSION} && \
    mkdir build && cd build && \
    cmake -DCMAKE_BUILD_TYPE=RELEASE \
          -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
    cmake --build . && make install

# ENV OPENCV_VERSION="3.2.0"
# RUN git clone https://github.com/opencv/opencv.git && \
# RUN cd /home/lessle6/project/ORB-SLAM3-Docker-main/opencv && \
#     git checkout tags/${OPENCV_VERSION} && \
#     mkdir build && cd build && \
#     cmake -DCMAKE_BUILD_TYPE=RELEASE \
#           -DCMAKE_INSTALL_PREFIX=/usr/local \
#           -DENABLE_CXX11=ON \
#           -DENABLE_PRECOMPILED_HEADERS=OFF \
#           -DWITH_CUDA=OFF \
#           -DBUILD_DOCS=OFF \
#           -DBUILD_EXAMPLES=OFF \
#           -DBUILD_TESTS=OFF \
#           -DBUILD_PERF_TESTS=OFF .. && \
#     make -j$(nproc) && make install

RUN apt-get clean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /root/opencv /root/eigen /root/Pangolin

RUN ( \
    echo 'source /opt/ros/melodic/setup.bash'; \
) > /root/.bashrc

3. 通过镜像生成容器

3.1 查看所有镜像

docker images

3.2 通过镜像生成容器

3.2.1 通过指令生成镜像

(1)是否带显卡的指令

case1: 使用所有显卡
docker run -it --gpus all -v /home:/home/ ubuntu:20.04 /bin/bash
case2: 指定显卡
例如:docker run -it --gpus '"device=1"' -v /home:/home/ ubuntu:20.04 /bin/bash
例如:docker run -it --gpus '"device=1"' -v /home/project:/home/ orbslam3:2.0 /bin/bash
case3:不使用显卡
docker run -it -v /home1:/home2/ ubuntu:20.04 /bin/bash

(2)参数介绍

-it:交互式终端
--gpus:显卡
-v 磁盘挂载 真实环境地址:容器内地址
-p 主机端口:容器端口
ubuntu:20.04 镜像名:[TAG]
/home/project:/home  把真实主机/home/project映射到docket的/home
3.2.2 编写脚本.sh进入docker镜像

docker文件:

xhost +local:root;
docker run -it --privileged=true --net=host \
	-p 11311:11311 \
  --env="DISPLAY" \
  --env="QT_X11_NO_MITSHM=1" \
  --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
  --volume="/dev:/dev" \
  -v /home/lessle6/datasets:/home/datasets \
  -v /home/lessle6/project:/home/project \
  -v /usr/local/cuda-11.3:/usr/local/cuda \
  --gpus all\
  lala:1.0 /bin/bash

(2)参数介绍

图形界面:
xhost +local:root;
--env="DISPLAY"
--env="QT_X11_NO_MITSHM=1"
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--volume="/dev:/dev" \

--net=host 指定容器的网络模式
--gpus:显卡
-v 磁盘挂载 真实环境地址:容器内地址
-p 主机端口:容器端口
 基于镜像lala:1.0生成容器

4. 进入容器之后

做一些事情,比如安装新的库,跑代码

5. 保存对容器做的修改至镜像

命令:docker commit -m="描述信息,类似git提交的信息" -a="作者" 容器id 镜像名:[TAG]
tip:注意不要直接退出 如果有对容器修改,新开终端commit
tip: 容器id:在外面查看容器id: docker ps 或者命令行前面的数字
例如:docker commit -m="orbslam_lib" -a="less6" 3bb8618abb26 orbslam3:1.0
tip:这里的镜像名:[TAG]可以和之前一样(那就覆盖了),也可以不一样,这样又创建了新的容器。

6. 打包本地–>tar

(1) docker save -o xxx.tar imagexxx # 当前路径下会生成一个xxx.tar
例如:docker save -o /home/lessle6/project/cnn-vins-dockerImage.tar less66/lala:1.0

(2)当前路径生成一个xxx.tar.gz压缩包
tar -zcvf xxx.tar.gz     xxx.tar   

(3)解压缩
tar -zxvf xxx.tar.gz  #j解压缩

(4)load
docker  load  <  xxx.tar     # 生成的镜像跟之前打包的镜像名称一样

7. 上传镜像到dockerHub

(1)使用docker hub 规范修改镜像的标签,注意命令的前后不能有空格
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>] 
例如:docker tag lala:1.0 less66/lala:1.0

(2)登录
docker login -u less66 

(3)push
docker push less66/lala:1.0

二、多个终端

docker ps #查看容器,获取容器ID:CONTAINER IDCONTAINER ID
docker exec -it [CONTAINER IDCONTAINER ID] bash