Container:

  既然container是由image运行起来的,那么是否可以理解为container和image有某种关系?先来看张图:

  其实可以理解为container只是基于image之后的layer而已,也就是可以通过docker run image创建出一个container出来。

底层技术支持:

  Container是一种轻量级的虚拟化技术,不用模拟硬件创建虚拟机。Docker是基于Linux Kernel的Namespace、CGroups、UnionFileSystem等技术封装成的一种自定义容器格式,从而提供一套虚拟运行环境。

  1. Namespace:用来做隔离的,比如pid[进程]、net[网络]、mnt[挂载点]等
  2. CGroups: Controller Groups用来做资源限制,比如内存和CPU等
  3. Union file systems:用来做image和container分层

Container到 Image:

  既然container是基于image之上的,想想是否能够由一个container反推出image呢?肯定是可以的,比如通过docker run运行起一个container出来,这时候对container对一些修改,然后再生成一个新的image,这时候image的由来就不仅仅只能通过Dockerfile咯。

1.拉去一个 centos 的镜像 docker pull centos。

2.通过该镜像生成一个 container 并且是交互式运行的:docker run -d -it --name my-centos1 centos。

3.进入容器中:docker exec -it my-centos1 bash。

4.输入vim命令:bash: vim: command not found 。我们发现官方所提供的centos镜像生成的容器中没有vim命令。

5.我们要做的是对该container进行修改,也就是安装一下vim命令,然后将其生成一个新的centos。在centos的container中安装vim :yum install -y vim

6.退出容器(exit),将其生成一个新的centos,名称为"vim-centos-image" :docker commit my-centos1 vim-centos-image

7.查看镜像列表,并且基于"vim-centos-image"创建新的容器 docker run -d -it --name my-vim-centos vim-centos-image

8.进入到my-vim-centos容器中,检查vim命令是否存在:docker exec -it my-vim-centos bash ,输命令 vim 发现该镜像生成的容器拥有该命令。

  我在这里遇到了容器网络有点问题,我们可以这么做:

先停掉宿主机上运行的docker容器,然后执行以下命令。在宿主机执行:
pkill docker
iptables -t nat -F
ifconfig docker0 down
systemctl restart docker.service 重启docker服务 问题即可解决。。

  可以通过docker commit命令基于一个container重新生成一个image,但是一般得到image的方式不建议这么做,不然image怎么来的就全然不知咯。

Container资源限制:

  如果不对container的资源做限制,它就会无限制地使用物理机的资源,这样显然是不合适的。

  我们通过 docker run -d --name tomcat01 -p 9991:8080 tomcat创建的容器,我们通过docker stats tomcat01来查看他的资源占用情况:

  我们会发现他的内存占用的LIMIT这里居然能达到1.777个G,但是很显然我们知道他不需要这么大的内存 ,那么我们需要去限制他,根据自己的监控状态来确定他的内存配比。

  我们通过 docker run -d --memory 100M --name tomcat02 tomcat 来创建下一个容器 ,再查看其状态:

  我能看到了他的内存被我们限制在了100M以内。这样我们就能更合理的运用机器的内存。除了这个内存的设置 --cpu-shares  设置权重  docker run -d --cpu-shares 10 --name tomcat03 tomcat .

  我们还可以通过官方推荐的图形化界面来看到我们的容器运行情况,资源利用情况,https://github.com/weaveworks/scope  只需要3个步骤

sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
scope launch 192.168.1.101

  停止scope:scope stop

  同时监控两台机器,在两台机器中分别执行如下命令:scope launch ip1 ip2

  然后会映射到虚拟机 4040 的端口上,可以通过192.168.1.101:4040 来访问:

Container常见操作:

docker run -d --name -p : my-tomcat tomcat      根据镜像创建容器
docker ps 查看运行中的container
docker ps -a                    查看所有的container[包含退出的]
docker rm containerid             删除container
docker rm -f $(docker ps -a)             删除所有container
docker exec -it container bash          进入到一个container中
docker commit my-centos vim-centos-image    根据container生成image
docker logs container               查看某个container的日志
docker stats                     查看容器资源使用情况
docker inspect container             查看容器详情信息
docker stop/start container           停止/启动容器

Docker 容器(container)及资源限制的更多相关文章

  1. 查看 docker 容器使用的资源

    在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸运的是 docker 自己就提供了这样的命令:docker stats. 默认输出 docker sta ...

  2. docker——容器(container)

    容器相关命令一览表: docker create docker run docker start/stop/restart docker attach/exec docker rm docker ex ...

  3. [转]查看 docker 容器使用的资源

    作者:sparkdev 出处:http://www.cnblogs.com/sparkdev/     在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸 ...

  4. 如何获取 docker 容器(container)的 ip 地址

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  5. 如何获取 docker 容器(container)的 ip 地址(转)

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  6. 014-docker-终端获取 docker 容器(container)的 ip 地址

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  7. 获取 docker 容器(container)的 ip 地址

    获取单个IP docker inspect --format '{{ .NetworkSettings.IPAddress }}'  <container-ID> 获取所有容器IP doc ...

  8. docker 容器container运行后,如何进入容器内部?

    docker exec -ti  容器ID  /bin/bash

  9. Docker容器学习与分享01

    1.什么是容器? 容器技术是一种虚拟化的方案,与传统的虚拟机不同,传统的虚拟机是通过中间层将一台或多台独立的机器虚拟运行于物理硬件之上,而容器是直接运行在操作系统内核之上的用户空间. 所以容器虚拟化又 ...

随机推荐

  1. MySQL——复制(Replication)

    1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡(load balancing)(3)    备份(4)    高可用性(high avai ...

  2. 【leetcode】Valid Palindrome II

    很久没有做题了,今天写个简单难度的练练手感. Given a non-empty string s, you may delete at most one character. Judge wheth ...

  3. mobx使用

    1.mobx状态管理 安装:creact-react-app mobx action.store.reducer. action是一个函数,事件调用actions直接修改state,Actions是唯 ...

  4. python深度学习:矩阵转置(transpose)

    转置:即行列转换. import numpy as np import matplotlib.pyplot as plt C=np.array([[1,2,3],[4,5,6]]) # Display ...

  5. protocol buffer第一篇:语法介绍

    先理解一下protocol buffer是什么东西. protocol buffer是google发明的一种数据序列化方案,和json是同种类型的玩意,它非常适合在rpc场景下使用.同json一样,p ...

  6. 使用 CSS 显示 XML

    通过使用 CSS,可为 XML 文档添加显示信息. 使用 CSS 显示您的 XML? 使用 CSS 来格式化 XML 文档是有可能的. 下面的例子就是关于如何使用 CSS 样式表来格式化 XML 文档 ...

  7. Codeforces 960D Full Binary Tree Queries ( 思维 && 模拟 )

    题意 : 给出一颗无限层的满二叉树,然后每个值为 X (根的 X 等于 1 ) 左孩子的值是 2*X,右孩子的值是 2*X+1 ,现在有两种操作,(1, x,k) 表示将 x 所在层的所有节点整体向右 ...

  8. springboot(二).springboot整合logback用于日志输出

    springboot整合logback用于日志输出 我们项目的基本框架已经完成,http请求已经可以访问,现在给我们的框架添加日志记录的功能并能将每天的记录记录到文件中去 在这里,我们使用logbac ...

  9. linux-解决添加的网卡无法识别的问题(转载)

    添加网卡之后,网卡无法被正确的识别和使用排错方法查看/etc/udev/rules.d/70-persistent-net.rules的内容,该文件中可以查看到新添加的网卡的MAC地址修改/etc/s ...

  10. 《Effective Java》读书笔记 - 5.泛型

    Chapter 5 Generics Item 23: Don't use raw types in new code 虽然你可以把一个List<String>传给一个List类型(raw ...