Docker容器管理

以下内容转载于Breeze
原博客地址:https://www.cnblogs.com/breezey/

四、docker容器管理

1、运行容器

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的方式在前台运行

2、容器的启停操作

# 容器的创建:
    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>

3、容器导入导出

#不管容器是否在运行,均可直接导出
docker export  > test_for_run.tar    

#载入,实现容器迁移
cat test_for_run.tar | docker import - test/ubuntu:v1.0  

4、容器生命周期管理

20171208143125220.png

5、容器资源限制

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

5.1、内存限制

启动一个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

5.2、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

5.3、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容器管理)