1.简介
2. 概念
3. 安装
3.1 安装准备
3.1.1 安装curl
sudo apt-get install libcurl3-gnutls=7.47.0-1ubuntu2
sudo apt install curl
sudo apt-get install x11-xserver-utils
sudo apt-get remove docker docker-engine docker.io containerd runc
xhost +
3.2 安装 docker
3.2.1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
查看是否安装成功
sudo docker help
使用docker help命令可查看docker的所有命令,说明已安装成功。
3.2.3 安装docker2
# 1.
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
# 2.
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
# 3.
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
# 4
sudo apt-get update
# 5
sudo apt-get install -y nvidia-docker2
修改文件:
sudo vim /etc/docker/daemon.json
红框是添加的参数
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"],
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
3.2.2 镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。例如:科大镜像,阿里云等等。以阿里云为例,阿里云镜像获取地址:,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
然后在 /etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://XXX.mirror.aliyuncs.com/"]}
之后重新启动服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
3.2.3 本地登录
Docker 官方维护了一个公共仓库 Docker Hub,里边包含了大多数我们需要的基础镜像。
首先注册一个账号,然后在本地登录:
注意使用的用户名,密码。非邮箱
sudo docker login
3.2.4 加入用户权限
- 创建名为docker的组,如果之前已经有该组就会报错,可以忽略这个错误:
sudo groupadd docker
- 将当前用户加入组docker:
sudo gpasswd -a ${USER} docker
- 重启docker服务(生产环境请慎用):
sudo systemctl restart docker
- 添加访问和执行权限:
sudo chmod a+rw /var/run/docker.sock
- 操作完毕,验证一下,现在可以不用带sudo了:
docker info
4. 操作
4.1 拉取镜像
sudo docker pull lingjunlh/torch1.9.1-cuda11.1
4.2 容器
4.2.1 创建容器
4.2.1.1 在终端设置docker可以显示相关可视化界面
- 宿主机终端运行
DISPLAY=:0.0
xhost +
- 查看环境变量
echo ${
DISPLAY}
4.2.1.2
sudo nvidia-docker run -it --privileged=true -p 7777:8888 --gpus all --ipc=host -v /data:/data -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -e GDK_SCALE -e GDK_DPI_SCALE --name test1 b7a4c /bin/bash
-i
:交互式操作-t
:终端-p 7777:8888
:把主机的7777端口映射到容器的8888端口- –privileged=true:调用GPU资源
-ipc=host
:让容器与主机共享内存--name xxxxx
:给容器定义一个个性化名字-v /home/shcd/Documents/gby:/gby
:主机上的/home/shcd/Documents/gby
地址挂载到容器里,并命名为/data
文件夹- 这样这个文件夹的内容可以在容器和主机之间共享了
- 因为容器一旦关闭,容器中的所有改动都会清除,所以这样挂载一个地址可以吧容器内的数据保存到本地。 -
90be7604e476
则是你安装的镜像的id- 可以在刚刚docker images命令后面查看,当然你也可以直接写全名ufoym/deepo:all-py36-jupyter
/bin/bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
4.2.2 进入已运行的容器
docker attach d6a0f155273a
- d6a0f155273a: 容器 id
4.2.3 退出容器
ctrl+D
4.2.4 删除容器
1)首先需要停止所有的容器
docker stop $(docker ps -a -q)
2)删除所有的容器(只删除单个时把后面的变量改为container id即可)
docker rm $(docker ps -a -q)
4.2.5 启动容器
sudo docker start 容器id
其他
docker logs
容器id查看容器运行日志
docker logs -tf 容器id
docker logs --tail num 容器id # num为要显示的日志条数
docker top 容器id查看容器中进程信息
docker top 容器id
docker inspect 容器id查看容器的元数据
docker inspect 容器id
4.3 卸载
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo apt-get purge -y nvidia-docker2
5 常用命令
5.1 命令
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker ps 查看当前运行中的容器
docker ps -a 查看所有容器
docker images 查看镜像列表
docker rm container-id 删除指定 id 的容器
docker stop/start container-id 停止/启动指定 id 的容器
docker rmi image-id 删除指定 id 的镜像
docker volume ls 查看 volume 列表
docker network ls 查看网络列表
docker ps -s 查看docker 容器大小
5.2 docker 查看容器和镜像大小
- 查看整体大小
docker system df
- 查看 每个 image、container 详细大小
docker system df -v
5.3 停止和杀死容器
- docker stop 执行时,首先给容器发送一个TERM信号,让容器做一些退出前必须做的保护性、安全性操作,然后让容器自动停止运行,如果在一段时间内容器没有停止运行,再执行 kill -9 指令,强制终止容器。
sudo docker stop test
-
test: 容器名
-
docker kill 执行时,不论容器是什么状态,在运行什么程序,直接执行 kill -9 指令,强制终止容器。
5.4 删除镜像
docker rmi image-id
5.5 拷贝文件至镜像中 Docker cp
参考
作用:将主机中的文件拷贝到目标docker容器中
# 将容器内的文件拷贝到主机内
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH]
# 将主机内的文件拷贝到容器中
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH|
实例
- 将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www
- 将容器
96f7f14e99ab
的/www
目录拷贝到主机的/tmp目录中。docker cp 96f7f14e99ab:/www /tmp/
build镜像
运行
案例
下载以下三个
torch-1.8.2+cu111-cp38-cp38-linux_x86_64.whl
torchaudio-0.8.2-cp38-cp38-linux_x86_64.whl
torchvision-0.9.2+cu111-cp38-cp38-linux_x86_64.whl
- 打开dockerfile
gedit Dockerfile
- Dockerfile文件
#安装python运行环境
#
################################################
#基于哪个镜像生成新的镜像
FROM nvidia/cuda:11.1-cudnn8-devel-ubuntu18.04
RUN rm /etc/apt/sources.list.d/cuda.list
#作者名
MAINTAINER SunPengfei
#设置环境变量
ENV TZ Asia/Shanghai
ENV LANG zh_CN.UTF-8
# 拷贝下载好的whl文件到镜像中
#COPY torch-1.10.1+cu111-cp38-cp38-linux_x86_64.whl /tmp
#COPY torchaudio-0.10.0+cu111-cp38-cp38-linux_x86_64.whl /tmp
#COPY torchvision-0.11.0+cu111-cp38-cp38-linux_x86_64.whl /tmp
#执行命令
#替换为阿里源
RUN sed -i 's#http://archive.ubuntu.com/#http://mirrors.aliyun.com/#' /etc/apt/sources.list \
&& sed -i 's#http://security.ubuntu.com/#http://mirrors.aliyun.com/#' /etc/apt/sources.list
#更新软件源并安装软件
RUN apt-get update -y \
&& apt-get -y install iputils-ping \
&& apt-get -y install wget \
&& apt-get -y install net-tools \
&& apt-get -y install vim \
&& apt-get -y install openssh-server \
&& apt-get -y install python3.8 \
&& apt-get -y install python3-pip python3-dev python3.8-dev \
&& apt-get -y install libgl1 \
&& apt-get -y install git \
&& cd /usr/local/bin \
&& rm -f python \
&& rm -f python3 \
&& rm -f pip \
&& rm -f pip3 \
&& ln -s /usr/bin/python3.8 python \
&& ln -s /usr/bin/python3.8 python3 \
&& ln -s /usr/bin/pip3 pip \
&& ln -s /usr/bin/pip3 pip3 \
&& python -m pip install --upgrade pip \
&& cd /tmp \
&& pip install torch==1.10.0+cu111 torchvision==0.11.0+cu111 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html \
&& apt-get clean \
&& rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/* \
- build
sudo docker build -t ubuntu18:v0 .
-t
:- 写入镜像标签ImageName
: - 这是您要为镜像指定的名称。TagName
: - 这是您要为镜像指定的标签。dir
: - Dockerfile所在的目录。
提交和保存
容器提交生成镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
-
-a
:提交的镜像作者; -
-m
:提交时的说明文字; -
-p
:在commit时,将容器暂停。
保存
存在两种方式,一种是先提交,再保存;一种是直接导出容器
保存镜像
docker save ID > xxx.tar
docker load < xxx.tar
保存容器
docker export ID >xxx.tar
docker import xxx.tar containr:v1
Docker磁盘空间不足如何解决
1、查看服务器所有磁盘的使用情况:
df -h
可以看到,红框处就是系统盘的大小,总大小是188G(相对其他盘小太多),之前是占满的,但是博主已经做了迁移,所以空出了很大的空间。
2、查看docker镜像和容器存储目录的空间大小
du -sh /var/lib/docker/
3、停止docker服务
service docker stop
4、将docker迁移到大容量的磁盘中
4.1 方法一:创建软连接(推荐)
- 进入root
su root
- 移动文件位置
#移动文件位置
cp -a /var/lib/docker /data/
- 创建软连接
#创建软连接
sudo ln -fs /data/docker /var/lib/docker
- 重新加载
#重新加载配置&查看位置
systemctl daemon-reload
systemctl restart docker
service docker start
- 验证
如果还在,则证明有效
docker images
4.2 方法二
- 首先创建目录
mkdir -p 大磁盘目录/docker/lib/
- 迁移
rsync -avz /var/lib/docker /mnt/docker/lib/
5、编辑/etc/docker/daemon.json,添加参数,将docker的目录迁移绑定
修改文件:
sudo vim /etc/docker/daemon.json
红框是添加的参数
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"],
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
},
"data-root":"/data/docker/lib/docker"
}
6、重载和重启docker服务
systemctl daemon-reload && systemctl restart docker
但是systemctl我依然运行失败,所以我是使用以下命令重启docker的:
service docker restart
7、检查docker是否绑定新目录
docker info
如果Docker Root Dir由/var/lib/docker变为你指定的目录,说明迁移成功。
8、删除docker旧目录
rm -rf /var/lib/docker
9、设置代理
9.1 有效
配置宿主机/etc/default/docker
export http_proxy="http://127.0.0.1:8889/"
export https_proxy="http://127.0.0.1:8889/"
export HTTP_PROXY="http://127.0.0.1:8889/"
export HTTPS_PROXY="http://127.0.0.1:8889/"
export all_proxy="socks5h://localhost:1089"
export ALL_PROXY="socks5h://localhost:1089"
重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
9.2 方法二
无效
在宿主机打开文件
sudo vim ~/.docker/config.json
加入代理
9.2 测试无效
export ALL_PROXY='socks5://127.0.0.1:1080'
这里ip地址使用的是宿主机的ip
2. 共享网络
与宿主机共享网络时直接在容器内使用
创建容器时使用--network=host
参数
sudo nvidia-docker run -it --privileged=true -p 7777:8888 --network=host --gpus all --ipc=host -v /data:/data --name test1 b7a4c /bin/bash
然后在docker内设置代理,比如全局代理
export ALL_PROXY='socks5://127.0.0.1:1080'
- 映射代理端口后直接在容器内使用
docker run时带参数-p映射代理的端口到容器, 在容器里面使用即可,比如:
docker run -p 1080:1080 .....
export ALL_PROXY='socks5://127.0.0.1:1080'
10.0、docker库的配置
1. libGL
报错
ImportError: libGL.so.1: cannot open shared object file
安装
apt-get update && apt-get install libgl1
2. ping安装
apt-get install -y iputils-ping
3. apex安装
安装:RuntimeError: Error compiling objects for extension
git clone https://github.com/NVIDIA/apex
cd apex
python setup.py install --cpp_ext --cuda_ext
- 报错一:
再进行编译
git checkout f3a960f80244cf9e80558ab30f7f7e8cbf03c0a0
4. boost
报错
fatal error: boost/geometry.hpp: No such file or directory
解决办法
apt-get update
apt-get install libboost-all-dev
5. cudnn
- 到对应网址下载对应版本的cudnn,linux 电脑端为X86-64
- 解压
tar -xzvf cudnn-10.1-linux-x64-v8.0.5.39.tgz //XXX.tgz是下载的cudnn的压缩包
- 移动对应的文件
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/include/cudnn_version.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
11、docker 清除缓存
docker system prune
命令:
- 用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)
- 已停止的容器(container)
- 未被任何容器所使用的卷(volume)
- 未被任何容器所关联的网络(network)
- 所有悬空镜像(image)
docker system prune -a
命令
- 清理得更加彻底,可以将没有容器使用Docker镜像都删掉。
注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了……所以使用之前一定要想清楚
2. docker远程调试
2.1 vscode插件安装
remote-ssh
remote development
2.2 docker container配置
- 启动容器,安装ssh
apt-get update
apt-get install openssh-server
- 设置远程登录的密码
如果希望直接使用root账户登录容器,则设置root密码
passwd
- 增加root账户登录许可
- 编辑文件
vim /etc/ssh/sshd_config
修改如下
#注释掉
PermitRootLogin prohibit-password
#添加
PasswordAuthentication yes
PermitRootLogin yes
#Port 写容器端口
Port 9901
重启ssh
service ssh restart
2.3 vscode配置
ctrl+shift+p
- 打开配置
4. 开始配置
# 随便起
Host 2080Ti
# 主机IP
HostName 10.119.XXX.XXX
# DOCKER root用户
User root
# User ubuntu
# docker 端口
Port 9901
2.4 连接
ctrl_shift+P
+连接到对应名字即可
2.5 open3d等远程可视化
2.5.1 容器安装
- 容器内部安装
apt-get install x11-xserver-utils
apt-get install x11-apps
- 首先不登录docker,在当前终端下运行
如果实验不成功,则重启容器,重启之后,重新设置当前指令
DISPLAY=:0.0
xhost +
- 登录容器后,再次运行
DISPLAY=:0.0
xhost +
- 查看环境变量
echo ${
DISPLAY}
- 修改ubuntu server下的配置文件
参考一
本人经历过远程无法连接情况,表现为
- 客户端vscode 连接容器卡死
- 但是连接远程电脑,可以。
尝试下面的配置解决
- 打开文件
vim /etc/ssh/sshd_config
- 将
AllowTcpForwarding no
AllowAgentForwarding no
替换为
AllowTcpForwarding yes
AllowAgentForwarding yes
- 保存后重启sshd服务
systemctl restart sshd
2.5.2 本机安装
- 在本地安装vcxsrv
vcxsrv免费下载链接
- 一般自定义自定义下载路径,一个是权限问题,一个是路径查找方便问题
- 一路next直至下载完成。
-
开启服务
打开XLaunch,记住这个Display number 0
,其他的一路默认【下一步】就可以了直至完成。
-
修改vcxsrv配置。找到安装目录下的文件
- 0代表上面提到的
DISPLAY:0
- 加入远程服务器的IP,保存
2.5.3 vscode 配置
- 打开文件
C:\Users\用户名.ssh\config
中添加如下3行:
ForwardX11 yes
ForwardX11Trusted yes
ForwardAgent yes
2. launch
文件配置
在.vscode/launch.json
文件中
"env":{
"DISPLAY":":0.0"}
2.6 tensorboard 调用
- 打开
vscode
终端 conda activate env_name
- 进入tf_log目录,运行指令
tensorboard --logdir=work_dirs_name --port='6009'
- 点击网址,进入浏览器查看
3 docker打包本地镜像,拷贝到其它宿主机上运行
参考
docker获取镜像的方式除了 pull 之外还有一种是将本地镜像打包拷贝给其它宿主机来运行。假设现实环境中本地仓库和远程仓库均连接异常, 那我们将事先打好包的镜像分发给其它docker节点用也是一种解决方法。
具体操作步骤如下:
- 执行如下命令找到被打包镜像的名字和版本号 (版本号=TAG)
docekr images
- docker打包镜像的两种方式 (选一种执行即可)
docker save 镜像名字:版本号 > /root/打包名字.tar
docker save -o /root/打包名字.tar 镜像名字:版本号
-
将打包镜像分发到其它宿主机的 /root/ 目录下
-
将打成 tar 包的镜像 load 出来
docker load < /root/打包名字.tar
- 查看 load 出来的镜像ID
docekr images
- 刚 load 出来的镜像其名字、版本号均为 none, 我们要通过 tag 命令赋予名字和版本号
docker tag 镜像ID 镜像名字:版本号