设为首页 收藏本站
查看: 821|回复: 0

[经验分享] Docker小结

[复制链接]

尚未签到

发表于 2018-5-30 09:31:10 | 显示全部楼层 |阅读模式
  
  1、通过Dockerfile build image

    Dockerfile格式    INSTRUCTION statement

#Example:
FROM ubuntu:14.04  
MAINTAINER Kate Smith ksmith@example.com       [维护人员信息]
RUN apt-get update && apt-get install -y ruby ruby-dev      [shell中执行]
RUN gem install Sinatra
WORKDIR /opt/webapp                    [设定工作目录,可设置多个]
CMD ["python", "app.py"]
只能有一个,按照exec模式,如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD指定的命令
#CMD [ "echo", "$HOME" ] 不进行变量替换
#CMD [ "sh", "-c", "echo", "$HOME" ] 进行变量替换
ENTRYPOINT ["cmd", "param1", "param2"...]     [配置容器 启动后执行的命令,并且不可被
                 docker run 提供的参数覆盖。只执行一条]EXPOSE 80  对外可见端口
USER  deamon 指定运行容器时的用户名或UID,后续的 RUN 也会使用指定用户
VOLUME ["<mountpoint>"] 创建一个挂载点用于共享目录
  ADD<src> <dest>
该命令将复制指定的<src> 到容器中的<dest> 。其中<src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个URL
还可以是一个tar文件(自动解压为目录)。
   COPY<src> <dest>
复制本地主机的<src> (为Dockerfile所在目录的相对路径)到容器中的<dest>
当使用本地目录为源目录时,推荐使用COPY
ENV <key> <value> 设置环境变量   ENV <key>= <value>
ONBUILD格式为ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
例如,Dockerfile使用如下的内容创建了镜像image-A
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基于A创建新的镜像时,新的Dockerfile中使用FROM image-A 指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。
FROM image-A
#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
  
docker build -t ouruser/sinatra:v2 .  最后这个.表示Dockerfile位于当前目录[构造镜像]
  
  2、        基础命令
docker run -d -P training/webapp
docker run -d -p 63250:5000 training/webapp 前一端口为外部host端口。后一端口为容器内使用的端口
  -P:则自动映射端口到主机的49153 to 65535
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py (绑定udp端口)交互式运行 docker run -t -i –rm ubuntu:14.04/bin/bash  增加—rm 运行结束则删除容器
查看日志标准输出docker logs insane_babbage   -f follow日志
列出容器 docker ps   -l最近的容器   -a 所有
停止容器docker stop
查询容器运行的pid    docker top
查询容器的详细配置信息  docker inspect nostalgic_morse
查看容器制定参数名字 docker inspect -f "` `.`Name `" aed84ee21bde
命名容器 docker run -d -P --name web training/webapp python app.py
复制文件 docker cp CONTAINER:PATH HOSTPATH   容器中内容复制到主机中
容器链接
source container:
docker run -d --name db training/postgres
recipient container:
docker run -d -P --name web --link source:alias training/webapp
--link <name or id>:alias   name为源容器名  alias为链接的别名
  被连接的容器(源容器)不用将端口映射到外部主机,安全性更高
  
  3、        环境变量
Docker exposesconnectivity information for the source container to the recipient container intwo ways:


  •   Environment variables,
  •   Updating the /etc/hosts file.
  环境变量
  Docker will then also define a set of environmentvariables for each port that is exposed by the source container. The patternfollowed is:

  •   <name>_PORT_<port>_<protocol>     will contain a URL reference to the port. Where <name> is the alias     name specified in the --link parameter (e.g. webdb), <port> is the     port number being exposed, and <protocol> is either TCP or UDP. The     format of the URL will be:     <protocol>://<container_ip_address>:<port> (e.g.     tcp://172.17.0.82:8080). This URL will then be split into the following 3     environment variables for convenience:
  •   <name>_PORT_<port>_<protocol>_ADDR     will contain just the IP address from the URL (e.g.     WEBDB_PORT_8080_TCP_ADDR=172.17.0.82).
  •   <name>_PORT_<port>_<protocol>_PORT     will contain just the port number from the URL (e.g.     WEBDB_PORT_8080_TCP_PORT=8080).
  •   <name>_PORT_<port>_<protocol>_PROTO     will contain just the protocol from the URL (e.g.     WEBDB_PORT_8080_TCP_PROTO=tcp).
这些环境变量只是为第一个在container里的进程设置的。类似的守护进程(例如 sshd)会在新建子shell的时候抹除这些变量;且当source container重启时,环境变量不会自动改变。可采用更新/etc/hosts文件来解决此问题

IP地址及端口等信息都是特指source container中的相关信息

DB_NAME=/web2/db          DB为链接的alias

DB_PORT=tcp://172.17.0.5:5432   本参数为最小的链接端口(若同时用于TCPUDP,则特指TCP的信息)

DB_PORT_5432_TCP=tcp://172.17.0.5:5432  此项可被拆分成以下的三个环境变量
DB_PORT_5432_TCP_PROTO=tcp                  
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_ADDR=172.17.0.5  
/etc/hosts 会自动更新链接端口
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7  aed84ee21bde
. . .
172.17.0.9  db
  4、        数据卷映射
容器内创建一个数据卷
docker run -d -P --name web -v /webapp training/webapp python app.py
挂载一个主机中的目录到容器中,默认是读写
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
这里是没法用 Dockerfile实现的,因为这样的用法有悖于可移植性和共享. 因为本地目录就像他名字告诉我们的,
是和本地相关的,不一定可以在所有的宿主机上工作.
挂载一个主机中的目录到容器中,指定只读
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
仅挂载一个文件到容器相关目录下
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
如果有一些持久化的数据,并且想在不同的container之间共享这些数据,或者想在一些没有持久化的container
中使用,最好的方法就是使用 Data Volumn Container, 在把数据mount到你的container里
让我们创建一个有名字的 Data Volume Container 来共享数据.
$ docker create -v /dbdata --name dbdata training/postgres
  这样做之后就可以通过 --volumes-from /dbdata mount到其他的container里了$ docker run -d --volumes-from dbdata --name db1 training/postgres
  还可以继续共享到另外一个container$ docker run -d --volumes-from dbdata --name db2 training/postgres
  -volumes-from 可以多次使用来mount 多个conatainer里的多个volumes
  这个操作是链式的,我们在db1中通过 --volumes-from mount进来的volume可以继续被其他container使用。$ docker run -d --name db3 --volumes-from db1 training/postgres
Volume的另外一个用处就是备份、恢复和migrate数据:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
  5、        CGROUP资源管理

  

  Cgroup:cgroup的功能在于将一台计算机上的资源(CPU,memory, network)进行分片,来防止进程间不利的资源抢占。

Terminology


  •   cgroup - 关联一组task和一组subsystem的配置参数。一个task对应一个进程, cgroup是资源分片的最小单位。
  •   subsystem - 资源管理器,一个subsystem对应一项资源的管理,如 cpu, cpuset, memory
  •   hierarchy - 关联一个到多个subsystem和一组树形结构的cgroup. cgroup不同,hierarchy包含的是可管理的subsystem而非具体参数
subsystem

1blkio--为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等)。

2cpu -- 使用调度程序提供对CPUcgroup任务访问。

3cpuacct--自动生成cgroup中任务所使用的CPU资源报告。
4cpuset--cgroup中的任务分配独立CPU(在多核系统)和内存节点。
5devices--可允许或者拒绝中的任务对设备的访问。
6freezer--挂起或者恢复cgroup中的任务。
7memory--设定cgroup 中任务使用的内存限制,并自动生成任务使用的内存资源报告。
8net_cls--使用等级识别符(classid)标记网络数据包,可允许Linux  流量控制程序(tc)识别从具体cgroup 中生成的数据包。
(9)net_prio--允许管理员动态的通过各种应用程序设置网络传输的优先级,类似于socket 选项的SO_PRIORITY,
但它有它自身的优势
cgsnapshot可查看当前的cgroup信息
CPU:    mpstat –P ALL 2  2s打印一次cpu信息
cpuset.cpus:指定允许这个 cgroup 中任务访问的 CPU(中央处理器)。这是一个用逗号分开的列表,
格式为 ASCII,使用小横线("-")代表范围,例如:cpuset.cpus=1,2-4
cpuset.mems:设置cgroup可使用的memory node
cpu.shares: 控制该 cgroup 获得的时间片配额
         如/cpu/cpu.shares : 1024    /cpu/foo/cpu.shares : 2048   则进程CPU占比2:1
cpu.cfs_period_us :时间周期(微秒),跟核数有关
cpu.cfs_quota_us :时间周期(微秒)配额

内存:
memory.limit_in_bytes:设定用户内存的最大量(包括文件缓存)。
memory.memsw.limit_in_bytes:设定最大内存与 swap 用量之和。
例子1:
              mount {
                     cpu = /mnt/cgroups/cpu;
                     cpuacct = /mnt/cgroups/cpu;
              }
              group daemons/www {
                     perm {
                            task {
                                   uid = root;
                                   gid = webmaster;
                                   fperm = 770;
                            }
                            admin {
                                   uid = root;
                                   gid = root;
                                   dperm = 775;
                                   fperm = 744;
                            }
                     }
                     cpu {
                            cpu.shares = "1000";
                     }
              }
              group daemons/ftp {
                     perm {
                            task {
                                   uid = root;
                                   gid = ftpmaster;
                                   fperm = 774;
                            }
                            admin {
                                   uid = root;
                                   gid = root;
                                   dperm = 755;
                                   fperm = 700;
                            }
                     }
                     cpu {
                            cpu.shares = "500";
                     }
              }
Docker下容器的cgroup会自动生成,更改subsystem中的参数即可分配资源
  参考:
  官方文档        https://docs.docker.com/

  安装docker参考  http://segmentfault.com/blog/seanlook/1190000000733628

  别人的docker总结http://blog.tankywoo.com/docker/2014/05/08/docker-1-start.html

  http://blog.tankywoo.com/docker/2014/05/08/docker-2-dockerfile.html

  http://blog.tankywoo.com/docker/2014/05/08/docker-3-docker-registry.html

  http://blog.tankywoo.com/docker/2014/05/08/docker-4-summary.html

  资源分配参考  http://segmentfault.com/blog/yexiaobai/1190000000681188
  http://www.cnblogs.com/wang_yb/p/3942208.html

  http://blog.chinaunix.net/uid-20788636-id-4451420.html

  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-482876-1-1.html 上篇帖子: 网络工程师眼中的docker 下篇帖子: docker高级应用之单机持久化固定容器IP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表