文章目录
- 一、整个流程
- 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.04、osrf/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