参考与前言

  1. Docker 官方教程 【英文】:https://docs.docker.com/get-started/
  2. Windows Docker 安装 | 菜鸟教程 (runoob.com)
  3. Docker 教程 | 菜鸟教程

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

如需要在ubuntu下使用 像绝哥说的 用多了就是几条指令 非常快速的... 这个为走捷径教程,建议通过目录进行所需的观看

常用命令

  1. 查看已有镜像 image

    docker images
  2. 删除对应镜像id的镜像

    docker rmi image_id
  3. 查看已有容器 containers

    docker ps -a
  4. 删除对应容器id的容器

    docker rm container_id
  5. 删除所有无名

    sudo docker rmi $(sudo docker images -q --filter "dangling=true")

如果想一次過將所有 container 停止及刪除, 執行以下指令:

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

0. 安装

docker

可以全球网络畅通的情况下:

Install Docker Engine on Ubuntu

  • docker engine

    sudo apt-get update
    sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io

国内镜像一键安装:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

nvidia-docker

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
&& curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi

1. 基础介绍

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

容器与镜像的关系类似于面向对象编程中的对象与类。

镜像 → 类;容器 → 对象

运行与参数

docker run -it ubuntu /bin/bash

docker run -it -e DISPLAY=$DISPLAY --net=host --gpus all \
--name kin_carla2 carlasim/carla:0.9.10.1 /bin/bash docker run -it --gpus '"device=1,2"' \
-v /data_shared/Docker/jcheng/workspace:/workspace \
-p 8010:6006 \
--name cj_01 cj/torch:1.10.0-cuda11.3-cudnn8-runtime /bin/zsh

参数说明:

  • i: 交互式操作。

  • t: 终端。

  • ubuntu: ubuntu 镜像名称

  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash,比如最后一条使用的是bin/zsh 也就是zsh Shell

  • --gpus all,也可以指定此容器可使用的gpu数量和设备,如果是数量的话 直接后接数字即可,如果是设备的话 如上 指标设备id,相关官方链接

  • --name kin_carla2 指明这个容器的名字,没有的话就是随机命名,有名字的话后面 docker start 可以直接接名字 省事

  • -p 的意思是把contrainer的端口映射到host上,例如 -p 8010:6006 的意思是把容器中6006端口映射到host的8010端口上

  • --shm-size 是设置容器共享内存的大小,默认是64M,如果要跑DDP 多GPU训练是不够的,根据模型大小按需要设置,建议直接拉满 (>30% RAM for ray)

  • -v host:container 是把host的folder映射到容器了,就不用再把 dataset 或结果来回拷了, 数据尽量不要直接存在容器里,不然重开容易很麻烦

停止结束

docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止

要退出终端,直接输入 exit:

启动一个已经停止的容器:

# 查看id
docker ps -a
# 根据id启动
docker start b750bbbcfd88 -i

端口映射

默认都是绑定 TCP 端口

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。
# 随机
docker run -d -P training/webapp python app.py
# 内部端口到指定主机端口
docker run -d -p 5000:5000 training/webapp python app.py
# 默认tcp
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py # udp
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py # 查看
docker port adoring_stonebraker 5000

这样我们就可以通过访问 127.0.0.1:5001 来访问容器的 5000 端口

如果要绑定 UDP 端口,后面加一个udp

docker port 命令可以让我们快捷地查看端口的绑定情况。

更多请查看官网文档:

Docker run reference

2. 制作上传

Dockerfile

from 杰哥 modify by 聪明,样例:

FROM carlasim/carla:0.9.10.1
LABEL maintainer="Kin Zhang <kin_eng@163.com>" ENV DEBIAN_FRONTEND noninteractive
RUN apt update
RUN apt install -y --no-install-recommends openssh-server
RUN apt install -y libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev
RUN apt install -y wget git zsh tmux vim g++
RUN apt install -y python3-matplotlib \
python3.7 \
python3.7-dev \
python3-setuptools \
python3-pip RUN pip3 install pandas
RUN pip3 install opencv-python # installing conda
RUN curl -o ~/miniconda.sh -LO https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
chmod +x ~/miniconda.sh && \
~/miniconda.sh -b -p /opt/conda && \
rm ~/miniconda.sh && \
/opt/conda/bin/conda clean -ya && \
/opt/conda/bin/conda create -n python37 python=3.7 numpy networkx scipy six requests RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.1.2/zsh-in-docker.sh)" -- \
-t robbyrussell \
-p git \
-p ssh-agent \
-p https://github.com/agkozak/zsh-z \
-p https://github.com/zsh-users/zsh-autosuggestions \
-p https://github.com/zsh-users/zsh-completions \
-p https://github.com/zsh-users/zsh-syntax-highlighting

build 制作

docker build -t nginx:v3 .
docker build -f Dockerfile /home/daisy/lifelong_learning/Cylinder3D/
docker build -t cylinder:v1 -f Dockerfile /home/daisy/lifelong_learning/Cylinder3D/

-t 命名:版本tag号

-f file从dockerfile里build,这里的Dockerfile正好是那里面的文件名字,也有其他从网页上拉取进行Build的

上传Hub

Docker 仓库管理

仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。

sudo chmod 666 /var/run/docker.sock
docker login
docker logout

上传自己的image

用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。

以下命令中的 username 请替换为你的 Docker 账号用户名

#
docker tag ubuntu:18.04 username/ubuntu:18.04 docker image ls
docker push username/ubuntu:18.04
docker search username/ubuntu

3. 更多操作 copy tmux

复制

ssh rsync 用法教程

  • 比scp快10+倍的命令, 尤其是有上万个文件要transfer,scp会很慢
rsync -rvz -e 'ssh -p 23333' --progress ./* $QWRAMWK05:/data_shared/Docker/jcheng/data/

container < - > host

# 从 host 到 容器
docker cp <src-path> <container>:<dest-path>
# for example
docker cp "C:\ProcDump\procdump64.exe" sitecore-xm1_cm_1:"C:\"
docker cp "transfuser/log/" kin_carla_v5:/home/kin/transfuser # 从 容器 到 host
docker cp <container>:<src-path> <local-dest-path>
# for example
docker cp sitecore-xm1_cm_1:"C:\inetpub\wwwroot\App_Data\logs" "C:\"
docker cp elegant_lamarr:"/home/carla/PythonAPI/carla/dist/carla-0.9.10-py3.7-linux-x86_64.egg" "/home/kin/Desktop"

多开终端

How to open multiple terminals in docker?

问题来源于,如果你是exit ctrl+D的话, docker start docker attach就会进入到同一个终端,那么C掉就同步C掉了

所以在自己终端中输入,即可在相同容器中打开另一个终端

docker exec -it <container> /bin/bash

例如一下,下图左图可知,attach都是attach到同一个终端,所以右图第一步CTRL+C的时候 是都C掉了,右图第二和三步给出了解法就是:②是attach上去的,③则是exec -it 容器 /bin/bash多开了一个可用终端,同时③的杀死不会影响②

4. Tmux 调试

这里主要介绍默认的状态

开启关闭

  • 开启tmux,和terminator不一样的是tmux是一个需要运行的app,称作一个session
$ tmux new -t "name_as_you_like"
# or 直接
$ tmux
  • 挂起tmux, 可以回到正常的terminal
$ tmux detach
  • 回到挂起的 tmux
# 可以先查看所以运行的session
$ tmux ls
# 打开原来挂起的session
$ tmux attach -t "name_as_you_like"
  • 统一关闭命令,对下面的窗口操作也适用: ctrl + d

窗口操作

  • 创建多个window, 可以理解为普通terminal中ctrl-shift-t 的操作, 使用快捷键
ctrl + b  c

  • 窗口切换, 使用快捷键 ctrl + b 0/1/2/3 后面是窗口号,到几号窗写几号

  • 分屏, 纵向分屏 ctrl + b %, 横向分屏 ctrl + b “

  • 分屏后的切换,ctrl + b up_arrow ,后面是方向键

  • 分屏后每个块是没有scroll bar的,想要往上划需要 ctrl + b [ 或者是 ctrl + b page_up

完整的cheat sheet: Tmux Cheat Sheet & Quick Reference

VSCODE

如何在vscode打开已开启的container中的文件夹:

电脑-主机-服务器 config

如果 从 自己电脑 - hk主机 - 服务器

首先需要把hk主机上的ssh key复制过来,比如下面的config是在自己的电脑 ~/.ssh/id_rsa_ust

需要复制的是: id_rsa.pub 和 id_rsa → 记得改名字 不然会和之前的重复,比如我加了一个后缀_ust

经耿博提醒 需要进行 chmod 600 id_rsa 开权限

Host Server8
HostName xxxx.ust.hk
IdentityFile ~/.ssh/id_rsa_ust
Port xxx
ProxyJump Kin_hkust
User kinzhang
IdentitiesOnly yes Host Server12
HostName xxxx.ust.hk
IdentityFile ~/.ssh/id_rsa_ust
Port xxx
ProxyJump Kin_hkust
User kinzhang
IdentitiesOnly yes Host Server13
HostName xxxx.ust.hk
IdentityFile ~/.ssh/id_rsa_ust
Port xxx
ProxyJump Kin_hkust
User kinzhang
IdentitiesOnly yes

git 配置:

git config --global user.email "kin_eng@163.com"
git config --global user.name "kin_docker"

A. 其他

inside container 时间同步:https://www.jianshu.com/p/ce5408b33972

ssh key

因为有时候 在服务器训练时 可能会修改代码,多次push或者是在build时,repo是私人的就会需要ssh或账号

经杰哥提醒 可以将本机上的代码进行链接的形式更安全些 code都可以不用在docker内

```bash
docker run -it -v /home/kin/workspace/ufomap_ws/src:/root/catkin_ws/src --name ufomap_rviz zhangkin/ufomap /bin/zsh
``` 但注意 container内因为是root权限,所以需要提前在cantianer内 终端 `chmod 777 /root/catkin_ws/src` 解开权限

如何在container中打开rviz

亲测可用

  1. This permits the root user on the local machine to connect to X windows display.
xhost +local:docker # 一定要运行 !!

docker run -it --privileged --net=host -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --name test zhangkin/ufomap /bin/zsh

@thuaj 遇到的问题 无法打开,报错信息为 libGL error: failed to load driver: swrast

解决办法: 来源: ubuntu20.04安装NVIDIA驱动后docker中rviz,pcl_viewer等涉及到访问宿主机界面的程序不可用

问题原因为:宿主机在升级nvidia驱动后,opengl升级版本,而在docker中仍旧使用旧的opengl版本,同样在docker中升级一遍nvidia驱动后问题解决,安装指令如下:

#!/bin/bash
sudo apt-get install mesa-utils
version="$(glxinfo | grep "OpenGL version string" | rev | cut -d" " -f1 | rev)"
wget <http://us.download.nvidia.com/XFree86/Linux-x86_64/"$version"/NVIDIA-Linux-x86_64-"$version".run>
mv NVIDIA-Linux-x86_64-"$version".run NVIDIA-DRIVER.run

然后运行 copy NVIDIA-DRIVER.run **into docker****

apt-get install module-init-tools kmod

sh ./NVIDIA-DRIVER.run -a -N --ui=none --no-kernel-module

常用添加入 Dockerfile

此处主要添加一下大家常用的Dockerfile里build的小插件,直接复制进入自己的dockerfile就行~

一个是 取消交互,因为在build过程,是无法交互的,在顶端添加这句方便后续自己按默认配置走

# Just in case we need it
ENV DEBIAN_FRONTEND noninteractive

zsh终端:

RUN apt update && apt install -y --no-install-recommends \
git \
curl \
vim rsync ssh\
python-pip \
pip install --upgrade RUN apt install -y wget git zsh tmux vim g++
RUN sh -c "$(wget -O- https://github.com/deluan/zsh-in-docker/releases/download/v1.1.2/zsh-in-docker.sh)" -- \
-t robbyrussell \
-p git \
-p ssh-agent \
-p https://github.com/agkozak/zsh-z \
-p https://github.com/zsh-users/zsh-autosuggestions \
-p https://github.com/zsh-users/zsh-completions \
-p https://github.com/zsh-users/zsh-syntax-highlighting

miniconda 注意此处 虽然有下载了 但是因为没配置bashrc zshrc 所以需要 /opt/conda/bin/conda 来启动conda

RUN curl -o ~/miniconda.sh -LO https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh  && \
chmod +x ~/miniconda.sh && \
~/miniconda.sh -b -p /opt/conda && \
rm ~/miniconda.sh && \
/opt/conda/bin/conda clean -ya && \
/opt/conda/bin/conda create -n python37 python=3.7

git 相关的设置

# needs to be done before we can apply the patches
RUN git config --global user.email "xxx@163.com"
RUN git config --global user.name "kin-docker"

升级cmake

WORKDIR /opt
RUN wget https://github.com/Kitware/CMake/releases/download/v3.24.0-rc2/cmake-3.24.0-rc2-linux-x86_64.sh
RUN chmod +x /opt/cmake-3.24.0-rc2-linux-x86_64.sh
RUN bash /opt/cmake-3.24.0-rc2-linux-x86_64.sh
RUN rm -rf cmake-3.24.0-rc2-linux-x86_64.sh
RUN ln -s /opt/cmake-3.24.0-rc2-linux-x86_64/bin/* /usr/local/bin

问题合集

  1. W: GPG error: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4B469963BF863CC

    https://github.com/NVIDIA/nvidia-docker/issues/1632

    RUN rm /etc/apt/sources.list.d/cuda.list
    RUN rm /etc/apt/sources.list.d/nvidia-ml.list
  2. Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied

    给一下权限就好了

    sudo chmod 666 /var/run/docker.sock

    一次性解决:

    sudo groupadd docker
    sudo usermod -aG docker $USER
    sudo chmod 777 /var/run/docker.sock
    sudo systemctl stop docker
    sudo systemctl stop docker.socket
    sudo systemctl start docker
    sudo systemctl enable docker

    http://andy51002000.blogspot.com/2019/02/docker-permission-denied.html


赠人点赞 手有余香 ;正向回馈 才能更好开放记录 hhh

Docker 快速学习手册及相关笔记 附带一些问题解决方案的更多相关文章

  1. 转载-《Python学习手册》读书笔记

    转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html

  2. 2. Apache Axis2 快速学习手册之概览

    这篇博文和大家一起学习下Apache Axis2 官方文档的快速指南篇 英文原文:http://axis.apache.org/axis2/java/core/docs/quickstartguide ...

  3. 《Python学习手册》读书笔记

    之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...

  4. 《Python学习手册》读书笔记【转载】

    转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...

  5. 2.5 Apache Axis2 快速学习手册之JiBx 构建Web Service

    5. 使用JiBX生成服务(通过JIBX 命令将wsdl 生成 services ) 要使用JiBX数据绑定生成和部署服务,请执行以下步骤. 通过在Axis2_HOME / samples / qui ...

  6. (原创)鸟哥linux学习script shell相关笔记

    在使用鸟哥linux进行script shell学习的过程中碰到一些不太明白的知识点,在这里进行一些记录 1. [root@www scripts]# vi sh03.sh #!/bin/bash # ...

  7. 2.4 Apache Axis2 快速学习手册之XMLBeans 构建Web Service

    4. 使用XMLBeans生成服务(通过xml bean 命令将wsdl 文件生成java 代码) 要使用XMLBeans生成服务,请执行以下步骤. 通过在Axis2_HOME / samples / ...

  8. 2.3 Apache Axis2 快速学习手册之 ADB 构建Web Service

    使用ADB生成服务(根据ADB 命令将wsdl 文件还原成Java代码) 要使用Axis2数据绑定框架(ADB)生成和部署服务,请执行以下步骤. 通过在Axis2_HOME / samples / q ...

  9. 2.1 Apache Axis2 快速学习手册之 POJO 构建Web Service

    1. 准备:创建一个Maven Web App 项目 这里让我们使用Maven 模板创建一个Web App 项目 1. New------> Maven Project 2. 使用默认配置,点击 ...

  10. 2.2 Apache Axis2 快速学习手册之 AXIOM 构建 Web Service

    和上一篇的POJO 部署相比主要是services.xml 中配置的消息接受处理器类不一样和Java 类中写法不一样. 使用AXIOM构建服务 样例源码路径: C:\Apps\axis2\axis2- ...

随机推荐

  1. Seata原理浅析

    前言 Seata是阿里开源的分布式事务解决方案,本文将详细介绍 Seata 的事务模式.原理以及使用.了解之前需清楚什么是分布式事务. 一.什么是 Seata Seata 是一款开源的分布式事务解决方 ...

  2. pageoffice6 版本在线打开word 文件,实现多用户同时编辑

    总体来说,各种Web系统中的Word文档在线处理大体可以分为以下四种流转处理方式: A用户编辑完,流转给B用户修改,再流转给C用户修改,直到最后.每个用户都是针对全文修改的,如果需要在这一篇文档中能区 ...

  3. smtplib详解,发送邮件

    创建邮箱账号 1.官网登录邮箱. 2.在邮箱的主界面找到"设置",新版的主界面与旧版稍有不同,一般位于上方,齿轮状的即是. 3.点击齿轮状的设置标志,会弹出一个下拉菜单,在最后有我 ...

  4. Python:Python对象模型与序列迭代陷阱

    1. Python对象模型与浅拷贝/深拷贝 1.1 Python对象模型和引用 在我们讲解Python的序列修改陷阱之前,先巩固一下Python的对象模型和浅拷贝/深拷贝的知识. 众所周知,Pytho ...

  5. wblockCloneObjects 写块克隆的使用

    写块克隆可以把当前数据库的实体写入到另一个dwg文件中去.用法根deepclone类似,不过deepclone只能复制到同一数据库中,而写块克隆是在不同数据库中进行复制的.写块克隆也算是深度克隆,能把 ...

  6. IDEA使用——常用配置

    一. 设置鼠标悬停代码提示 二. 设置Ctrl+滚乱调整字体大小 三. 设置自动导包(不设置自动导包,我们也可以通过Alt+Enter进行手动导包) 四. 设置显示行号和方法间分隔符 五. 设置代码提 ...

  7. itest(爱测试) 4.5.7 发布,开源BUG 跟踪管理 & 敏捷测试管理&极简项目管理软件

    itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...

  8. 15种pod的状态

    15种pod的状态 调度失败 常见错误状态(Unschedulable) pod被创建后进入调度阶段,k8s调度器依据pod声明的资源请求量和调度规则,为pod挑选一个适合运行的节点.当集群节点不满足 ...

  9. Docker部署深度学习模型

    Docker部署深度学习模型 基础概念 Docker Docker是一个打包.分发和运行应用程序的平台,允许将你的应用程序和应用程序所依赖的整个环境打包在一起.比如我有一个目标检测的项目,我想分享给朋 ...

  10. ETL工具-nifi干货系列 第十一讲 处理器UpdateAttribute使用教程

    1.在这里我们重温下nifi里面一个重要的概念FlowFile,如下图所示: FlowFile:FlowFile代表NiFi中的单个数据.nifi数据流中流动的就是flowfile,每个nifi处理器 ...