zoukankan      html  css  js  c++  java
  • Docker容器与镜像管理

    容器管理

    运行容器

    1、运行一个容器示例:

    # 启动一个httpd容器,使其在后台运行并将其80端口映射到宿主机80端口
    docker run -d -p 80:80 httpd
    

    2、将容器在前台运行:

    # 启动一个ubuntu 16.04的容器,打印完"hello world"即退出
    docker run ubuntu:16.04 /bin/echo " hello world "
    
    # 在前台运行容器并进入容器与容器交互
    docker run ubuntu:16.04 /bin/bash
    

    需要说明的是,容器是为任务而生的。一个容器建议只运行一个进程,而且这个进程需要在容器的前台运行,不能通过daemon的方式运行。如果进程退出,容器也会随之停止

    3、容器的启动过程说明:

    • 检查本地是否存在指定的镜像,如果没有就从指定的仓库下载
    • 利用镜像启动一个容器
    • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
    • 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
    • 从地址池配置一个IP给容器
    • 执行用户指定的程序
    • 执行完毕后停止容器

    4、将容器放入后台运行:

    docker run -d ubuntu:16.04 /bin/bash -c "while true; do echo hello world; sleep 1;done"
    

    5、docker run常用选项说明

    -t:配置一个伪终端并绑定到容器的标准输入上
    -i:让容器的标准输入保持打开
    -d:将容器放入后台运行
    -c:指定分配该容器的cpu分片
    -m:指定分配给该容器的内存大小,单位为B,K,M,G
    

    6、查看当前节点上的容器状态

    docker ps    #查看当前正在运行的容器 
    选项:
        -a:查看所有容器,包括停止的
        -q:只显示容器ID
        -l:显示最后一次创建的容器
    

    7、进入容器

    docker attach <容器name>    # 多个窗口同时attach到一个窗口时,会同步显示,该指令已废弃
    docker exec -it <容器id/容器name> /bin/bash
    

    8、运行容器的最佳实践

    容器按用途大致可分为两类:

    • 服务类容器,如webserver、database等
    • 工具类容器,如curl容器、redis-cli容器等

    通常而言,服务类容器需要长期运行,所以使用daemon的方式运行;而工作类环境通常是给我们提供一个临时的工作环境,所以一般以run –ti的方式在前台运行

    容器的启停操作

    # 容器的创建:
    	docker create 
    
    # 容器的启动:
    	docker start <容器id>
    
    # 容器的停止:
    	docker stop <容器id>
    	docker kill <容器id>
    
    # 容器的重启:
    	docker restart <容器id>
    
    # 容器的删除:
    	docker rm <容器id>
    	选项:
        	-f:强行终止并删除一个运行中的容器
            -v:删除容器挂载的数据卷 
    
    # 暂停容器:
    	docker pause <容器id>
    
    # 从暂停中恢复:
    	docker unpause <容器id>
    

    容器导入导出

    #不管容器是否在运行,均可直接导出
    docker export <containerID> > test_for_run.tar    
    
    #载入,实现容器迁移
    cat test_for_run.tar | docker import - test/ubuntu:v1.0  
    

    容器生命周期管理

    docker_life

    容器资源限制

    一个docker host上会运行若干容器,每个容器都需要CPU、内存和 IO 资源。对于 KVM,VMware等虚拟化技术,用户可以控制分配多少 CPU、内存资源给每个虚拟机。对于容器,Docker 也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。

    内存限制

    启动一个ubuntu容器,限制内存为200M, 内存与swap的总和为300M:

    docker run -it -m 200M --memory-swap 300M ubuntu:16.04
    

    选项说明:

    -m:允许分配的内存大小
    --memory-swap:允许分配的内存和swap的总大小
    --memory-swapiness:控制内存与swap置换的比例
    

    需要说明的是,如果启用了--memory-swap参数,相当于使用了swap,则实际内存限制并不生效,要想限制生效,可以不启动该参数,且将--memory-swappiness置为0

    下面是一个压测示例:

    docker run –it –m 200M –memory-swapiness 0 progrium/stress –-vm 1 –-vm-bytes 180M
    选项:
    	--vm:设置内存工作线程数
    	--vm-byptes:设置单个内存工作线程使用的内存大小
    

    上面的示例中,--vm-bytes为180M,容器工作正常;如果将其修改为230M,则容器OOM退出

    关于内存资源的更多限制可以参考这里:https://blog.opskumu.com/docker-memory-limit.html

    CPU限制

    默认情况下,所有容器可以平等的使用宿主机cpu资源且没有限制。docker可以通过-c--cpu-shares设置容器使用的cpu的权限。如果不指定,默认为1024。

    与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。

    换句话说:通过cpu share可以设置容器使用CPU的优先级

    例如,在host中启动了两个容器:

    docker run --name container_A -c 1024 ubuntu
    
    docker run --name container_B -c 512 ubuntu
    

    container_A的cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A可以得到的 CPU 是container_B的两倍。

    需要特别注意的是,这种按权重分配CPU只会发生在CPU 资源紧张的情况下。如果container_A 处于空闲状态,这时,为了充分利用CPU资源,container_B 也可以分配到全部可用的 CPU。

    下面是一个压测示例:

    # --cpu用于设置cpu工作线程的数量,有几个核就设置为几
    docker run --name "container_A" -c 1024 progrium/stress --cpu 1
    docker run --name "container_B" -c 512 progrium/stress --cpu 1
    

    两个容器运行起来之后,可以通过在宿主机上使用top查看cpu的资源消耗可以看到两个容器的cpu消耗。

    关于cpu资源的更多限制可以参考这里:https://blog.opskumu.com/docker-cpu-limit.html

    io 限制

    Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论。

    需要说明的是,目前Block IO限额只对direct IO(不使用文件缓存)有效

    下面是限制bps和iops的参数说明:

    • --device-read-bps,限制读某个设备的 bps。
    • --device-write-bps,限制写某个设备的 bps。
    • --device-read-iops,限制读某个设备的 iops。
    • --device-write-iops,限制写某个设备的 iops。

    bps是byte per second,每秒读写的数据量
    iops是io per second,每秒io的次数

    简单示例:

    # 创建一个容器,限制写的bps为30M
    docker run -it --device-write-bps /dev/sda:30MB ubuntu
    
    # 容器中,执行如下操作查看效果,然后可以通过取消限制,来查看对比效果:
    time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
    

    关于io资源的更多限制可以参考这里:https://blog.opskumu.com/docker-io-limit.html

    镜像管理

    镜像命名规范

    无论我们对镜像做何种操作,首先它得有个名字。我们在前面使用docker run来运行容器的时候,就需要传递一个镜像名称,容器基于该镜像来运行。

    一个完整的镜像名称由两部分组成:

    <image name> = <repository>:[tag]
    

    其中repository包含如下内容:

    [Docker Registry地址/][项目目录/]<名称>
    

    所以一个完整的镜像命名如下:

    [Docker Registry地址/][项目目录/]<名称>:[标签]
    

    示例:

    hub.breezey.top/op-base/openresty:1.11.2.4
    hub.breezey.top/op-base/openresty-php:1.11.2.4-7.0.27
    mysql:5.6
    ubuntu
    

    当没指明镜像tag时,默认为latest,但latest没有任何特殊含义,在docker hub上很多repository将latest作为最新稳定版本的别名,但这只是一种约定,不是强制规定,一个repository可以有多个tag,而多个tag也可能对应同一个镜像

    镜像基本操作

    1、获取镜像

    docker pull centos:6.6    #直接从docker hub获取镜像
    docker pull dl.dockerpool.com:5000/centos:6.6    #从dockerpool获取镜像
    

    2、查看镜像信息

    docker images
    docker inspect centos:latest    #获取镜像的详细信息
    

    3、为镜像创建tag

    docker tag centos:latest dl.dockerpool.com:5000/centos:6.6 
    

    4、搜索镜像

    docker search mysql    #搜索mysql镜像
    

    5、 删除镜像(注:如果镜像有容器生成,需要先删除容器)

    #如果一个镜像有多个tag,只会删除指定的tag,镜像本身不会删除,如果docker rmi后指定镜像ID,则所有tag都会被删除
    docker rmi centos:6.6   
    
    # 删除无标签镜像(即为none)
    docker rmi $(docker images -q --filter "dangling=true")
    

    6、导出和载入镜像

    # 将本地镜像导出
    docker save -o centos_6.6.tar centos:6.6
    
    # 将本地文件导入镜像
    docker load --input centos_6.6.tar
    

    7、通过docker commit提交一个新镜像

    docker commit -m "Add a new file" -a "Breeze" a925cb40b3f0 test  #使用a925cb40b3f0容器生成一个名为test的镜像
    -a:指定作者
    -m:相关说明信息
    -p:提交时暂停容器运行
    
  • 相关阅读:
    Ubuntu安装Apache
    【C#设计模式——创建型模式】抽象工厂模式
    【C#设计模式——创建型模式】工场方法模式
    【C#设计模式——创建型模式】简单工场模式
    JS判断是不是Decimal类型(正则实现)
    JS实现给页面表单设置触发默认按钮
    记录ASP.NET页面表单初始状态(主要是为了前台可以根据这个判断页面是否变动了)
    Js触发ASP.NET Validation控件的验证, 同时获取前台验证结果(不包括CustomValidator)
    根据字段名查找表名
    SqlServer判断数据库、表、存储过程、函数是否存在
  • 原文地址:https://www.cnblogs.com/breezey/p/8812039.html
Copyright © 2011-2022 走看看