关于docker--device的信息
本篇文章给大家谈谈docker--device,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
Docker基础
Docker 是一个开源的应用容器引擎,基于Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker最早是在Ubuntu 12.04上开发实现的;
Red Hat则从RHEL6.5开始纳中对Docker进行支持。
而后Windows和Mac上也相应有了Docker版本支持。
在Docker容器技术出现之前,Linux上是已经有一个docker的工具的,但此docker非彼Docker。
这个docker是一个窗口停靠栏程序,就像苹果的Mac系统中的dock那个程序一样的一个工具。
为了区分开来,我们以Docker和docker来进行区分。
Docker:指容器技术。
docker:指窗口停靠栏程序。
Docker技术出来后,因为Linux系统上已经有了docker这个工具,所以Docker软件名也不能跟人家重名啊,要不然没办法安装。
由于那个时候Docker的官网是docker.io,所以就在软件名称上加了io的后缀,在Ubuntu中就是docker.io,在CentOS中就是docker-io。
但是虽然软件名跟docker程序不一样了,但软件安装后的操作命令还是一样的,都是docker的这个命令,所以要安装Docker软件,要先看看洞备山有没有安装了那个停靠栏程序docker,有的话要先卸载才行,要不然执行的命令是不对的。
这个时期要安装Docker,就要用docker加io后缀的方式来安装。
Docker容器使用docker.io和docker-io为软件名,主要是前期的一段时间。
后来随着Docker的发展,软件包名改成了docker-engine,不同系统中名称达到了统一。
再后来,随着Docker技术的火爆,在征得docker停靠栏程序作者同意下,原先的停靠栏程序docker名称改掉了,改成了wmdocker,Docker容器技术的软件包名才正式成了docker这个名称,Docker软件包的名称又得到了一次完全的统一。
到Docker1.13.1版本之前,Docker软件包的名称有两次变化,从docker-io(docker.io)到docker-engine,再到docker。
Docker发展到1.13.1版本号后,Docker公司把Docker分成了社区版(免费)Docker CE和商业版(付费)Docker EE两种形式,并且版本号命名方式也改了,以前是那种常用的版本号命令方式,比如0.1、0.2、1.0之类的,现在分社区和商业版后,版本号是“年.月”的形式命名的,比如2019年10月发布的,版本号就是19.10。
所以在Docker1.13.1之后,直接是Docker-ce 17.03.0版本了,也就是2017年03月发布的。
现在要安装最新版的Docker软件包,就是使用docker-ce这个名称了,如果是商业版的就是docker-ee了。
目前docker的默认存储引擎为overlay2,不同的存储引擎需要相应的文件系统支持,如需要磁盘分区的时候传递d-type稳健分层功能,即需要传递内核参数并开启格式化磁盘的时候指定的功能。
存储引擎的选择文档
AUFS
AUFSAnotherUnionFileSystem是一种UnionFS。V2版本后更名为 advanced multi‐layered unification fileystem,即高级多层统一文件系统。所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种系统可以一层一层的叠加修改文件。无论底下有多少层都是只读,只有最上层的文件系统是可读写。当需要修改一个文件时,AUFS创建该文件的一个副本。使用CoWCopy-on-Write将文件从只读层复制到可写滚耐层进行修改,结果也保留在可写层、在Docker中。底下的制度层就是image,可写层就是Container。
Overlay
一种Union FS文件系统,Linux内核3.18后支持
Overlay2
overlay的升级版,到目前为止,所有Linux发行版推荐使用的存储类型
devicemapper
是CentOS和RHEL的推荐存储驱动程序,但是依赖于direct-lvm,存在空间受限的问题,虽然可以通过后期配置解决;因为之前的内核版本不支持overlay2(集中在Centos/RHEL7.2之前版本);但当前较新版本Centos和RHEL现已经支持overlay2。
zfs/btrfs(Oracle-2007)
目前没有广泛应用;这些文件系统允许使用高级选项,例如创建“快照”,但需要更多的维护和设置。并且每一个都依赖于正确配置的后备文件系统。
vfs
用于测试环境,适用于无法适用Cow文件系统的情况。此存储驱动程序的性能很差,通常不建议在生产中使用。
1)overlay存储驱动程序已在Docker Engine-Enterprise 18.09中弃用,并将在以后的版本中删除。建议将overlay存储驱动程序的用户迁移到overlay2。
2)devicemapper存储驱动程序已在Docker Engine 18.09中弃用,并将在以后的版本中删除。建议将devicemapper存储驱动程序的用户迁移到overlay2。
建议使用overlay2存储驱动程序。首次安装Docker时,默认情况下使用overlay2。早期版本,默认情况下会使用aufs。如果要在新版本中使用aufs,则需要对其配置,并且可能需要安装其他软件包,例如linux-image-extra。
对于Docker,支持文件系统是所在的文件系统 /var/lib/docker/。一些存储驱动程序仅适用于特定的后备文件系统。
配置 Docker 存储驱动非常简单,只需要修改配置文件即可。
docker配置文件路径
许多Linux用户在安装系统的时候,并没有分配/var 分区,而在粗毕安装Docker后才发现,它友仿的默认存放位置是在 /var/lib/岩告芹docker。
Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致
在 ubuntu 中的位置是:/etc/default/docker
在 centos 中的位置是:/etc/sysconfig/docker
我使用 CentOS 7,所以只需要更改 vim /etc/sysconfig/docker 成
OPTIONS=--graph=“/home/lib/docker” --selinux-enabled -H fd://
然后 service docker start 重新启动 Docker 的路径就改成 /home/lib/docker 了
tips:原来的镜像和容器都找不到了,因为路径改了(原来的镜像是在/var/lib/docker/devicemapper/devicemapper/{data,metadata})
Docker启动时的报错汇总
八个Docker常见故障
系统是CentOS 7.2
系统内核及docker版本如下 :
启动报错提示如下 :
从以上报错提示信息中也没看到错误的具体原因。然后我又用 dockerd 来直接启动,就在输出信息最下面看到一条错误提示,如下:
根据最后的报错 Error starting daemon: 搜索到这篇博客,得到解决。
具体解决办法是:
vim /etc/sysconfig/docker
加入如下:
/etc/docker/daemon.json
加入如下内容:
然后重启docker,顺利解决:
CentOS-7 中介绍了 firewalld,firewall的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产斗档镇生冲蠢缺突。
当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作。
当你使用的是 Systemd 的时候, firewalld 会在 Docker 之前启动,但是如果你空粗在 Docker 启动之后再启动 或者重启 firewalld ,你就需要重启 Docker 进程了。
这是由于在运行这次容器之前,成功启动过一次,在上次访问时,因为防火墙的问题导致不能正常访问Nginx,所以将iptables的filter表清空了,并且重启过iptables,然后再次运行时,就报了以上错误。
重启防火墙
再重启docker守护进程即可
docker daemon启动失败:Unable to take ownership of thin-pool
原因: /var/lib/docker/devicemapper/metadata/ 内metadata丢失
workaround:
Eric Paris 2016-04-27 08:20:10 EDT
docker run运行容器时报出如下错误:
当前的具体原因是做实验在 /sys/fs/cgroup/cpuset/ 新建了 container目录,并把 container/cpuset.cpus 设置为了 0-3
解决方法 :
将 /sys/fs/cgroup/cpuset/container/cpuset.cpus 设为空后,上述问题得到解决。
具体原因可查看此篇博客:
在docker下使用显卡
#!/bin/bash
image_name=hub.docker.com/nvidia/cuda:10.2-base-ubuntu18.04
export CUDA_SO="$(\ls /usr/lib64/宏察libcuda* | xargs -I{} echo '-v {}:{}') $(\肢绝野ls /usr/历喊lib64/libnvidia* | xargs -I{} echo '-v {}:{}')"
export DEVICES=$(\ls/dev/nvidia* | xargs -I{} echo '--device {}:{}')
docker run ${CUDA_SO} ${DEVICES} -it -d--shm-size 8G \
-v /home/to/your/data:/dataset \
-v /usr/bin/nvidia-smi:/usr/bin/nvidia-smi \
--name ${container_name} ${image_name} /bin/bash
Docker限制容器的Block IO
Block IO指的是磁盘的读写,docker可以通过设置权重以及限制bps和iops的方式控制容器读写磁盘的带宽。
通过命令
docker help run | grep -E ‘bps|IO’
可以查询block IO的选项参数。
主要参数有:
–blkio-weight:容器默认磁盘IO的加权值,有效值范围为10-1000。
–blkio-weight-device: 针对销老亏特定设备的IO加权控制。其格式为DEVICE_NAME:WEIGHT
–device-read-bps:限制此设备上的读速度(bytes per second),单位可以是KB、MB或者GB。
–device-read-iops:通过每秒读IO次数来限制指定设备的读速度。
–device-write-bps :限制此设备上的写含则速度(bytes per second),单位可以是KB、MB或者GB。
–device-write-iops:通过每秒写IO次数来限制指定设备的写速度。
接下来将介绍每一个命令的具体使用方法。
1、–blkio-weight、–blkio-weight-device
使用以下命令创建容器
docker run -it --rm --blkio-weight 100 centos /bin/bash
采用docker inspect 命令查看生成的容器的元数据。
2、–device-write-bps、–device-read-bps
2.1 --device-write-bps
使用以下命令创建容器,并限制容器的写入速度是上限30MB/s
docker run -it --rm --device-write-bps /dev/sda:30MB centos
采用docker inspect命令对容器数据进行查看,发现设置成功。
在容器内采用dd命令对容器的写入速度进行测试,验证其读写速度在30M左右,其中oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效。
如果不采用oflag=direct方式,进行测试,发现速度为2.0GB/s,也间接说明成功限制容器写入速度。
2.2 --device-read-bps
使用以下命令创建容器,并限制容器的读出数据速度是上限30MB/s
docker run -it --rm --device-read-bps /dev/sda:30MB centos
同样,采用docker inspect命令对容器数据进行查看,发现设置成功。
在容器内采用dd命令对容器的写入速度进行测试,验证其读写速度在30M左右。首先需要生成读取数据文件test.out。
time dd if=/dev/zero of=test.out bs=1M count=256
然后再运行dd命令,对容器读取亏神数据速度进行测试,和–device-write-bps类似,iflag=direct是对–device-read-bps的读取速度进行限制。
time dd if=test.out of=/dev/zero bs=1M iflag=direct
在不加iflag=direct的情况下进行测试,发现速度为7.9GB/s,远远大于30MB/s,从而可以看出成功限制容器读取数据的速度。
3、–device-write-iops,–device-read-iops
–device-write-iops,–device-read-iops是通过限制容器每秒读取IO的次数来限制容器的读写速度。
3.1 --device-write-iops
使用以下命令创建容器,并限制容器的每秒写入数据次数不超过30次。
docker run -it --rm --device-write-iops /dev/sda:30 centos
同样,采用docker inspect命令对容器数据进行查看,发现设置成功。
在容器内采用dd命令对容器的写入速度进行测试,写入速度限制到了15.8MB/s。
time dd if=/dev/zero of=test.out bs=1M count=256 oflag=direct
在不加oflag-direct的时候进行测试,速度为2.4GB/s,说明限制容器写入次数成功。
3.2 --device-read-iops
使用以下命令创建容器,并限制容器的每秒读取数据次数不超过30次。
docker run -it --rm --device-read-iops /dev/sda:30 centos
同样,采用docker inspect命令对容器数据进行查看,发现设置成功。
然后在运行dd命令对容器每秒读取io次数进行查看,命令格式通–device-read-bps,接下来将不再进行赘述,直接上图,读取速度为15.8MB/s。
在不加iflag=direct的情况下进行测试,发现读取速度为9.0GB/s远大于15.8MB/s,说明限制容器读取次数成功。
————————————————
原文链接:
docker run详解
命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Usage: Run a command in a new container
中文意思为:通过run命令创建一个新的容器(container)
常用选项说明
-d, --detach=false, 指定容器运行于前台还是后台,默认为false
-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
-u, --user="", 指定容器的用户
-a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="", 指定容器的工作目录
-c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
-e, --env=[], 指定环境变量,容器中可以使用该环境变量
-m, --memory="", 指定容器的内存上限
-P, --publish-all=false, 指定容器暴露的端口
Docker 会随机映射一个49000--49900
-p, --publish=[], 指定容器暴露的端口
指定固定端口到容器端口
-h, --hostname="", 指定容器的主机名
-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[], 给容器挂载其他容器上的卷,挂载到容器的某个目录
--cap-add=[], 添加权限,权限清单详见:
--cap-drop=[], 删除权限,权限清单详见:
--cidfile="", 运行容器后,在指定文件中写厅薯入容器PID值,一种典型的监控系统用法
--cpuset="", 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
--device=[], 添加主机设备给容器,相谨伏州当于设备直通
--dns=[], 指定容器的dns服务器
--dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="", 覆盖image的入口点
--env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
--expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
--link=[], 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="", 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge", 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
$ docker run -it --net container:4ddf4638572d busybox ifconfig
--net参数允许一个容器进去另一个容器,甚至等于host,即与宿主机共享网络,祥蔽本质上就是共享一个进程网络,即namespace技术。也是docker进程隔离的本质。
container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false, 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="no", 指定容器停止后的重启策略:
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
--rm=false, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
示例
运行一个在后台执行的容器,同时,还能用控制台管理:docker run -i -t -d ubuntu:latest
运行一个带命令在后台不断执行的容器,不直接展示容器内部信息:docker run -d ubuntu:latest ping
运行一个在后台不断执行的容器,同时带有命令,程序被终止后还能重启继续跑,还能用控制台管理,docker run -d --restart=always ubuntu:latest ping
为容器指定一个名字,docker run -d --name=ubuntu_server ubuntu:latest
容器暴露80端口,并指定宿主机80端口与其通信(: 之前是宿主机端口,之后是容器需暴露的端口),docker run -d --name=ubuntu_server -p 80:80 ubuntu:latest
指定容器内目录与宿主机目录共享(: 之前是宿主机文件夹,之后是容器需共享的文件夹),docker run -d --name=ubuntu_server -v /etc/www:/var/www ubuntu:latest
[img]关于docker--device和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。