社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
2.2、Docker-1.12 简单配置以及驱动介绍
在上一篇我们已经安装完了docker。在这一章里面,我们将要简单的配置一下docker这玩意的启动参数。
我们先对docker存储驱动做一些简单的介绍,docker默认支持集中存储驱动:devicemapper,aufs,overlay,btrfs等。在ubuntu系统中,默认的的存储驱动是aufs,这种方式是比较适合上生产的;在centos系列上默认的存储驱动是devicemapper,这种方式目前不建议上生产,因为默认使用的是/dev/loop1虚拟设备进行存储数据的,这样可能导致数据的不稳定,以及未来的不可扩展(官方建议是使用devicemapper的时候使用direct-lvm)。
/***********邪恶的分割线************/
我介绍下各种存储驱动比较的资料:
aufs:
分为多层镜像层,一个读写层.
修改存在的文件,有写延迟,需要拷贝整个文件到读写层
读文件性能差,需要在多层中搜索
删除一个文件,只需要在读写层放一个空白文件,镜像层文件不删除
性能
支持page cache,内存使用效率高
The underlyingmechanics of how AUFS shares files between image layers and containers uses thesystems page cache very efficiently.
大文件修改有延迟,需要拷贝整个文件到读写层然后修改
overlayfs:
分为二层,upper层和lower层,lower层也就是所谓的images层,upper层就是所谓的读写层.
修改存在的文件(在images层存在),对于小文件影响不大,对于大文件有写延迟(无论是小文件还是大文件,只要修改都会整个文件拷贝到读写层然后修改)
读文件性能优于aufs,因为overlayfs只有两层,所有对于文件搜索来说性能好于aufs
删除一个文件只需要在读写层放一个空白同名文件,镜像层文件并不删除
性能
支持 page Caching 多个容器访问同一个文件可以共享
single pagecache entry efficient with memory and a good option for PaaS and other highdensity use cases.
修改存在的文件的时候,需要从镜像层拷贝整个文件到读写层然后修改,对于大文件有写延迟,但是性能好于aufs,因为搜索文件性能优于aufs overlayfs只有二层
对inode有大量消耗,可能会导致inode用完(可以在格式化文件系统的时候多分配一点inode来解决)
device mapper:
一层就是一个快照,快照就是一个个指向底层真实数据的数据指针
新增文件,导致分配一个block(64kb),然后在这个block上写入数据,因此在有大量小文件写的场合有性能问题
修改文件,copy on write,只是拷贝修改的部分到快照层,不像aufsoverlayfs那样会拷贝整个文件,这是一个优势
删除文件就是简单的把快照层中指向真实数据的指针设置为NULL即可
性能
小文件写性能有影响,每次写会导致分配一个block(64kb)其后写数据直接在这个block中写
copy on write性能平均情况下优于aufs和overlayfs,在大量小文件的情况下要* 相同文件访问多个容器需要拷贝多次到内存,在大密度paas场景不适用,内存使用效率不高.没有overlayfs和aufs那样支持page cache.
devicemapper isnot the most memory efficient Docker storage driver. Launching n copies of thesame container loads n copies of its files into memory. This can have a memoryimpact on your Docker host. As a result, the devicemapper storage driver maynot be the best choice for PaaS and other high density use cases.
详细的存储驱动官方文档如下:
https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#select-a-storage-driver
性能对比图
/***********邪恶的分割线************/
我们可以通过systemctl来管理docker的服务。
[root@CentOS7.2~]# systemctl enable docker #自启
[root@CentOS7.2~]# systemctl disable docker #关闭自启
[root@CentOS7.2~]# systemctl reload-deamon docker #重载docker.service配置信息
[root@CentOS7.2~]# systemctl start docker #启动docker
[root@CentOS7.2~]# systemctl stop docker #停止docker
[root@CentOS7.2~]# systemctl restart docker #重启docker(建议不用,不稳定,繁忙时无法kill进程,先停止后启动比较好)
[root@CentOS7.2~]# systemctl status docker #查看docker状态
接下来,我们来稍微了解下docker1.12的启动参数。
[root@CentOS7.2~]# vi /lib/systemd/system/docker.service
/***********邪恶的分割线************/
[Unit]
Description=DockerApplication Container Engine
Documentation=https://docs.docker.com
After=network.target
[Service]
Type=notify
# the default isnot to use systemd for cgroups because the delegate issues still
# exists andsystemd currently does not support the cgroup feature set required
# for containersrun by docker
ExecStart=/usr/bin/dockerd #启动时候执行项
ExecReload=/bin/kill-s HUP $MAINPID
# Havingnon-zero Limit*s causes performance problems due to accounting overhead
# in the kernel.We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# UncommentTasksMax if your systemd version supports it.
# Only systemd226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegateyes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only thedocker process, not all processes in the cgroup
KillMode=process
[Install]
WantedBy=multi-user.target
/***********邪恶的分割线************/
我们只要配置ExecStart这个对应项,当使用systemctl start docker 时候执行的。
在docker 1.12中,默认的的deamon程序由/usr/bin/docker改成了/usr/bin/dockerd,所以用docker1.12版本以下的朋友不必惊慌。
我们来查阅下配置参数的详情:
/***********邪恶的分割线************/
[root@CentOS7.2~]# dockerd --help(其实dockerd就相当于之前的docker -d)
-b,--bridge #指定容器使用的网络接口,默认为docker0,也可以指定其他网络接口
--bip #指定桥接地址,即定义一个容器的私有网络
--cgroup-parent #为所有的容器指定父cgroup
--cluster-advertise #为集群设定一个地址或者名字
--cluster-store #后端分布式存储的URL
--cluster-store-opt=map[] #设置集群存储参数
--config-file=/etc/docker/daemon.json #指定配置文件
-D #启动debug模式
--default-gateway #为容器设定默认的ipv4网关(--default-gateway-v6)
--dns=[] #设置dns
--dns-opt=[] #设置dns参数
--dns-search=[] #设置dns域
--exec-opt=[] #运行时附加参数
--exec-root=/var/run/docker #设置运行状态文件存储目录
--fixed-cidr #为ipv4子网绑定ip
-G,--group=docker #设置docker运行时的属组
-g,--graph=/var/lib/docker #设置docker运行时的家目录
-H,--host=[] #设置docker程序启动后套接字连接地址
--icc=true #是内部容器可以互相通信,环境中需要禁止内部容器访问
--insecure-registry=[] #设置内部私有注册中心地址
--ip=0.0.0.0 #当映射容器端口的时候默认的ip(这个应该是在多主机网络的时候会比较有用)
--ip-forward=true #使net.ipv4.ip_forward生效,其实就是内核里面forward
--ip-masq=true #启用ip伪装技术(容器访问外部程序默认不会暴露自己的ip)
--iptables=true #启用容器使用iptables规则
-l,--log-level=info #设置日志级别
--label=[] #设置key=value作为守护进程的标签
--live-restore #启用热启动(重启docker,保证容器一直运行1.12新特性)
--log-driver=json-file #容器日志默认的驱动
--log-opt=map[] #容器默认的日志驱动选项
--max-concurrent-downloads=3 #为每个pull设置最大并发下载
--max-concurrent-uploads=5 #为每个push设置最大并发上传
--mtu #设置容器网络的MTU
--oom-score-adjust=-500 #设置内存oom的平分策略(-1000/1000)
-p,--pidfile=/var/run/docker.pid #指定pid所在位置
-s,--storage-driver #设置docker存储驱动
--selinux-enabled #启用selinux的支持
--storage-opt=[] #存储参数驱动
--swarm-default-advertise-addr #设置swarm默认的node节点
--tls #使用tls加密
--tlscacert=~/.docker/ca.pem #配置tls CA 认证
--tlscert=~/.docker/cert.pem #指定认证文件
--tlskey=~/.docker/key.pem #指定认证keys
--userland-proxy=true #为回环接口使用用户代理
--userns-remap #为用户态的namespaces设定用户或组
-v ,–version #查看docker版本
/***********邪恶的分割线************/
在没有特殊要求的情况下,我们很多启动配置参数是不需要用到的。所以我把我自己的配置参数贴出来给大家看下。
ExecStart=/usr/bin/dockerd --label com.exmple.storage=server1 --graph=/server/docker -H tcp://0.0.0.0:5257 -Hunix:///var/run/docker.sock --pidfile=/var/run/docker.pid
--label com.exmple.storage=server1 #将我的docker的守护进程贴上一个标签(后面会说到,用于把容器启动在指定的含有该标签的docker服务器上,对于后期负载多服务器的时候,需要将容器分配指定服务器有用)
-H tcp://0.0.0.0:5257 #将我的docker守护进程指定一个监听端口
-H unix:///var/run/docker.sock #将我的docker守护进程指定一个sock位置
--graph=/server/docker #指定我的docker存储目录
--pidfile=/var/run/docker.pid #指定docker守护进程pid文件目录
配置好上述的参数时候,我们可以来启动docker了
[root@CentOS7.2~]# systemctl stop docker
[root@CentOS7.2~]# systemctl reload-deamon docker #这步是必须的,重新加载docker.service文件的配置,否则重启也是启动之前的配置。
[root@CentOS7.2~]# systemctl start docker
至此,我们的配置和驱动的信息讲完了。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!