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 容器 的生命周期是同 容器 中的前置进程相关在一起的,这也是我们平时可能会遇到一些 容器 只是 运行 几秒便自动 退出 的原因:因为 容器 中没有一个常驻的前置进程,前置进程 运行 结束后, 容器 便...