Docker 快速学习手册及相关笔记 附带一些问题解决方案
参考与前言
- Docker 官方教程 【英文】:https://docs.docker.com/get-started/
- Windows Docker 安装 | 菜鸟教程 (runoob.com)
- Docker 教程 | 菜鸟教程
Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。
Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。
如需要在ubuntu下使用 像绝哥说的 用多了就是几条指令 非常快速的... 这个为走捷径教程,建议通过目录进行所需的观看
常用命令
查看已有镜像 image
docker images
删除对应镜像id的镜像
docker rmi image_id
查看已有容器 containers
docker ps -a
删除对应容器id的容器
docker rm container_id
删除所有无名
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 命令可以让我们快捷地查看端口的绑定情况。
更多请查看官网文档:
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
亲测可用
- 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
问题合集
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
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 快速学习手册及相关笔记 附带一些问题解决方案的更多相关文章
- 转载-《Python学习手册》读书笔记
转载-<Python学习手册>读书笔记 http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html
- 2. Apache Axis2 快速学习手册之概览
这篇博文和大家一起学习下Apache Axis2 官方文档的快速指南篇 英文原文:http://axis.apache.org/axis2/java/core/docs/quickstartguide ...
- 《Python学习手册》读书笔记
之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我 ...
- 《Python学习手册》读书笔记【转载】
转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉 ...
- 2.5 Apache Axis2 快速学习手册之JiBx 构建Web Service
5. 使用JiBX生成服务(通过JIBX 命令将wsdl 生成 services ) 要使用JiBX数据绑定生成和部署服务,请执行以下步骤. 通过在Axis2_HOME / samples / qui ...
- (原创)鸟哥linux学习script shell相关笔记
在使用鸟哥linux进行script shell学习的过程中碰到一些不太明白的知识点,在这里进行一些记录 1. [root@www scripts]# vi sh03.sh #!/bin/bash # ...
- 2.4 Apache Axis2 快速学习手册之XMLBeans 构建Web Service
4. 使用XMLBeans生成服务(通过xml bean 命令将wsdl 文件生成java 代码) 要使用XMLBeans生成服务,请执行以下步骤. 通过在Axis2_HOME / samples / ...
- 2.3 Apache Axis2 快速学习手册之 ADB 构建Web Service
使用ADB生成服务(根据ADB 命令将wsdl 文件还原成Java代码) 要使用Axis2数据绑定框架(ADB)生成和部署服务,请执行以下步骤. 通过在Axis2_HOME / samples / q ...
- 2.1 Apache Axis2 快速学习手册之 POJO 构建Web Service
1. 准备:创建一个Maven Web App 项目 这里让我们使用Maven 模板创建一个Web App 项目 1. New------> Maven Project 2. 使用默认配置,点击 ...
- 2.2 Apache Axis2 快速学习手册之 AXIOM 构建 Web Service
和上一篇的POJO 部署相比主要是services.xml 中配置的消息接受处理器类不一样和Java 类中写法不一样. 使用AXIOM构建服务 样例源码路径: C:\Apps\axis2\axis2- ...
随机推荐
- Seata原理浅析
前言 Seata是阿里开源的分布式事务解决方案,本文将详细介绍 Seata 的事务模式.原理以及使用.了解之前需清楚什么是分布式事务. 一.什么是 Seata Seata 是一款开源的分布式事务解决方 ...
- pageoffice6 版本在线打开word 文件,实现多用户同时编辑
总体来说,各种Web系统中的Word文档在线处理大体可以分为以下四种流转处理方式: A用户编辑完,流转给B用户修改,再流转给C用户修改,直到最后.每个用户都是针对全文修改的,如果需要在这一篇文档中能区 ...
- smtplib详解,发送邮件
创建邮箱账号 1.官网登录邮箱. 2.在邮箱的主界面找到"设置",新版的主界面与旧版稍有不同,一般位于上方,齿轮状的即是. 3.点击齿轮状的设置标志,会弹出一个下拉菜单,在最后有我 ...
- Python:Python对象模型与序列迭代陷阱
1. Python对象模型与浅拷贝/深拷贝 1.1 Python对象模型和引用 在我们讲解Python的序列修改陷阱之前,先巩固一下Python的对象模型和浅拷贝/深拷贝的知识. 众所周知,Pytho ...
- wblockCloneObjects 写块克隆的使用
写块克隆可以把当前数据库的实体写入到另一个dwg文件中去.用法根deepclone类似,不过deepclone只能复制到同一数据库中,而写块克隆是在不同数据库中进行复制的.写块克隆也算是深度克隆,能把 ...
- IDEA使用——常用配置
一. 设置鼠标悬停代码提示 二. 设置Ctrl+滚乱调整字体大小 三. 设置自动导包(不设置自动导包,我们也可以通过Alt+Enter进行手动导包) 四. 设置显示行号和方法间分隔符 五. 设置代码提 ...
- itest(爱测试) 4.5.7 发布,开源BUG 跟踪管理 & 敏捷测试管理&极简项目管理软件
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代 ...
- 15种pod的状态
15种pod的状态 调度失败 常见错误状态(Unschedulable) pod被创建后进入调度阶段,k8s调度器依据pod声明的资源请求量和调度规则,为pod挑选一个适合运行的节点.当集群节点不满足 ...
- Docker部署深度学习模型
Docker部署深度学习模型 基础概念 Docker Docker是一个打包.分发和运行应用程序的平台,允许将你的应用程序和应用程序所依赖的整个环境打包在一起.比如我有一个目标检测的项目,我想分享给朋 ...
- ETL工具-nifi干货系列 第十一讲 处理器UpdateAttribute使用教程
1.在这里我们重温下nifi里面一个重要的概念FlowFile,如下图所示: FlowFile:FlowFile代表NiFi中的单个数据.nifi数据流中流动的就是flowfile,每个nifi处理器 ...