2.2、Docker-1.12 简单配置以及驱动介绍[三] - Go语言中文社区

2.2、Docker-1.12 简单配置以及驱动介绍[三]


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

 

            至此,我们的配置和驱动的信息讲完了。

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/kunloz520/article/details/52640581
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 16:09:34
  • 阅读 ( 984 )
  • 分类:docker

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢