Docker 基本用法

1. 安装社区版docker-ce 及 nvidia-docker2 插件

通过官网介绍的软件源的方式安装. 如果要安装nvidia-docker,由于其需要与docker-ce的版本匹配,所以如果是手动下载安装的话需要注意版本号.
nvidia-docker对宿主机的要求是安装了nvidia驱动程序和docker程序,而CUDA toolkit安装在容器里边,而不必安装在宿主机上. 因此包含cuda toolkit的镜像通常都很大.
安装之后重载Docker daemon: sudo pkill -SIGHUP dockerd
运行示例: docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
离线安装: ubuntu下借助apt-rdepends找出所有的递归依赖: apt-get download $(apt-rdepends docker-ce|grep -v "^ ")
CentOS等其它版本的安装参考: https://github.com/gzvincen/docker-offline-install-package

nvidia深度学习开发栈如下图所示:

2. 镜像加速

对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中配置加速器地址:
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
或者daocloud的http://4ce12ab7.m.daocloud.io
重新启动服务:
sudo service docker restart

3. 建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker 组:
sudo groupadd docker
将当前用户加入 docker 组:
sudo usermod -aG docker $USER
退出当前终端并重新登录才可生效(如果急用,运行docker时加sudo)。

4. 运行容器

docker run -dit ubuntu
加--rm参数,在容器终止运行后自动删除容器文件。

5. 进入容器命令行

docker attach 243c # 如果镜像的入口并非shell,则不能够进入shell,需要执行 docker exec
docker exec -it 69d1 bash

6. 容器与宿主机互相拷贝文件: docker cp

Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

7. 将容器保存为镜像:

docker commit 容器id 镜像名称

8. 上传镜像到仓库:

打tag: docker tag 镜像名称 远程镜像名称tag
docker image ls 进行查看
上传docker push 远程镜像名称tag
为了加速, 可以使用HTTPS_PROXY=https://xxx docker push

9. 停止容器: docker stop --time=20 container_name 会发送信号SIGTERM并等待一定时间后终止.

docker kill 发出SIGKILL 强制终止

10. 删除已停止的容器: 较新版的删除所有已停止的容器快捷方式: docker container prune

查出容器的 ID: docker container ls --all
删除指定的容器文件 docker container rm [containerID]
删除镜像 docker rmi -f [image ID] 如果有对应的启动的容器需要-f(force)一并删除

11. 列出容器: 正在运行中的程序: docker ps, 使用-a包括已停止的容器.

12. 镜像无法联网, 可尝试在docker run时加 --net host

13. 启动已经终止的容器: docker start 容器id

14. detach 即退出容器shell而不终止容器: Ctrl+p + Ctrl+q

15. 容器导出/导入到文件

docker export -o project-image.tar 45589e5912ce 导入容器镜像用import : docker import my_ubuntu_v3.tar runoob/ubuntu:v4 可以将导入的镜像命名为后者, 如果不命名,则是<none>. 另外,还可以用save命令将镜像完整保存,包括历史版本和元数据信息,所以文件可能比较大。相应的用load命令导入: docker load < project-image.tar
导入之后通过docker images命令可以看到新导入的镜像.
区别是export导出的是容器, save导出的是镜像, 另外,最好用save导出比较完整,否则容易出现cuda与驱动不匹配的问题.
另外,导出到文件时进行压缩可节省空间:
导出镜像: docker save ubuntu:v4 | gzip -c > ubuntu-v4.tgz
导入镜像: gunzip -c project-v2.tgz | docker load

16. 移除所有的容器和镜像(大扫除):

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)

17. 验证GPU可用性: docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

--rm 表示运行完毕就删除容器, -dit -d表示以daemon后台运行, -i交互式-t新的伪终端.
如果不加-it运行的时候无法接受ctrl+c等输入.
容器的启动方式: nvidia-docker start 071b0b

Docker 更多介绍

关于网络配置

在使用默认的桥接模式下,容器启动后会被分配一个与docker0在同一网段的地址,在容器内部默认显示为eth0,在宿主机上产生一个临时的vethXXX接口。

端口映射

在主机上查看端口映射的方式为docker ps(桥接方式会显示端口)、docker inspect [id]、netstat -nlp

netstat可能只会显示出tcp6的监听状态,实际上ipv4的地址也监听了。

在访问容器内的服务时,如将mysql的3306端口映射到主机上的13306端口,则通过13306端口通信时客户端使用的是docker0的地址,需要配置mysql容许建立连接的ip地址。除了设置bind-address外,可能还需要设置特定用户的权限:
update user set host='%或者ip' where xxx;
flush privileges;
可以通过命令
telnet localhost 13306
来检测是否能够建立tcp连接

容器连接

由于容器间应用程序被相互隔离,在不使用--link连接容器时难以从一个容器内建立到另外一个容器内的进程的连接,除非使用共享的socket文件来实现unix socket通信(挂载相同的卷或者同样具有对某一系统目录的写权限)。在知道容器的ip时可以发送ping ICMP数据包
要建立容器之间的链接,必须在启动时通过参数--name $container_name给容器命名
--link name:alias Docker在两个容器之间创建了一个安全的隧道,这是链接的巨大优势, 通过连接,我们不需要向外部网络暴露端口.
在连接了目标容器后,我们可以在源容器中查看到/etc/hosts文件中多了一个目标容器的host解析:
172.17.0.2 alias 13065893a1dd name
执行netstat -nlt不能够看到目标容器中开放的端口,但是可以访问。

容器的hostname

在用docker运行一个镜像时如果使用桥接方式,没有用-h指定hostname,则使用产生的容器id的一部分作为hostname,解析为容器内eth0的地址。如果需要连接两个容器,最好是指定hostname而不是ip的形式来建立tcp连接。
如果通过--net='host'指定容器使用host的网络配置,那么hostname、网络接口、dns等信息完全一样。
容器内的网络配置是只读的,如果想要在容器内修改配置,需要在运行时加上参数--cap-add=NET_ADMIN来赋予修改权限(如果采用了host方式会影响到host主机的网络配置)。

数据存储

容器停止后再次运行时(docker start)上次修改后的数据得以保留,不会丢失。而从镜像重新创建一个容器运行时是镜像原本的数据。
将数据从容器中拷出来:
docker cp containerId:/file/path/within/container /host/path/target
更方便的方式可能就是使用-v挂载外部卷了,直接在容器外部的文件中读写。

Docker 及 nvidia-docker 使用的更多相关文章

  1. docker挂载NVIDIA显卡运行pytorch

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃   写在前面: 请参考之前的文章安装好CentOS.NVIDIA相关驱动及软件.docker及 ...

  2. CentOS7 Nvidia Docker环境

    最近在搞tensorflow的一些东西,话说这东西是真的皮,搞不懂.但是环境还是磕磕碰碰的搭起来了 其实本来是没想到用docker的,但是就一台配置较好电的服务器,还要运行公司的其他环境,vmware ...

  3. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(一)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(一) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (一)ubuntu18.04配置n ...

  4. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(三) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (三)配置远程桌面连接访问dock ...

  5. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (二)nvidia docker配 ...

  6. centos7 安装 NVIDIA Docker

    安装环境: 1.centos7.3 2.NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] 安装nvidia-docker a.安装docker 可参考ce ...

  7. docker 使用 Nvidia 显卡

    docker19.03读取NVIDIA显卡 作者: 张首富 时间: 2019-09-06 w x: y18163201 前言 2019年7月的docker 19.03已经正式发布了,这次发布对我来说有 ...

  8. 【Docker】使用Docker Client和Docker Go SDK为容器分配GPU资源

    目录 背景 使用 Docker Client 调用 GPU 依赖安装 安装 Docker 安装 NVIDIA Container Toolkit¶ --gpus 用法 使用 Docker Go SDK ...

  9. 配置 Docker 加速器(Docker Hub Mirror)

    Docker 加速器是什么,我需要使用吗? 使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验.因此 DaoCl ...

  10. 建立docker私有库(docker registry)(转)

    建立docker私有库(docker registry) 博客分类: docker   我的目标还是无互联网安装,部署内部的docker私有库,目前docker镜像的获得还是需要互联网,将下载好的do ...

随机推荐

  1. nodejs加载模块心得,mongoose的继承,schematype的mixd介绍

    1. require("xxx")可以是原生模块, 也可以是根目录“/node_modules”下的某个模块 2. 多个模块的package.json使用同一个相同模块的时候,将改 ...

  2. 关于java内存泄露的总结--引用的类型:强引用,弱引用,软引用

    今天面试了一家公司的java开发方面的实习生,被问到一个问题:如何处理java中的内存泄露问题,保证java的虚拟机内存不会被爆掉,当时其实觉得面试官的问题有点泛,所以也没有很好领会他的意思,答案也不 ...

  3. 模块-Memcached、Redis

    目录 Mecache 安装 使用 Redis 安装 Python操作Redis 操作模式 连接池 操作 String Hash List Set sort set 其他常用操作 管道 发布订阅 sen ...

  4. oracle安装出错/runInstaller

    http://blog.csdn.net/yabingshi_tech/article/details/48313955 http://www.cnblogs.com/lihaozy/archive/ ...

  5. Daily Scrum5 11.7

    今日任务: 姓名 任务 时长 徐钧鸿 学习了java连接sqlserver的方法并且实现了连接池 2h 张艺 继续完成和用户管理有关的类的移植(Register.Success.Validate等) ...

  6. 20145214 《网络对抗技术》 Web基础

    20145214 <网络对抗技术> Web基础 1.实验后回答问题 (1)什么是表单 表单在网页中主要负责数据采集,提供了填写数据.选择数据,收集数据并提交给后台的功能 一个表单有三个基本 ...

  7. CS小分队第二阶段冲刺站立会议(6月1日)

    昨日成果:完成了,文件图标的获取,以及代码删除获取文件的图标的功能:实现了从桌面拖动一个应用到窗体进行添加的功能: 遇到问题:获取的文件图标太小了,比较模糊:从外面拖动文件到窗体时,图标一直获取错误, ...

  8. 28_数据库_第28天(数据库、表及表数据、SQL语句)_讲义

    今日内容介绍 1.MySQL数据库 2.SQL语句 01数据库概念 A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来, 用户可以对数据库中的数据进行 ...

  9. 用CSS3的animation轻松实现背景动画:漂浮的云

    背景动画如果用的恰当,会给网页带来意想不到的效果.在过去,我们只能用flash或Javascript来实现.幸运的是,CSS3的流行使得我们完全可以使用它来实现这种效果,不再依赖其它编程技术.一段简单 ...

  10. HDU 2123 An easy problem

    http://acm.hdu.edu.cn/showproblem.php?pid=2123 Problem Description In this problem you need to make ...