docker容器的主线程(dockfile中CMD执行的命令)结束,容器会退出
有以下几种解决方法:
使主进程无法结束
docker run -d centos /bin/bash -c "while true;do echo hello docker;sleep 1;done"
使用交互式启动
docker run -i [CONTAINER_NAME or CONTAINER_ID]
使用后台模式和tty选项
docker run -dit [CONTAINER_NAME or CONTAINER_ID]
启动命令:
docker
run
-d -p 8080:8080 -v /usr/local/tomcat7.0/logs:/usr/local/tomcat7.0/logs –name tomcatweb tomcat:7.0
运行
以后用
docker
ps 发现
docker
容器
已经结束了
查找资料后发现 这个问题并不复杂 原因是应为:
Docker
容器
后台
运行
,就必须有一个前台进程.
解决办法:
1.将
运行
进程发放入前台启动 如:nginx nginx -g “daemon off;” tomcat ./cata
遇到这个问题,就要讲讲
docker
容器
的进程原理了,基本上了解过
docker
的人都清楚
docker
的几个隔离方式,那么进程同样是进行隔离。
docker
容器
默认会把
容器
内部第一个进程,也就是pid=1的程序作为
docker
容器
是否正在
运行
的依据,如果
docker
容器
pid挂了,那么
docker
容器
便会直接
退出
。
docker
run
的时候把command最为
容器
内部命令,如果你使用nginx,那么nginx程序将后台
运行
,这个时候nginx并不是pid为1的程序,而是执行的bash,这
但是,有时候在使用
Docker
的过程中,我们会遇到一些问题,比如
容器
不能启动的问题。
Docker
容器
是由
Docker
镜像创建的,如果镜像文件丢失、损坏或未下载,则无法创建相应的
容器
。
Docker
运行
容器
时会使用到主机的端口,如果端口被占用,
容器
就无法启动。这种问题通常会出现在更新了镜像后,未及时更新
运行
容器
的版本信息,导致无法启动
容器
。如果是由于镜像版本不匹配导致
容器
无法启动,可以先删除原有
容器
,然后使用新版本的镜像来创建
容器
。
容器
需要占用计算资源,如果主机的CPU、内存、磁盘等资源不足,则无法启动
容器
。
我们
run
了一个image,如果
容器
的任务执行完了,那么这个
容器
就会
退出
。当然我们想要exec 进入也就不行了。
如果不想要
容器
退出
,那么必须让
容器
的任务一直执行,比如一些web监听任务或者top命令等。
docker
file
FROM centos
run
:
docker
run
-it id top
那么这个
容器
就会执行top,不会
退出
。
我们可以使用:
CMD命令执行脚本的原理,本质上是用了 /bin/sh -c 这一命令来执行用户脚本,所以当前
容器
的主进程其实是/bin/sh,而不是用户的脚本。
/bin/sh执行完用户脚本后就
退出
了,作为主进程,当其
退出
后,
Docker
容器
也随之
退出
了,这一点是
容器
的特别之处,也是不同于虚拟机的地方。
我们通常说
容器
是单进程的,不仅仅指
容器
里面只应当
运行
一个主进程,实际上,我们可以认为整个
容器
就是我们的主进...
docker
run
-d configserver tail -f /dev/null
docker
run
-d configserver /bin/bash ping 127.0.0.1
docker
run
-d configserver /bin/bash -c "while true;do
查看
容器
运行
状态
docker
ps -a
发现刚刚启动的my
docker
容器
已经
退出
原因
docker
容器
的主线程(dockfile中定义)结束,
容器
会
退出
办法
docker
run
-dit ubuntu
After it, I can saw the processes
run
ni
nsenter工具进入
docker
容器
对于
运行
在后台的
docker
容器
,我们经常需要做的事情是进入到
容器
中,
docker
为我们提供了
docker
exec 、
docker
attach 命令,并且还提供了nsenter工具,外部工具供我们使用。
docker
attach存在的问题是:当多个窗口同时attach到同一个
容器
时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞,
docker
attach命令可以说是最不方便的进入后台
docker
容器
的
方法
。
docker
exec
docker
run
--privileged -it -d centos /usr/sbin/init #注意2点:1. --privileged 参数必须加,2. /usr/sbin/init作为
容器
的启动命令。对于所创建的bash
容器
,当用户使用exit命令
退出
bash进程之后,
容器
也会自动
退出
。这是因为对于
容器
来说,当其中的应用
退出
后,
容器
的使命完成,也就没有继续
运行
的必要了。此时,可以通过添加-d参数来实现。
docker
exec -it
容器
ID bash #进入
容器
的bash命令行。
运行
容器
时可以指定其执行什么命令,但是这个命令执行完了,这个
容器
就自动终止了
所以这个命令执行不会完成,那么
容器
就不会终止
1.
docker
run
时可以指定/bin/sh
"while true; do sleep 1; done”
2.
运行
容器
执行的脚本最后可以增加
#!/bin/bash
while [ 1 = 1 ]
sleep 1;
本文主要简单介绍
docker
容器
与前置进程的关系,以及如何编写
Docker
file/
docker
-compose.yml 优雅的让
容器
可以常驻
运行
。
docker
容器
的生命周期是同
容器
中的前置进程相关在一起的,这也是我们平时可能会遇到一些
容器
只是
运行
几秒便自动
退出
的原因:因为
容器
中没有一个常驻的前置进程,前置进程
运行
结束后,
容器
便...