基于Ubuntu18基础镜像-制作自己的深度学习Docker镜像及技巧

基于Ubuntu18基础镜像-制作自己的深度学习Docker镜像及技巧

微信交流群:

我建立了1组CV微信交流群,

关注公众号:菜鸡Ai

后台回复:加群

备注:学校|公司+昵称+方向 会有小哥哥拉你进群。

0 前言:

首先需要使用docker基于一个已有的镜像来新建容器进行操作,这里是基于ubuntu镜像来新建容器。这里会创建一个ubuntu操作系统的主机容器,类似于一个虚拟机来使用,然后往这个里面配置深度学习环境。

1 常用命令:

磨刀不误砍柴工,先了解下一些常用命令。

1.1 启动命令

 **sudo** systemctl daemon-reload

**sudo** systemctl start docker

**sudo** systemctl restart docker

1.2 查看命令

sudo docker images ##查看当前本地可用镜像
sudo docker ps ##查看正在运行的容器id
sudo docker ps -a ##查看创建的所有的容器id,包括正在运行,和停止的

1.3 基于镜像新建容器

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

来查看当前系统的详细信息。

1.4 本地镜像管理

1.4.1 docker tag

标记本地镜像,将其归入某一仓库。

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

将镜像ubuntu:18.04标记为ubuntu:v3 镜像。

 docker tag ubuntu:18.04 base/ubuntu:v3

1.4.2docker build

命令用于使用 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

1.4.3 docker load

导入使用 docker save 命令导出的镜像。

docker load [OPTIONS]

OPTIONS 说明:

  • –input , -i : 指定导入的文件,代替 STDIN。

  • –quiet , -q : 精简输出信息。

导入镜像:

 $ docker load < busybox.tar.gz


$ docker load --input fedora.tar

1.4.4**docker save **

: 将指定镜像保存成 tar 归档文件。

docker save [OPTIONS] IMAGE [IMAGE...]

OPTIONS 说明:

  • -o 输出到的文件。

将镜像 base/ubuntu:v3 生成 my_ubuntu_v3.tar 文档

docker save -o my_ubuntu_v3.tar base/ubuntu:v3

1.4.5**docker import **

: 从归档文件中创建镜像。

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

1.4.6 docker export

** 😗*将文件系统作为一个tar归档文件导出

docker export [OPTIONS] CONTAINER

OPTIONS说明:

  • **-o 😗*将输入内容写到文件。

将id为a404c6c174a2的容器按日期保存为tar文件。

docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2

1.4.7 docker 停止删除

docker stop 容器ID  ##后台运行的容器使用以下命令终止

docker rmi 镜像名#删除指定的镜像
docker rmi `docker images -a -q`删除本地所有的镜像

1.4.8 docker cp

将文件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目录下

2 Docker 安装

使用官方安装脚本自动安装

安装命令如下:

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 仓库进行安装

在新主机上首次安装 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"

安装 Docker Engine-Community

更新 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=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> 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:

3 卸载 Docker

删除安装包:

sudo apt-get purge docker-ce

删除镜像、容器、配置文件等内容:

sudo rm -rf /var/lib/docker

4 Ubuntu1804镜像安装

docker pull ubuntu:1804

img

查看本地镜像

$ docker images

运行容器,并且可以通过 exec 命令进入 ubuntu 容器

$ docker run -itd --name ubuntu-test ubuntu

安装成功

最后我们可以通过 docker ps 命令查看容器的运行信息:

img

5 Docker 镜像加速

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

  • 科大镜像:https://docker.mirrors.ustc.edu.cn/
  • 网易:https://hub-mirror.c.163.com/
  • 阿里云:https://<你的ID>.mirror.aliyuncs.com
  • 七牛云加速器:https://reg-mirror.qiniu.com

请在 /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

6 驱动、CUDA安装

驱动安装请见我的另一篇博文

CUDA安装详情请见我的另一篇博文

7 深度学习环境配置

Anaconda下载安装

pip3安装

Tensorflow\Pytorch安装

镜像打包

8 对深度学习大容量数据集的处理技巧

既然是跑深度学习的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

9 保存

当一切配置好后,需要将当前容器上传至镜像保存的时候执行以下命令:

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 说明:

  • -o 输出到的文件。

将镜像 base/ubuntu:v3 生成 my_ubuntu_v3.tar 文档

docker save -o my_ubuntu_v3.tar base/ubuntu:v3

10 参考资料

https://www.runoob.com/docker

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小菜学AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值