docker的核心概念
docker的大部分操作主要是围绕着它的三大核心概念-----镜像、容器和仓库展开。
镜像:docdker镜像类似于虚拟机镜像,可以理解为一个只读的模板。镜像是创建docker容器的基础。
容器:容器是镜像创建的运行实例,可以将启动、开始、停止、删除,这些容器之间是彼此隔离、互不可见的。
docker安装
ubuntu环境下安装docker
docker目前只能运行在64为的平台上,并且要求内核不能低于3.1.0.
用户可以使用uname -a查看自己的内核详细信息
docker目前支持的最低版本是ubuntu12.04LTS。
-
docker安装步骤:
#安装apt-transport-https包支持HTTPS协议源 sudo apt-get install apt-transport-https #添加源的gpg秘钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 #添加Docker的官方apt软件源,保存到/etc/apt/sources.list.d/docker.list中 sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list" #更新源 sudo apt-get update #安装docker sudo apt-get install -y docker-engine #启动docker sudo service docker start
如果安装的过程中有较旧的版本安装的过程中会提醒是否先删除,直接删除即可。除了手动添加源进行安装,官方版本也给出自动化安装的方式:
sudo curl -sSL https://get.docker.com/ | sh
- 安装nvidia-docker
普通的docker环境不支持gpu,因此我们需要一个nvidia-docker的版本.
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
验证是否安装成功:
nvidia-docker run –rm nvidia/cuda nvidia-smi
使用上述代码查看是否能安装成功,如果输出本机上的GPU信息说明nvidai-docker安装成功。
利用官方的 nvidia/cuda:9.0-base 镜像进行安装
sudo nvidia-docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
#创建容器
sudo nvidia-docker run -it nvidia/cuda:9.0-base
#由于官方镜像不完整因此需要安装cuda
apt install cuda-toolkit-9-0
然后根据需要安装pytorch或者是tensorflow等一些系列的安装包。
- 如何让容器中能够使用GPU
第一种方法:安装nvidia-docker,并在镜像下启动容器的时候使用nvidia-docker
例如:(容器中必须安装有cuda亲测有效)
sudo nvidia-docker run -it -v /home/fengms/testv:/home/testv \
face_recongnition:cpu
sudo nvidia-docker run -dit -p 8082:8082 -v /home/fengms/testv:/home/testv \
face_recongnition:cpu
#其中的-v为指定的外挂磁盘空间,同步修改。建议使用, -p 增加端口映射
第二种方法:将宿主机的nvdiia文件映射到docker内。(有可能需要安装nvidia驱动以及cuda和cudnn未尝试)
sudo docker run -it \
--device /dev/nvidia0:/dev/nvidia0 \
--device /dev/nvidiactl:/dev/nvidiactl \
--device /dev/nvidia-modeset:/dev/nvidia-modeset \
--device /dev/nvidia-uvm:/dev/nvidia-uvm \
-v ${basepath}/data:/data \
-v ${basepath}/sendiee:/opt/sendiee \
-p9100:9100 -p8002:8002 -p9001:9001 -p27017:27017 -p8080:8080 \
pycaffe:1.1
第三种方法:在运行docker run的时候加入命令–privileged=true
docker run -it --privileged=true ubuntu:14.04
# 我这里说一下 privileged 参数功能,设置为true的时候,让docker的root拥有真正root的权限,可以调用宿主机硬件等,甚至可以让你在docker中使用docker
docker的完整操作过程
首先需要设置镜像,镜像可以通过自己创建或者是从仓库中下载镜像
创建镜像的方法主要有三种:基于已有的镜像的容器创建、基于本地模板导入、基于Dckerfile创建。
以下是部分操作:
-
搜索镜像
docker search # 在docker index中搜索image
–automated=false 仅显示自动创建的镜像
–no-trunc=false 输出信息不截断显示
-s 0 指定仅显示评价为指定星级的镜像 -
下载镜像
docker pull <image> # 从docker registry server 中下拉image 还可通过指定标签下载某镜像 docker pull [:TAG] docker pull centos:7
-
查看镜像/删除
docker images: # 列出images docker images -a # 列出所有的images(包含历史) docker ps -a #列出本机所有容器 docker rmi <image ID>: # 删除一个或多个image docker rm # 删除容器 ps:删除镜像之前必须删除掉所有的镜像对应的容器
-
基于已有的容器创建镜像
#使用docker commit命令在已有的容器的基础上提交创建新的容器 sudo docker -it ubuntu:14.04 /bin/bash .............. docker commit ID newname:newtag #ID为容器的ID,后接自己命名的镜像名字和标签
-
存出和载入镜像
存出本地镜像文件为.tar docker save -o ubuntu_14.04.tar ubuntu:14.04 导入镜像到本地镜像库 docker load --input ubuntu_14.04.tar或者 docker load < ubuntu_14.04.tar
-
上传镜像
用户在dockerhub网站注册后,即可上传自制的镜像。 docker push NAME[:TAG]
创建完进镜像后可以在镜像的基础上创建容器
容器是镜像的一个运行实例,不同的是它带有额外的可写层。
可认为docker容器就是独立运行的一个或一组应用,以及它们所运行的必需环境。
-
创建(使用镜像创建容器):
首先得查看镜像的REPOSITORY和TAG
docker run -it REPOSITORY:TAG #等价于先执行docker create 再执行docker start 命令
其中-t选项让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。若要在后台以守护态(daemonized)形式运行,可加参数-d
在执行docker run来创建并启动容器时,后台运行的标准包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
从宿主机配置的网桥接口中桥接一个虚拟接口到容器
从地址池配置一个ip地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
docker start/stop/restart [container]#:开启/停止/重启container
-
启动容器
docker ps #查看在运行中的容器 docker start [容器id的前两个字母]
-
退出和终止容器
在容器中运行exit退出容器同时也可以使用快捷键control+D docker stop [容器id的前两个字母] #终止容器
-
进入容器:
docker attach [container_id] #连接一个正在运行的container实例(即实例须为start状态,可以多个 窗口同时attach 一个container实例),但当某个窗口因命令阻塞时,其它窗口也无法执行了。
exec可直接在容器内运行的命令。docker exec -ti [container_id] /bin/bash
-
删除容器:
docker rm <container…> #:删除一个或多个container
docker rmdocker ps -a -q
#:删除所有的container
docker ps -a -q | xargs docker rm #:同上, 删除所有的container
docker -rm
-f 强制中止并运行的容器
-l 删除容器的连接,但保留容器
-v 删除容器挂载的数据卷
-
修改容器:
docker commit <container> [repo:tag] # 将一个container固化为一个新的image,后面的repo:tag可选。
-
导入和导出容器:
docker export CONTAINER > test.tar #导出到一个文件,不管是否处于运行状态。 cat test.tar | docker import - centos:latest #导入为镜像
(docker仓库中的镜像下载链接)[https://hub.docker.com/search?q=pytorch%20face&type=image]
(修改docker的默认存放路径)[https://www.cnblogs.com/jakaBlog/p/10538382.html]
(在docker镜像上安装GPU显卡驱动)[https://blog.youkuaiyun.com/renhanchi/article/details/75808029]
在docker中安装cuda的时候一定要测试查看是否安装成功
测试代码:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery #由自己电脑目录决定
make
sudo ./deviceQuery