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 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:提交时暂停容器运行
Docker容器与镜像管理的更多相关文章
- Docker容器集群管理之Swarm
Docker容器集群管理主流方案 Swarm Docker公司自研发的集群管理系统. Kubernetes Google开源的一个容器集群管理系统,用于自动化部署.扩展和管理容器应用.也称为K8S ...
- Docker容器 关于镜像构建的安全问题
写在前面 确保容器中服务与应用安全是容器化演进的关键点.容器安全涉及到应用开发与维护的整个生命周期,本文主要从镜像构建的视角来看docker容器的一些安全问题及应对措施. 一.权限管理 1.避免以容器 ...
- 理解docker容器和镜像(layer,ufs)和docker命令解释
博客好文1:http://blog.csdn.net/x931100537/article/details/49633107(理解docker容器和镜像,理解简单,从原理入手,什么是layer,什么是 ...
- [转]图解Docker容器和镜像
本文转自:https://www.cnblogs.com/wangqiaomei/p/5818636.html 图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器 ...
- 图解Docker容器和镜像
图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docke ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.flanneld介绍 ...
随机推荐
- 界面编程之QT的数据库操作20180801
/*******************************************************************************************/ 一.数据库连 ...
- 《剑指offer》— JavaScript(34)第一个只出现一次的字符
第一个只出现一次的字符 题目描述 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置. *** 思路 新建一个对象,其中key用 ...
- Spring MVC测试框架
原文链接:http://jinnianshilongnian.iteye.com/blog/2004660 Spring MVC测试框架详解——服务端测试 博客分类: springmvc杂谈 spri ...
- 个推用户画像产品(个像)iOS集成实践
最近业务方给我们部门提了新的需求,希望能构建精准用户画像.我们尝试使用的是个推(之前专门做消息推送的公司)旗下新推出的产品“个像·用户画像”.根据官方的说法,个像能够为APP开发者提供丰富的用户画像数 ...
- linux查看进程的线程数
top -H -p $PID #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...
- Why do we make statistics so hard for our students?
Why do we make statistics so hard for our students? (Warning: long and slightly wonkish) If you’re l ...
- python学习笔记6--mockserver
一.mockserver的应用 有时候测试我们需要调用一些三方接口或者未开发完成的接口,完成我们的业务流程测试,但是这时候可能我们只知道接口返回值,接口并没有完全开发完成或可以让我们任意调用,这时候就 ...
- 小议 html 实体解析
今天分享个小技巧,是群里一个朋友问的,"请问 + 这种类型的字符串怎么转换成我们想要的字符 + ,有什么简便的js方法吗"其实问题说简单也简单,说难也难.我们要分情况来描述问题解决 ...
- 在Windows环境中利用Responder工具窃取NTLMv2哈希
在Windows环境中利用Responder工具窃取NTLMv2哈希 翻译自:https://github.com/incredibleindishell/Windows-AD-environment ...
- mysql学习------错误日志和通用查询日志
一.启动错误日志 1.在不同情况下,错误日志会记录在不同的位置.如果没有在配置文件中指定文件名,则文件名默认为hostname.err 2.在mysql5.6的rpm发布方式中,错误的日志默认的放置在 ...