docker容器内核里面怎么更改内核参数

Docker 容器使用小结 - 推酷
Docker 容器使用小结
目前也已经将生产环境中所有服务运行在 Docker 容器中,从一年前就一直想写一篇有关 Docker 的文章,可是年初以来一直没有时间,趁着这个中秋节假期,终于开始着笔。
Docker 是一个开源的应用容器引擎,使用轻量级的容器虚拟化技术,开发者可以方便的打包他们的应用以及依赖包到一个可移植的容器中,来发布到任何流行的 Linux 发行版上。
命名空间: Docker 引擎采用 namespaces 来提供一个隔离的工作区,通过 kernel 的 pid、net、ipc、mnt、uts 等 namespaces 实现对进程、网络、消息、文件系统与内核版本的隔离。
资源配置:通过 cgroups 来控制容器的硬件资源。
文件系统:利用 UnionFS,通过创建图层来实现对容器的轻量与快速更新。Docker 引擎可以使用多个 UnionFS 的变种,包括 AUFS、btrfs、vfs 与 DeviceMapper。
容器格式:Docker 引擎结合 namespaces、cgroups、UnionFS 一起组成 libcontainer 容器格式,将来或许会支持更多的譬如 BSD Jails、Solaris Zones 容器格式。
Docker 已经成熟并被大量的应用到生产环境,所以概念部分就不阐述了,针对与 Virtual Machines 的区别说一下。
Docker 的出现,并非是为了取代 Virtual Machine,前者是为了 devops,后者则是为了统一开发环境。Docker 是一个容器,底层的实现是利用下层操作系统内核提供的功能,是进程级别的。而 VM 则是完全的虚拟化,底层则基本是虚拟机,下图是一个极简的对比图。
很多人对概念部分不感冒,还是让我们直接进入使用环节,详细的参数,可以通过 docker COMMAND --help 来获取详细信息。
Linux: 使用各发行版的包管理工具即可安装
Mac: Docker for Mac
Windows: Docker for Windows
我们在 Docker 容器中运行一个 echo 试试,首先拉取一个远程的 apline 镜像,其次容器中输出 “Hello World!”。
docker pull alpine
docker run -it apline echo &Hello World!&
是的,一个基于 Alpine 的镜像按照你的命令输出了 “Hello World”。我们查看下本地现有的镜像:
$ docker images -a
REPOSITORY
4e38e38c8ce0
12 weeks ago
查看下本地现有的 Docker 进程:
$ docker ps -a
CONTAINER ID
aaa36d3bc66e
&echo 'Hello World'&
4 seconds ago
Exited (0) 2 seconds ago
distracted_meitner
我们销毁该进程后,再查看下:
$ docker rm aaa36d3bc66e
aaa36d3bc66e
$ docker ps -a
CONTAINER ID
我们如何进入容器中呢,譬如查看下镜像的内核与版本,然后退出并销毁该进程:
$ docker run -it alpine sh
/ # uname -a
Linux f35ec3b5e253 4.4.15-moby #1 SMP Thu Jul 28 22:03:07 UTC
/ # cat /etc/alpine-release
$ docker ps -a
CONTAINER ID
c50ffeb5a709
12 seconds ago
Exited (0) 1 seconds ago
berserk_blackwell
$ docker rm c50ffeb5a709
c50ffeb5a709
我们把镜像也删除了吧:
$ docker rmi 4e38e38c8ce0
Untagged: alpine:latest
Untagged: alpine@sha256:3dcdb92dd4545cbd324b14e647bb889da
Deleted: sha256:4e38e38c8ce0b8dfefebfe8cfa2321aec4bba
Deleted: sha256:4fe15f8d0ae69ef1d4da3015a48feeeeebb265cd2e328e15c6a869f
到这里,可以仔细观察下, container id 与 image id 的区别。
一般情况下,我们以 backgroud 运行一个容器,有时需要 attach 进容器进行一些操作,我们以 gists/nginx:stable 为例:
$ docker run --name my-nginx -d gists/nginx:stable
Unable to find image 'gists/nginx:stable' locally
stable: Pulling from gists/nginx
e110a4a17941: Pull complete
617dca60f103: Pull complete
b397f6ce6faa: Pull complete
eddf: Pull complete
8ee5e0c70a8d: Pull complete
Digest: sha256:f8ed78c176be524fdb3ed0b8f5e9dbd2660
Status: Downloaded newer image for gists/nginx:stable
cf3904201ccaff5fc9ebd010ff03fb922b
$ docker exec -it my-nginx sh
Mem: 341868K used, 1706792K free, 183572K shrd, 8692K buff, 190432K cached
0% nic 100% idle
Load average: 0.00 0.00 0.00 2/150 13
VSZ %VSZ CPU %CPU COMMAND
0% nginx: worker process
0% nginx: worker process
0% nginx: master process nginx -
还是让我们直接以 Dockerfile 来入门讲解:
FROM &image&:&tag&
MAINTAINER &name&
ENV &key& &value&
RUN command
COPY &src& &dest&
EXPOSE &port&
VOLUME [&/path/to/dir&]
USER &username&
WORKDIR /path/to/dir
CMD yourcommand
FROM:Dockerfile 文件的第一条指令,当前镜像构建于哪个镜像,现在一般以 apline 即基础镜像。
MAINTAINER:指定维护者信息。
ENV:环境变量,被后续 RUN 等指令使用,并在容器运行时保持。
RUN:构建镜像的详细指令,每多一条 RUN 指令即多一层 layer。
COPY:复制 Dockerfile 文件所在目录中的文件或目录到容器中。
ADD:复制 Dockerfile 所在目录中的文件到容器中,也可以是一个 URL,还可以自动解压 tar。
EXPOSE:指定暴露给 Host 的端口号,可以如下几种形式,第三种是指定端口范围:
EXPOSE port1 port2
EXPOSE port1/tcp port2/udp
EXPOSE port1:port2
VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。
WORKDIR:为后续的指令指定工作目录。
ENTRYPOINT:指定容器启动后的命令,不可被 docker run 提供的参数覆盖,有两种格式:
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2
CMD:指定容器服务运行时的命令,有三种格式:
CMD [“executable”,”param1”,”param2”]
CMD command param1 param2
CMD [“param1”,”param2”] 提供给 ENTRYPOINT 的默认参数
最后通过在 Dockerfile 目录执行 docker build . 来构建镜像。
未完待续……
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致天云软件技术沙龙带你了解Docker等容器技术-计世网
天云软件技术沙龙带你了解Docker等容器技术
在数据爆炸的今天,企业对互联网应用的要求一方面是速度,要求可以快速迭代,适应市场需求变化;另一方面是稳定性,在面对用户量不断增长以及软件应用不断更新的情况下,可以依然保持业务持续不中断。这也是云计算发展的一个方向,用户可以不必自己部署、安装基层应用,因为可以直接交给云平台实现。而在这方面,Docker是一个尤其典型的应用!关于Docker等容器技术,你究竟了解多少?其使用场景都有哪些呢?9月24日,由DockOne社区和天云软件联合主办的容器技术沙龙在北京IC咖啡举办,由各位技术大咖带你近距离了解Docker!  作为一个标准的中间件,Docker相当于云计算的“集装箱”,承载着后端的各种技术,并且可以保障多个技术同时运行的速度。技术人员只需关注将自己开发好的代码、技术放在Docker镜像里面,而运维人员也只需关注让这种标准化的Docker在平台上运行起来即可。  首先,中国电信云计算公司研发工程师张其栋给大家带来“中国电信基于Mesos+Docker的运维自动化在CDN中的实践”的主题演讲。  张其栋首先表示,使用Mesos+Docker的大背景是中国电信云公司的CDN架构。之所以采用这样的架构,是因为后期的业务范围比较大,用户比较广,后期的设备量会达到几万台,如果用传统的思路进行运维,对于运维的压力太大。  张其栋认为容器技术有自动化部署、持续集成、敏捷开发和提高开发效率、弹性调度、资源复用等优势。他表示,中国电信在选择了Docker之后,首先是实现业务软件的容器化。比如直播转码业务软件实现容器化。在实现了业务容器化之后,就需要选择编排软件。中国电信最终选择的是Apache的Mesos。另外,他给出了选择Mesos的如下几个原因:一是相对比较成熟;二是数据分析相关软件跟Mesos结合起来更容易。  当然在Docker落地过程中也遇到了一些问题,张其栋表示中国电信在落地Docker的过程中确实也遇到过一些坑,当然他也给出了自己的解决建议:  1、Docker默认共享内存太小,普通权限无法更改。我们给了最高权限。现在新版本Docker已经支持更改共享内存了,在测试环境里可以用新命令去更改。后期会把最高权限去掉,使用命令行进行共享内存的更改。  2、Docker最高权限会把容器107G存储给写满,写满之后,再生成一个容器可以成功,但是运行不起来。有两个方法,一个是更改107G存储,变成2T或者4T的大硬盘,不能从根源上解决问题。还有一个办法,从业务软件上避免这个问题,把日志尽量往小写,另外把日志映射出来。  3、直播转码和切片无法获取CP方给的组播流。解决方案是给容器HOST模式,性能上没有损失,但用网络比较多。  4、修改防火墙后,Docker网络环境不通。修改防火墙后重启防火墙,之前运行起来的镜像,再次运行时网络是不通的。现在的解决方案是规避它,在使用镜像的时候,先把防火墙所有的配置参数调好,不要重启防火墙。  北京天云融创软件技术有限公司研发总监刘春阳主要负责公司容器化以及平台化产品的规划和设计。他给大家带来主题为“企业应用容器化的痛点、坑和解决之道”的演讲。主要分享了针对企业级的平台性的产品设计过程当中,可能会面临什么样的需求,面临什么样的问题,包括天云软件本身所采取的一些技术选型。  他认为,在电信领域,Docker有着自己的特殊性。首先电信行业里面有运营商企业,然后是应用提供商,然后是资源提供商,这三个是分离的。管理方对于资源提供方,应用提供方都有要求,因此要求业务要能敏捷,要能快,尽快适应他们的需求。其次是业务要稳定;最后是高效率。而容器技术给以上三方带来了改变,利用容器,可以利用行程中的程序逻辑,可以用标准的协议交付第三方,使彼此之间角色没有重叠现象资源提供者可以无差别的对待资源。其次,利用容器技术,可以在Docker放货柜混合编排,混合部署,促进平台的统一性。另外,通过利用标准化的容器技术,促进研发流程的自动化和应用模式化。  刘春阳认为,容器现在面临的挑战主要有以下两个:  1、标准不统一。至少目前来说,容器的标准相对统一,但是容器平台管理的标准至少有三家在,标准不统一,导致大家在使用过程当中,技术选型的时候会有挑战。  2、容器的技术涉及到资源,涉及到应用内部,所以它具有一定的轻量性,不是交付虚机就可以。因此容器要解决个问题,否则就没有办法做模式化,而不做模式化的话,平台的很多东西都无法构建。  当当网个性化推荐组项目负责人肖骁主要为大家分享了关于当当网个性化推荐组应用Docker进行应用部署以及小团队试水Docker的的若干经验,分享主要包括:现有应用Docker化的过程和结合Jenkins的自动化构建。他的演讲主题是 “当当网Docker应用实践”。  肖骁告诉我们,要是把程序放在容器里,程序至少是无状态的,不能依赖于宿主机的一切环境和目录等。Docker以后,代码流水线管理,提高开发效率。  而用Docker把现有的程序Docker化,需要注意哪些东西呢?  1、镜像构建。一定要从Dockerfile生成,如果不从Dockerfile生成,以后更新、回滚是很麻烦的。  2、避免依赖过深。不要在基础镜像上加太多产生其他的镜像,最多是三四层。一层是base镜像,再往上是工具,再往上一层就是自己的程序,再多就比较乱。  3、发布。使用Docker可以用很标准的过程做上线、回滚或者是升级。  4、日志管理。如果把日志放在容器里,容器销毁了,日志就没有了。要把日志实时保留,有一种办法是把日志放在宿主机,完全不依赖宿主机的任何环境。肖骁建议放一些日志收集等。  5、环境变量。指定里面的环境变量,应用再去环境变量。这是Docker启动的时候用这个,如果上集群的话,这个稍微麻烦一点。  6、配置中心。用数据库,把配置放在里面都可以。用Docker的话,在里面改配置文件,再启动的时候,配置文件就没有了,有个简单的方法就是配置文件,给每一个版本配置文件都打一个容器。  7、网络管理。现在主要是用Host,网络性能最好用Bridge,现在如果用自定义的话,可以建多个像Docker0这样的网络,可以为容器之间连接和隔离。  他说,如果自己团队想用Docker的话,运行环境、内核版本、操作系统的发行版本,这些都是有要求的。  1、镜像载荷要求。一个现有的比较成熟的架构应用,要放到Docker里要考虑是不是依赖宿主机的环境,包括本地的IP和本地目录等。  2、数据中心过大。&数据中心过大时采用折中的方法,先往上扔一个空数据,后台第一次启动的时候,如果容器里面没有数据的话,自己就下了,这可能也是一个折中的办法。  3、镜像管理、版本控制。如果提交一个镜像,包括版本号等,必须要有比较严格的规定,格式和定义必须要仔细规定一下,要不然就会乱。  相信不少人都想知道,在异构技术栈、5种语言、500+个微服务(包括Task)、网状调用关系状况下,如何做到一键构建测试环境,并同时支持50个Feature独立测试却互不影响? 折800的架构师刘凯以 “用Docker&K8s构建自动化测试环境”为主题的演讲为大家做了妙答:用Docker + Kubernetes实现一键构建测试环境。按需拉起容器,按需部署,按照关联计算,拉起关联的服务。  但是,在使用Docker + Kubernetes过程中需要解决如下问题:  1、变异构为同质。不同的语言部署方式是不一样的, 必须用一个方式,代码上传的时候,自带环境、版本和库。那么用什么样的部署方式把异构的语言变成同步呢?提供一个统一的接口可以构建、传输、部署。  2、配置管理。要自动化部署,一键拉起几百个服务和几十个服务,要知道相互的关系,要连什么服务,要怎么配置,必须做到自动化配置。要加一个存储,要加一个ES,必须在ES上建索引等。  3、服务管理。如何做服务注册、服务发现、如何做负载均衡。不同类型的服务,启动以后,位置是不一样的,HTDP服务要对外挂IP,要注册到外面的负载均衡里面,应用层面的服务是不需要这样做的。  4、监控。如果测试时,测不通,报告异常、超时,必须能在竖状结构里面知道哪个节点报错,如果从最前端一层一层向下排查,将会非常耗时。失败了用红点标出来,然后告诉失败原因是什么。请求发不过去,是什么原因,图形数据怎么来?采用更加激进的做法:整个测试环境,把所有包抓下来,知道源IP以及调度内容是成功还是失败,从而分析所有容器节点的调度关系是成功还是失败,这些数据配合服务依赖关系,完全可以把数据贯到监控数据上,这样一来就知道哪个节点进来了,有什么错,有多长时间。  5、兼容性。Docker化以后,怎么把之前没有Docker化的服务和流程融入到里面,Docker研发流程要做相应的改造。接口和数据库要兼容。  6、编排部署。上线、开发时先更新哪个服务,再更新哪个服务,加一个配置,然后改数据库等等。这么复杂的事情,如果没有合理的编排是很难做到自动化的。用DAG的方式去描述部署计划,通过拖拽的方式表达要干什么。  7、隔离。一键拉起测试环境同时还要做到按需拉取,要对服务之间的调度关系做隔离。在隔离区里面,每个来源IP不一样,第一个隔离区的来源IP,把请求转到相应的隔离区里面。  8、依赖关系。服务之间调度链很深,如果不对调度链关系进行管理,很难知道被拉起的是什么服务。向上找依赖分析,把依赖的服务一起部署。把500个服务的依赖关系都清算出来,放在一个服务库里面,能看到相互依赖关系。  9、统一命名。看起来没有技术含量,但是在做自动化部署和自动化测试时是非常关键的。你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
基础镜像是centos6.6
各种原因只能安装oracle10,安装的过程中,发现有段设置:
修改内核参数,以便oracel的安装
vi /etc/sysctl.conf添加以下信息
kernel.shmmni = 4096
kernel.sem = 250 8
fs.file-max = 6815744
net.ipv4.ip_local_port_range =
net.core.rmem_default = 4194304
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
使内核参数实时生效
sysctl -p显然的报错了,stackoverflow上没什么有价值的信息,请教各位如何处理。
或者有现成的oracle10.2.0.4的镜像,冲我来吧
可以先参考别人的dockerfile, sysctl还没有实现。
这个看到了,也pull了,可惜不是要的版本。
要回复问题请先或
浏览: 2696
关注: 2 人如何控制Docker容器的内存,硬盘,CPU等参数 - 开源中国社区
当前访客身份:游客 [
当前位置:
因为Docker和virtualbox这类硬件虚拟化不一样,所以,我始终不知道如何控制。或者说它根本没有这样的概念。
共有6个答案
<span class="a_vote_num" id="a_vote_num_
跟VM 和XEN比起来他也许更轻量级,不过感觉多此一举,如果一台机器跑多个实例,跟用xen虚拟化群集比肯定不如xen,如果说一直,现有的高级语言如PHP JAVA PYTHON 等都是跨平台,没必要被这个容器在包装一下,感觉完全多此一举,另外他的APP底层也是经过包装的linux内核,我就不信他比原生的好!
--- 共有 2 条评论 ---
: 抱歉我没用过ruby,不做评论。
(2年前)&nbsp&
有些时候,我们必须同一台机器运行不同版本的ruby的应用。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
docker &只依赖于 Linux kernel 对 LXC 的支持,包括cgroup,namespace。
换句话说,只要系统的linux kernel 支持 LXC, 打包在 docker里的应用就可以跨Linux系统运行。
docker容器里的应用,就是一个文本文件。
<span class="a_vote_num" id="a_vote_num_
docker run 命令可以对cpu和内存限制,目前没有直接对磁盘限制
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container -c, --cpu-shares=0 CPU shares (relative weight) -m, --memory=&& Memory limit (format: &number&&optional unit&, where unit = b, k, m or g)
<span class="a_vote_num" id="a_vote_num_
好像不能控制.
<span class="a_vote_num" id="a_vote_num_
可以的。docker容器基于linux container技术,LXC基于Linux内核cgroup机制,可以实现对内存、CPU的控制
<span class="a_vote_num" id="a_vote_num_
引用来自“徐同乐”的评论跟VM 和XEN比起来他也许更轻量级,不过感觉多此一举,如果一台机器跑多个实例,跟用xen虚拟化群集比肯定不如xen,如果说一直,现有的高级语言如PHP JAVA PYTHON 等都是跨平台,没必要被这个容器在包装一下,感觉完全多此一举,另外他的APP底层也是经过包装的linux内核,我就不信他比原生的好!跨平台等于不需要部署开箱即用
--- 共有 2 条评论 ---
: 我去,写错了,应该是不等于开箱即用
(2年前)&nbsp&
开箱即用?!
(2年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
翟志军的其它问题
类似的话题

我要回帖

更多关于 docker 对内核的要求 的文章

 

随机推荐