美文网首页
运行容器docker

运行容器docker

作者: why_not_ | 来源:发表于2018-12-30 14:34 被阅读0次

    运行容器

    标签(空格分隔): docker


    三种启动容器时执行命令的方法

    1、CMD
    2、ENDPOINT
    3、docker run

    # docker run ubuntu pwd
    启动容器时执行pwd命令 返回容器中的当前目录 然后容器就退出运行状态 Exited
    # docker ps -a
    # docker container ls #查看所有运行状态的容器

    让容器长期运行

    容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器就不会退出

    # docker run -d ubuntu /bin/bash -c "while true; do sleep 1;done"

    CONTAINER ID 容器的短ID
    NAMES字段显示容器的名字 在启动容器时通过 --name 参数指定容器名 容器默认自动分配容器名

    通过while 启动的容器虽然能保持运行,但实际上没有任何意义。容器的用途是运行后台服务

    进入容器

    # docker attach 可以到容器启动的终端(附着

    # docker exec
    # docker exec -it ubuntu /bin/bash

    交互模式打开 执行bash ,打开了一个bash终端
    进入容器,容器的hostname就是其短ID
    可以像linux中一样执行命令
    执行exit退出容器

    1、attach直接进入容器 启动命令的终端,不会产生新的进程
    2、exec 是在容器中打开新的终端
    3、如果想直接在终端中查看启动命令的输出,用attach 其他情况使用exec
    4、只是为了查看启动命令的输出可以使用 docker logs命令

    最佳实践

    两类:服务类和工具类
    1、服务类以daemon的形式运行,对外提供服务 web 数据库等 通过-d以后台方式启动这类容器
    2、工具类容器通常能给我们提供一个临时工作环境
    # docker run -it busybox

    容器运行相关

    1、当CMD或Entrypoint或docker run 命令行指定的命令运行结束时,容器停止
    2、通过-d参数在后台启动容器
    3、通过-exec -it 进入容器 并打开一个新的终端

    指定容器的三方法

    1、短ID
    2、长ID
    3、容器名称 可通过docker rename 重命名

    docker stop 停止运行的容器
    容器在docker host中只是一个进程。如果想快速停止容器可以使用docker kill 命令

    docker start 运行停止的容器
    保留容器的第一次启动时的所有参数

    docker restart 可以重启容器,其作用是依次执行 stop、start

    --restart=always 意味着无论容器因何种原因退出(包括正常退出)就立即重启
    —-restart=on-failure:3 如果启动进程退出代码非0,则重启容器,最多3次

    docker pause
    让容器暂停工作一段时间 这时候容器不会占用CPU资源 STATUS 状态会显示 pause
    docker unpause
    恢复暂停的容器
    docker rm
    删除容器 rm可以一次指定多个容器
    docker rm -v $(docker ps -aq -f status=exited) 删除全部退出状态的容器

    1、容器可以先创建,而不启动
    docker create 命令创建的容器处于created状态
    2、使用 docker start 启动容器 docker run 其实是 create 和 start 的组合命令

    3、只有当容器命令退出时 --restart 才生效
    容器退出分为正常退出和非正常退出 docker 会根据--restart 的策略判断是否需要重启容器

    限制容器对资源的使用

    内存限额

    容器可使用的内存分为 物理内存和swap
    -m --memory 参数设置物理内存的使用量
    --memory-swap 设置物理内存和swap内存的使用总量

    # docker create --memory 200M --memory-swap 300M --network=my_net0 ubuntu bash -c "while true; do sleep 1;done"
    限制物理内存的使用量为200M swap为300-200M
    默认不指定的情况下 上面两组参数为 -1 即不做限制

    # docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 199M
    --vm 1 启动一个内存工作进程
    --vm-bytes 199M 每个进程分配199M内存

    云主机没有swap分区,超过200M启动失败

    stress: FAIL: [1] (422) kill error: No such process

    stress: FAIL: [1] (452) failed run completed in 0s
    

    如果在启动容器时只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍,内存和swap相同量

    CPU限额

    默认设置下所有容器平等的使用cpu资源
    -c --cpu-shares 设置容qin器使用cpu的权重。默认为1024
    按权重分配cpu只会发生在cpu资源紧张的情况下、在cpu空闲状态 被限制的容器也可以获取到全部cpu资源
    # docker run --name container_A -it -c 1024 progrium/stress --cpu 1
    # docker run --name container_B -it -c 512 progrium/stress --cpu 1
    --cpu 用来限制工作线程的数量

    block IO权重

    默认情况下,所有容器能平等地读写磁盘
    --blkio-weight 参数来改变容器 block IO 的优先级
    --blkio-weight 和 --cpu-shares类似,设置的是相对权重值 默认为500
    docker run -it --name con_A --blkio-weight 600 ubuntu

    bps和iops

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

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

    docker run -it --device-write-bps /dev/sda:30MB ubuntu

    cgroup 全称 control group linux操作系统通过cgroup可以设置进程使用CPU、MEM、IO资源的限制

    # docker run -d --cpu-shares 512 centos bash -c "while true; do sleep 1;done"
    /sys/fs/cgroup
    /sys/fs/cgroup/cpu/docker 目录中包含所有与 cpu 相关的 cgroup 配置
    /sys/fs/cgroup/memory/docker
    /sys/fs/cgroup/blkio/docker

    namespace

    每个容器中,都有文件系统、网卡 每个容器都会认为自己有独立的物理设备 她使容器更像一个独立的计算机
    linux实现这种方式的技术是namespace。 namespace掌管着host中的全部资源,并让每个容器都觉的自己独占使用它

    namespace实现了容器间资源隔离

    1. mount namespace 让容器看上去拥有全部文件系统 让容器拥有根文件系统
    2. UTS namespace 让容器有自己的hostname 默认情况下hostname是他的短ID
    3. IPC namespace 让容器拥有自己的共享内存和信号量semaphore来实现进程间通信 而不会和host和其他容器的IPC混在一起
    4. PID namespace 让容器拥有一套自己的PID
      ps axf 可以看到容器的进程和容器内自己的子进程
    5. Network namespace 让容器拥有自己独立的网卡、IP、路由
    6. User namespace 让容器管理自己的用户,和宿主机进行隔离

    相关文章

      网友评论

          本文标题:运行容器docker

          本文链接:https://www.haomeiwen.com/subject/lrevlqtx.html