我建立了1组CV微信交流群,
关注公众号:菜鸡Ai
后台回复:加群
备注:学校|公司+昵称+方向 会有小哥哥拉你进群。
首先需要使用docker基于一个已有的镜像来新建容器进行操作,这里是基于ubuntu镜像来新建容器。这里会创建一个ubuntu操作系统的主机容器,类似于一个虚拟机来使用,然后往这个里面配置深度学习环境。
磨刀不误砍柴工,先了解下一些常用命令。
**sudo** systemctl daemon-reload
**sudo** systemctl start docker
**sudo** systemctl restart docker
sudo docker images ##查看当前本地可用镜像
sudo docker ps ##查看正在运行的容器id
sudo docker ps -a ##查看创建的所有的容器id,包括正在运行,和停止的
Sudo docker run -i -t -d -p 8888:8888 ubuntu /bin/bash
Sudo docker run -i -t -d -p 8888:8888 -p 8890:8890 ubuntu /bin/bash
Sudo docker run -i -t -d -p 8888-8890:8888-8890 ubuntu /bin/bash ##连续端口可用符号“-”连接
参数说明:
- **-i**: 交互式操作。
- **-t**: 终端。
- **-d:**让容器在后台运行。
- **-P:**将容器内部使用的网络端口随机映射到我们使用的主机上。
- **ubuntu**: ubuntu 镜像。
- **/bin/bash**:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
执行上句新建容器之后,容器是放在后台运行的,所以使用sudo docker ps可看到正在运行的容器的id,想要进入该容器进行其他安装配置操作的话,执行以下命令:
sudo docker ps ##获取想要进去的容器的ID
sudo docker exec -it 容器ID /bin/bash
,使用exit命令可以退出容器,
uname -m && cat /etc/*release
来查看当前系统的详细信息。
标记本地镜像,将其归入某一仓库。
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
将镜像ubuntu:18.04标记为ubuntu:v3 镜像。
docker tag ubuntu:18.04 base/ubuntu:v3
命令用于使用 Dockerfile 创建镜像。
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
- **--build-arg=[] :**设置镜像创建时的变量;
- **--cpu-shares :**设置 cpu 使用权重;
- **--cpu-period :**限制 CPU CFS周期;
- **--cpu-quota :**限制 CPU CFS配额;
- **--cpuset-cpus :**指定使用的CPU id;
- **--cpuset-mems :**指定使用的内存 id;
- **--disable-content-trust :**忽略校验,默认开启;
- **-f :**指定要使用的Dockerfile路径;
- **--force-rm :**设置镜像过程中删除中间容器;
- **--isolation :**使用容器隔离技术;
- **--label=[] :**设置镜像使用的元数据;
- **-m :**设置内存最大值;
- **--memory-swap :**设置Swap的最大值为内存+swap,"-1"表示不限swap;
- **--no-cache :**创建镜像的过程不使用缓存;
- **--pull :**尝试去更新镜像的新版本;
- **--quiet, -q :**安静模式,成功后只输出镜像 ID;
- **--rm :**设置镜像成功后删除中间容器;
- **--shm-size :**设置/dev/shm的大小,默认值是64M;
- **--ulimit :**Ulimit配置。
- **--squash :**将 Dockerfile 中所有的操作压缩为一层。
- **--tag, -t:** 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- **--network:** 默认 default。在构建期间设置RUN指令的网络模式
使用当前目录的 Dockerfile 创建镜像,标签为 base/ubuntu:v1。
docker build -t base/ubuntu:v1 .
使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像。
docker build github.com/creack/docker-firefox
也可以通过 -f Dockerfile 文件的位置:
$ docker build -f /path/to/a/Dockerfile .
在 Docker 守护进程执行 Dockerfile 中的指令前,首先会对 Dockerfile 进行语法检查,有语法错误时会返回:
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
导入使用 docker save 命令导出的镜像。
docker load [OPTIONS]
OPTIONS 说明:
–input , -i : 指定导入的文件,代替 STDIN。
–quiet , -q : 精简输出信息。
导入镜像:
$ docker load < busybox.tar.gz
$ docker load --input fedora.tar
: 将指定镜像保存成 tar 归档文件。
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
将镜像 base/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar base/ubuntu:v3
: 从归档文件中创建镜像。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
OPTIONS说明:
**-c *应用docker 指令创建镜像;
**-m *提交时的说明文字;
从镜像归档文件my_ubuntu_v3.tar创建镜像,命名为base/ubuntu:v4
docker import my_ubuntu_v3.tar base/ubuntu:v4
sha256:63ce4a6d6bc3fabb95dbd6c561404a309b7bdfc4e21c1d59fe9fe4299cbfea39
** *将文件系统作为一个tar归档文件导出
docker export [OPTIONS] CONTAINER
OPTIONS说明:
将id为a404c6c174a2的容器按日期保存为tar文件。
docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
docker stop 容器ID ##后台运行的容器使用以下命令终止
docker rmi 镜像名#删除指定的镜像
docker rmi `docker images -a -q`删除本地所有的镜像
将文件cp到容器:
sudo docker ps ##查看容器的容器名,
sudo docker inspect -f '{{.Id}}' cranky_wescoff ##获取容器的完整ID
sudo docker cp cp_test.txt {容器完整ID}:/home/test ##将当前目录的cp_test.txt文件复制到容器下的/home/test目录下
安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
Docker 在 get.docker.com 和 test.docker.com 上提供了方便的shell安装脚本
Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:
$ sudo apt-get remove docker docker-engine docker.io containerd runc
当前称为 Docker Engine-Community 软件包 docker-ce 。
安装 Docker Engine-Community,以下介绍两种方式。
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker 。
更新 apt 包索引。
$ sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
添加 Docker 的官方 GPG 密钥:
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
sudo apt-key fingerprint 0EBFCD88
使用以下指令设置稳定版仓库
$ sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
$(lsb_release -cs) \
stable"
更新 apt 包索引。
$ sudo apt-get update
安装最新版本的 Docker Engine-Community 和 containerd ,或者转到下一步安装特定版本:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
要安装特定版本的 Docker Engine-Community,请在仓库中列出可用版本,然后选择一种安装。列出您的仓库中可用的版本:
apt-cache madison docker-ce
docker-ce **|** 5:18.09.1~3-0~ubuntu-xenial **|** https:**//**mirrors.ustc.edu.cn**/**docker-ce**/**linux**/**ubuntu xenial**/**stable amd64 Packages
docker-ce **|** 5:18.09.0~3-0~ubuntu-xenial **|** https:**//**mirrors.ustc.edu.cn**/**docker-ce**/**linux**/**ubuntu xenial**/**stable amd64 Packages
docker-ce **|** 18.06.1~ce~3-0~ubuntu **|** https:**//**mirrors.ustc.edu.cn**/**docker-ce**/**linux**/**ubuntu xenial**/**stable amd64 Packages
docker-ce **|** 18.06.0~ce~3-0~ubuntu **|** https:**//**mirrors.ustc.edu.cn**/**docker-ce**/**linux**/**ubuntu xenial**/**stable amd64 Packages
...
使用第二列中的版本字符串安装特定版本,例如 5:18.09.13-0ubuntu-xenial。
$ sudo apt-get install docker-ce= docker-ce-cli= containerd.io
测试 Docker 是否安装成功,输入以下指令,打印出以下信息则安装成功:
$ sudo docker run hello-world
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library hello-world
1b930d010525: Pull complete Digest:
删除安装包:
sudo apt-get purge docker-ce
删除镜像、容器、配置文件等内容:
sudo rm -rf /var/lib/docker
docker pull ubuntu:1804
$ docker images
$ docker run -itd --name ubuntu-test ubuntu
最后我们可以通过 docker ps 命令查看容器的运行信息:
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:
请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
之后重新启动服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
检查加速器是否生效配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行 docker info,如果从结果中看到了如下内容,说明配置成功。
$ docker info
Registry Mirrors:
https://reg-mirror.qiniu.com
驱动安装请见我的另一篇博文
CUDA安装详情请见我的另一篇博文
Anaconda下载安装
pip3安装
Tensorflow\Pytorch安装
镜像打包
既然是跑深度学习的Docker,那么大容量的数据集一定是要处理的,我们可以使用Docker文件挂载,来避免CP来CP去
Docker容器启动的时候,可以用-v参数,来指定要挂载宿主机的一个目录,
比如我要启动一个容器,宿主机的/Pics-data目录挂载到容器的/train-data目录,可通过以下方式指定:
docker run -it -v /Pics-data:/train-data ubuntu /bin/bash
这样在容器启动后,容器内会自动创建/train-data的目录。
在-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
1 当容器内已经存在需要挂载的目录时,容器内的目录及内容会被覆盖,始终与宿主机目录保持一致,宿主机目录新增文件时,容器内挂载目录也会新增,当容器挂载目录新增文件时,宿主机目录也会新增。
2 容器目录不可以为相对路径
docker run -it -v /test:soft centos /bin/bash
invalid value "/test:soft" for flag -v: soft is not an absolute path
See 'docker run --help'.
直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头
3 宿主机的目录如果为相对路径
这次,我们换个目录名test1试试
docker run -it -v test1:/soft centos /bin/bash
容器内的/soft目录挂载到哪里去了?
通过docker inspect命令,查看容器“Mounts”那一部分,
"Mounts": [
{
"Name": "test1",
"Source": "/var/lib/docker/volumes/test1/_data",
"Destination": "/soft",
"Driver": "local",
"Mode": "z",
"RW": true
}
],
可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录
原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。
4、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。
可通过两种方式解决:
1> 关闭selinux。
临时关闭:# setenforce 0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
2> 以特权方式启动容器
指定–privileged参数
如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash
当一切配置好后,需要将当前容器上传至镜像保存的时候执行以下命令:
sudo docker commit -m "added ubuntu" -a "cqy" befc2a019cdf images/change3
用来保存镜像,注意后面的名字用路径的方式比较好区分但是开头不要加斜杠/。第一个引号里面的是该镜像的描述,第二个是创建该镜像的用户,id就是使用sudo docker ps -a查看到的要保存的容器的ID,最后面是保存的新镜像的名称。
保存好后,输入sudo docker images可以看到刚刚保存的镜像images/change3,以后使用该镜像时也是如上述使用方法那样使用run -d来后台新建容器,然后使用exec来进入容器进行操作。
docker save : 将指定镜像保存成 tar 归档文件。
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
将镜像 base/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
docker save -o my_ubuntu_v3.tar base/ubuntu:v3
https://www.runoob.com/docker