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

    一、Docker核心概念

    1、镜像(image)

    Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向Docker容器引擎的只读模板,比如一个镜像可以是一个完整的centos操作系统,也可以是一个安装了MySQL的应用程序,称之为一个镜像。 
    镜像文件用户可以自己创建和更新现有镜像,也可以从网上下载已经做好的应用镜像直接使用。

    2、容器(Container)

    容器是镜像的另一个运行实例,是独立运行的一个或一组应用以及他们所必须的运行环境,包括文件系统、系统库类、shell环境等。镜像是只读模板,而容器会给这个只读模板一个额外的可写层。

    3、仓库(Repository)

    仓库是用来集中存放镜像的地方,当自己创建了镜像后,可以使用push命令将它上传到公共仓库(Public)或者私有仓库(Private),这样,当其他机器想要使用时,直接下载下来即可使用。

    二、Docker镜像操作

    1、搜索镜像

    • 通过docker search 命令搜索远端官方仓库的共享镜像。
    • 搜索关键字为httpd的镜像

    docker search httpd

    【Docker篇之一】Docker镜像及容器

    2、获取镜像

    • 对于docker来说,如果下载镜像时不指定标签,则默认会下载仓库中最新版,因此也可通过制定标签来下载指定版本,这里的标签(tag)就是用来区分镜像版本的。

    • 下载镜像httpd

    docker pull httpd

    【Docker篇之一】Docker镜像及容器

    整个下载过程可以看出,镜像文件由若干层(Layer)组成,我们称之为AUFS(文件联合系统),是实现增量保存与更新的基础,下载过程中会输出镜像的各层信息

    3、查看镜像信息

    docker images

    【Docker篇之一】Docker镜像及容器

    1.  
      REPOSITORY ---镜像属于的仓库
    2.  
      TAG ---镜像的标签信息,标记同一个仓库中不同镜像
    3.  
      IMAGE ID ---镜像的唯一ID号,唯一标识了该镜像
    4.  
      CREATED ---镜像创建时间
    5.  
      SIZE ---镜像大小
    • 还可以根据镜像的唯一标识ID号,获取镜像详细信息。

    docker inspect 11426a19f1a2

    【Docker篇之一】Docker镜像及容器

    • 使用docker tag命令来为本地的镜像添加新的标签。

    命令格式:docker tag 镜像名称:[标签] 新名称:[新标签]

    • 例如:本地镜像httpd添加新的名称为apache,新的标签为apache1

    docker tag httpd apache:apache1

    【Docker篇之一】Docker镜像及容器

    4、删除镜像

    • 方法一:docker rmi 仓库名称:标签
    • 方法二:docker rmi 镜像ID号

    • 注:当一个镜像有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件。但当该镜像只剩下一个标签的时候,此时删除该标签的时候会彻底删除该镜像。
    • 当使用方法二删除时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉指向该镜像的所有标签,然后删除镜像本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,在删除镜像

    5、存出镜像和导入镜像

    存出镜像

    • 当需要把一台机器上的镜像迁移到另一台机器上的时候,需要将镜像保存成本地文件,这一过程叫做存出镜像。
    • 别的机器通过拷贝的镜像,将该镜像导入到自己的镜像库中,这一过程叫做载入镜像。

    <br/>命令格式:docker save -o 存储文件名 存储的镜像<br/>

    • 将本地的httpd镜像存出apache2

    docker save -o apache2 httpd

    【Docker篇之一】Docker镜像及容器

    载入镜像

    1.  
      命令格式:docker load < 存出的镜像文件
    2.  
      或者:
    3.  
      docker --input 存出的镜像文件

    6、上传镜像

    • 本地存储的镜像文件越来越多,就要一个专门的地方存放这些镜像---仓库。目前比较方便的就是公共仓库,默认上传的是Docker hub官方仓库,需要注册账号完成登录后才能上传。

    • 在上传镜像之前还需要对本地镜像添加新的标签,然后再使用docker push命令上传。

    docker tag httpd apache:test
    docker login

    1.  
      Username: madeb //此账号需自己注册
    2.  
      Password:
    3.  
      Login Succeeded
    • 成功登录后就可上传镜像了。

    docker push apache:test

    • 注:若是需要退出登录

    docker logout

    三、Docker容器操作

    1、容器的创建与启动

    • 新创建的容器处于停止状态,不运行任何程序。
    • 需要在其中发起一个进程来启动容器,该进程是容器的唯一进程。
    • 该进程结束时,容器也会完全停止。

    <br/>命令格式:docker create [选项] 镜像 运行的程序<br/>

    1.  
      -i 让容器的输入保持打开
    2.  
      -t 让Docker分配一个伪终端

    docker create -it httpd /bin/bash 
    docker ps -a
    docker start e1e05c66ec9c //开启容器
    docker ps -a

    【Docker篇之一】Docker镜像及容器

    • 创建容器并执行一条命令。
    • 这种方式和在本地执行命令几乎没有区别

    docker run httpd /usr/bin/bash -c ls /

    • 容器在执行完ls / 后会立马停止,这个时候就需要让docker以守护态在后台运行
    • 例如,下面的程序就会在后台持续运行。

    docker run -d httpd /usr/bin/bash -c ls / "while true; do echo hello;done"

    2、容器的终止

    • 想要停止容器的运行前需要查看容器的运行状态,以及ID号

    docker ps -a

    1.  
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    2.  
      e1e05c66ec9c httpd "/bin/bash" 26 minutes ago Up 25 minutes 80/tcp friendly_euclid

    docker stop e1e05c66ec9c

    • 当查看到STATUS状态为Exited时,即状态终止。

    3、容器的进入

    • 当不进入容器时,让容器执行任务,一条任务执行完成后容器会自动停止,为了避免繁琐的情况,我们需要进入容器执行,且退出容器后,容器并不会停止。
    1.  
      命令格式:docker exec -it e1e05c66ec9c /bin/bash
    2.  
      -i 表示让容器的输入保持打开
    3.  
      -t 表示让docker分配一个伪终端
    • 例如

    docker exec -it e1e05c66ec9c /bin/bash

    【Docker篇之一】Docker镜像及容器

    4、容器的导出与导入

    容器导出

    • 无论这个容器是运行还是停止均可导出。

    <br/>命令格式:docker export 容器ID/名称 &gt; 文件名<br/>

    docker export e1e05c66ec9c > apache1

    容器导入

    • 导出的文件从A机器拷贝到B机器,之后使用docker import命令导入,成为镜像。

    <br/>命令格式:cat 文件名 | docker import - 生成的镜像名称:标签<br/>

    • 例如导入apache1 成为本地镜像

    cat apache1 | docker import - apache1 注:此处必须先使用cat,不然无法导入
    docker images

    1.  
      REPOSITORY TAG IMAGE ID CREATED SIZE
    2.  
      apache1 latest 2bfb89eb2c5d 49 seconds ago 174MB
    3.  
      apache apache1 11426a19f1a2 8 days ago 178MB
    4.  
      httpd latest 11426a19f1a2 8 days ago 178M

    5、容器的删除

    • 可以使用docker rm 命令将一个已经处于终止状态的容器删除。

    <br/>命令格式:docker rm 容器ID/名称<br/>

    docker rm e1e05c66ec9c
    docker ps -a | grep e1e05c66ec9c

    • 如果要删除一个正在运行的容器,可以添加-f选项强制删除,但建议先将容器停止在做删除操作。

    docker默认的存储目录在本地/var/lib/docker/,docker的镜像、容器、日志等内容全部都存储在这里,也可单独使用大容量分区来存储这些内容,并且一般选择LVM逻辑卷,从而避免出现docker运行过程中存储目录容量不足的问题。

    四、Docker资源控制

    1、限制cpu使用速率

    • 在docker中可以通过--cpu-quota选项来限制cpu使用率,cpu的百分比是以1000为单位的。

    docker run --cpu-quota 20000 e1e05c66ec9c //cpu的使用率限定为20%

    • 还可以通过Cgroup配置文件立即生效

    echo 20000 > /sys/fs/cgroup/cpu/docker/e1e05c66ec9ced2d6290ebe8e3fdea27f439dcbeea70921ec5d9e5b0bcffaf11/cpu.cfs_quota_us

    2、多任务按比例分析CPU

    • 当有多个容器任务运行时,很难计算cpu的使用率,为了使容器合理使用cpu资源,可以通过--cpu-share选项设置cpu按比例共享资源,这种方式还可以实现cpu使用率的动态调整。
    1.  
      docker run --cpu-shares 1024 容器A
    2.  
      docker run --cpu-shares 1024 容器B
    3.  
      docker run --cpu-shares 2048 容器C

    3、限制cpu内核使用

    • 如果服务器有16个核心,那么cpu编号为0~15,使容器绑定第1~4个内核使用。

    docker run --cpuset-cpus 0,1,2,3 容器名

    2、对内存使用的限制

    • 在docker中可以通过docker run -m 命令来限制内存使用量,相应的配置文件为/sys/fs/cgroup/memory/memory.kmem.limit_in_bytes。需要注意的是,一旦容器cgroup使用的内存超过了限制的容量,Linux内核将会尝试收回这些内存,如果仍旧没法控制内存控制在限制范围之内,进程就会被杀死。

    docker run -m 512m 容器名 //限制容器的内存为512m

    3、对blkio的限制

    • 如果是在一台服务器上进行容器的混合部署,那么会出现同时有几个程序写磁盘数据的情况,这时可以--device-write-iops选项来限制写入的iops,相应的还有--device-read-bps选项可以限制读取的iops,但是这种方法只能针对blkio限制的是设备(device),而不是分区,相应的配置文件/sys/fs/cgroup/blkio/docker/容器ID/blkioo.throttle.write_iops_device

    docker run --device-write-bps /dev/sda1:1mb 容器名 //限制容器的/dev/sda1的写入ipos为1MB

  • 相关阅读:
    Why Choose Jetty?
    Jetty 的工作原理以及与 Tomcat 的比较
    Tomcat设计模式
    Servlet 工作原理解析
    Tomcat 系统架构
    spring boot 打包方式 spring boot 整合mybaits REST services
    wireshark udp 序列号 User Datagram Protocol UDP
    Maven 的聚合(多模块)和 Parent 继承
    缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
    Mybatis解决sql中like通配符模糊匹配 构造方法覆盖 mybits 增删改
  • 原文地址:https://www.cnblogs.com/oneasdf/p/9455433.html
Copyright © 2011-2022 走看看