如何运行linux 多进程并发运行Docker容器

当你最后投入容器的怀抱,发现它能解决很多问题,而且还具有众多的优点:
第一:它是不可变的 – 操作系统,库版本,配置,文件夹和应用都是一样的。您可以使用通过相同QA测试的镜像,使产品具有相同的表现。
第二:它是轻量级的 – 容器的内存占用非常小。不需要几百几千MB,它只要对主进程分配内存再加上几十MB。
第三:它很快速 – 启动一个容器与启动一个单进程一样快。不需要几分钟,您可以在几秒钟内启动一个全新的容器。
但是,许多用户依然像对待典型的虚拟机那样对待容器。但是他们都忘记了除了与虚拟机相似的部分,容器还有一个很大的优点:它是一次性的。
容器的 准则 :
“容器是临时的”。
这个特性“本身”促使用户改变他们关于使用和管理容器的习惯;我将会向您解释在容器中不应该做这些事,以确保最大地发挥容器的作用。
1) 不要在容器中存储数据 –
容器可能被停止,销毁,或替换。一个运行在容器中的程序版本1.0,应该很容易被1.1的版本替换且不影响或损失数据。有鉴于此,如果你需要存储数据,请存在卷中,并且注意如果两个容器在同一个卷上写数据会导致崩溃。确保你的应用被设计成在共享数据存储上写入。
2) 不要将你的应用发布两份 –
一些人将容器视为虚拟机。他们中的大多数倾向于认为他们应该在现有的运行容器里发布自己的应用。在开发阶段这样是对的,此时你需要不断地部署与调试;但对于质量保证与生产中的一个连续部署的管道,你的应用本该成为镜像的一部分。记住:容器应该保持不变。
3) 不要创建超大镜像 – 一个超大镜像只会难以分发。确保你仅有运行你应用/进程的必需的文件和库。不要安装不必要的包或在创建中运行更新(yum更新)。
4) 不要使用单层镜像 – 要对分层文件系统有更合理的使用,始终为你的操作系统创建你自己的基础镜像层,另外一层为安全和用户定义,一层为库的安装,一层为配置,最后一层为应用。这将易于重建和管理一个镜像,也易于分发。
5) 不要为运行中的容器创建镜像 – 换言之,不要使用“docker commit”命令来创建镜像。这种创建镜像的方法是不可重现的也不能版本化,应该彻底避免。始终使用Dockerfile或任何其他的可完全重现的S2I(源至镜像)方法。
6) 不要只使用“最新”标签 – 最新标签就像Maven用户的“快照”。标签是被鼓励使用的,尤其是当你有一个分层的文件系统。你总不希望当你2个月之后创建镜像时,惊讶地发现你的应用无法运行,因为最顶的分层被非向后兼容的新版本替换,或者创建缓存中有一个错误的“最新”版本。在生产中部署容器时应避免使用最新。
7) 不要在单一容器中运行超过一个进程 – 容器能完美地运行单个进程(http守护进程,应用服务器,数据库),但是如果你不止有一个进程,管理、获取日志、独立更新都会遇到麻烦。
8) 不要在镜像中存储凭据。使用环境变量 –不要将镜像中的任何用户名/密码写死。使用环境变量来从容器外部获取此信息。有一个不错的例子是。
9) 使用非root用户运行进程 – “docker容器默认以root运行。(…)随着docker的成熟,更多的安全默认选项变得可用。现如今,请求root对于其他人是危险的,可能无法在所有环境中可用。你的镜像应该使用USER指令来指令容器的一个非root用户来运行。”(来自 )
10) 不要依赖IP地址 – 每个容器都有自己的内部IP地址,如果你启动并停止它地址可能会变化。如果你的应用或微服务需要与其他容器通讯,使用任何命名与(或者)环境变量来从一个容器传递合适信息到另一个。为了让docker容器一直运行难道要写个死循环的程序? - 跟谁学
搜索你想学的科目、老师试试,例如“数学”搜索吉安
&&为了让docker容器一直运行难道要写个死循环的程序?我想让容器一直运行xxfaxy肆意的青春
$ docker run -d --name test_sleep_infinity your_image sleep infinity# enter the container$ docker exec -it test_sleep_infinity /bin/bash
小豪_493375
docker run -d .....-d 参数就是让docker一直在后台持续运行,
你run的命令要是可持续运行的,不能像ls一样运行完就停止了,然后加上-d就可以了
如果你想使用 -d 后台运行,目前只能使用可持续运行的命令,否则运行完成就会停止了。
不是特别明白你的场景, 我看你问了好几个docker相关问题, 给你几个条命令供你参考,希望对你有用.创建启动容器
docker run -itd &image-di& /bin/bash单纯启动容器
docker start &container-id&连接容器
docker attach &container-id&回到宿主机
ctrl+p,ctrl+q
可以前台运行个程序就可以了,或者使用supervisor来管理运行的程序
你可以这样 CMD tail -f /var/log/cron.log 在DockerFile中运行一个持续输出的任务好吧,这也差不多是一个死循环 docker ps -a在这里可以看出docker的运行状态,,up的就是一直运行,exit就是跑完了就退出了~docker跑完了你要它执行的任务就会退出~所以你得写个持续的命令
相关问题大家都在看最新提问
关注我们官方微信关于跟谁学服务支持帮助中心【虚拟 化】(12)
【LinuxProbe】(4)
Docker多进程管理主要有两个工具,一个是Supervisor,另一个是Monit。在中,我们介绍了一个在Docker中常用的用于管理多进程的工具Supervisor,本篇再来介绍一个比supervisor用起来更加方便的容器内多进程管理工具Monit。
Monit和Supervisor还是有很大区别的,Supervisor管理的都是前台执行的进程,Monit既可以管理前台进程也可以管理后台进程,简单的说,在CentOS中使用service xxx start 启动的程序,使用Monit可以直接管理,这就解决了很多没有前台方式启动的程序不能用Supervisor来管理的问题。 Monit本身可以做的事情,远不止管理进程,它还可以监控文件,socket,并定义触发器等等,功能很强,具体的用法,可以参见它的官网。
本篇的重点,就来介绍在容器里面,如果用它来管理多个进程。
一、Monit介绍及原理
Monit有以下几个功能:
1、主动触发:
根据某些条件主动采取操作,比如服务不可用,主动开启服务;资源使用过高,主动重启服务,并发邮件告警。
2、进程监控:
Monit可以监控后台进程,比如在/etc/init 下定义的开机启动程序。
3、文件,目录,文件系统监控:
监控一个文件,或者目录的变化,比如修改时间,md5或者sha1校验。发现变化之后,可以触发动作,比如:邮件告警
4、socket监控:
监控特定的服务socket,tcp,udp端口,在端口协议层面进行监控
5、系统监控:
Monit还可以监控当前系统的运行状态,比如cpu,内存,负载等等
6、自定义脚本监控:
通过自定义脚本,定时监控程序和性能,并触发事先定义的操作
Monit默认提供了一个简单的WebUI,通过这个WebUI可以对被管理的进程做一些常规的操作,比如start 、stop等。本文重点介绍在Docker中使用Monit来管理服务进程。
二、Monit的安装与配置
1、Monit安装
在EPEL的源中提供了monit的安装包,直接使用yum即可安装
2、Monit配置
使用yum安装完成之后,它的执行程序是/usr/bin/monit,默认配置文件的是/etc/monit.conf。
monit处于安装考虑,它的配置文件必须是700的权限。在配置中,可以使用include关键字来应用外部的配置文件,但是定义在这类配置文件中的参加,优先级比直接定义在monit.conf中的要低。
注意 使用yum安装之后,monit程序会在以下几个位置寻找配置文件
~/.monit.conf, /etc/monit.conf, /etc/monit.conf, /usr/local/etc/monit.conf or at ./monit.conf
Monit的配置语法相比通常的应用配置文件,是比较特别的,其内部定义了一些直观的关键字,最大的好处是,看配置内容的字面意思就知道用途,不好的地方,可能就是与众不同。下面就来通过一些例子来具体解释。
安装完成之后,Monit提供了一个默认配置文件模板monit.conf,其中如何配置都提供的详细的解释。可以根据需要调整需要的配置项,以下是一个简单的monit.conf配置文件
针对被监控的内容可以定义在单独的.conf中,方便查看和管理,以下举例说明一下:
Monit的配置非常丰富,详细的可以参考官方文档。
三、在Docker中使用Monit管理多个应用
1、在容器中启动sshd和apache
首先,创建一个Dockerfile,内容如下
monit配置文件monitrc
sshd的monit配置文件
httpd的monit配置文件
编译生成镜像
[root@localhost ~]docker build -t monit/sshd_httpd:0.1 .
运行镜像容器
验证,访问http://宿主机ip:9001
在monit WebUI上可以对被监控的进程进行基本的操作。如下图
四、参考文档
/monit/documentation/monit.html
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:117231次
积分:3126
积分:3126
排名:第10157名
原创:125篇
转载:31篇
译文:71篇
评论:10条
文章:30篇
阅读:23473
文章:66篇
阅读:23525
(2)(13)(7)(7)(17)(22)(42)(120)如何运行容器?- 每天5分钟玩转 Docker 容器技术(22)-爱编程
如何运行容器?- 每天5分钟玩转 Docker 容器技术(22)
上一章我们学习了如何构建 Docker 镜像,并通过镜像运行容器。本章将深入讨论容器:学习容器的各种操作,容器各种状态之间如何转换,以及实现容器的底层技术。
docker run&是启动容器的方法。在讨论 Dockerfile 时我们已经学习到,可用三种方式指定容器启动时执行的命令:
CMD 指令。
ENDPOINT 指令。
在&docker run&命令行中指定。
例如下面的例子:
容器启动时执行&pwd,返回的&/&是容器中的当前目录。 执行&docker ps&或&docker container ls&可以查看 Docker host 中当前运行的容器:
咦,怎么没有容器?用&docker ps -a&或&docker container ls -a&看看。
-a&会显示所有状态的容器,可以看到,之前的容器已经退出了,状态为Exited。
这种“一闪而过”的容器通常不是我们想要的结果,我们希望容器能够保持 runing 状态,这样才能被我们使用。
让容器长期运行
如何让容器保存运行呢?
因为容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。
理解了这个原理,我们就可以通过执行一个长期运行的命令来保持容器的运行状态。例如执行下面的命令:
while&语句让 bash 不会退出。我们可以打开另一个终端查看容器的状态:
可见容器仍处于运行状态。不过这种方法有个缺点:它占用了一个终端。
我们可以加上参数&-d&以后台方式启动容器。
容器启动后回到了 docker host 的终端。这里看到 docker 返回了一串字符,这是容器的 ID。通过&docker ps&查看容器:
现在我们有了两个正在运行的容器。这里注意一下容器的&CONTAINER ID和&NAMES&这两个字段。
CONTAINER ID&是容器的 “短ID”,前面启动容器时返回的是 “长ID”。短ID是长ID的前12个字符。
NAMES&字段显示容器的名字,在启动容器时可以通过&--name&参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字。
对于容器的后续操作,我们需要通过 “长ID”、“短ID” 或者 “名称” 来指定要操作的容器。比如下面停止一个容器:
这里我们就是通过 “短ID” 指定了要停止的容器。
通过&while&启动的容器虽然能够保持运行,但实际上没有干什么有意义的事情。容器常见的用途是运行后台服务,例如前面我们已经看到的 http server:
这一次我们用&--name&指定了容器的名字。 我们还看到容器运行的命令是httpd-foreground,通过&docker history&可知这个命令是通过 CMD 指定的。
我们经常需要进到容器里去做一些工作,比如查看日志、调试、启动其他进程等。下一节学习如何进入容器内部。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。

我要回帖

更多关于 docker如何运行容器 的文章

 

随机推荐