Docker容器与镜像管理

容器管理

运行容器

一、运行一个容器示例:php

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

二、将容器在前台运行:html

# 启动一个ubuntu 16.04的容器,打印完"hello world"即退出
docker run ubuntu:16.04 /bin/echo " hello world "

# 在前台运行容器并进入容器与容器交互
docker run ubuntu:16.04 /bin/bash

须要说明的是,容器是为任务而生的。一个容器建议只运行一个进程,并且这个进程须要在容器的前台运行,不能经过daemon的方式运行。若是进程退出,容器也会随之中止mysql

三、容器的启动过程说明:web

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

四、将容器放入后台运行:redis

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

五、docker run经常使用选项说明sql

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

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

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

七、进入容器ubuntu

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

八、运行容器的最佳实践centos

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

  • 服务类容器,如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也可能对应同一个镜像

镜像基本操做

一、获取镜像

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

二、查看镜像信息

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

三、为镜像建立tag

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

四、搜索镜像

docker search mysql    #搜索mysql镜像

五、 删除镜像(注:若是镜像有容器生成,须要先删除容器)

#若是一个镜像有多个tag,只会删除指定的tag,镜像自己不会删除,若是docker rmi后指定镜像ID,则全部tag都会被删除
docker rmi centos:6.6   

# 删除无标签镜像(即为none)
docker rmi $(docker images -q --filter "dangling=true")

六、导出和载入镜像

# 将本地镜像导出
docker save -o centos_6.6.tar centos:6.6

# 将本地文件导入镜像
docker load --input centos_6.6.tar

七、经过docker commit提交一个新镜像

docker commit -m "Add a new file" -a "Breeze" a925cb40b3f0 test  #使用a925cb40b3f0容器生成一个名为test的镜像
-a:指定做者
-m:相关说明信息
-p:提交时暂停容器运行
相关文章
相关标签/搜索