docker运行nginx为什么要使用 daemon off

简介:

很开心啊,遇到这个问题,就要讲讲docker容器的进程原理了,基本上了解过docker的人都清楚docker的几个隔离方式,那么进程同样是进行隔离。

问题

1.docker容器跑着为啥会挂掉?

docker 容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的依据,

如果docker 容器pid挂了,那么docker容器便会直接退出


2.docker run的时候把command最为容器内部命令,如果你使用nginx,那么nginx程序将后台运行,这个时候nginx并不是pid为1的程序,而是执行的bash,这个bash执行了nginx指令后就挂了,所以容器也就退出了,和你这个一样的道理,pm2 start 过后,bash 的pid为1,那么此时bash执行完以后会退出,所以容器也就退出了。

下面我使用实例告诉why we do this!!

touch file get_pid

<code class="bash">echo "PID of this script: $$"

echo "PPID of this script: $PPID"
echo "UID of this script: $UID"

#nginx -g 'daemon off;'</code>


此时我们启动容器去执行这个sh文件

<code>odtoy:~ zhaojunlike$ eval `docker-machine env default `
godtoy:~ zhaojunlike$ cd WorkSpace/
godtoy:WorkSpace zhaojunlike$ ls
docker    nodejs    php    pid_get
godtoy:WorkSpace zhaojunlike$ vim pid_get
godtoy:WorkSpace zhaojunlike$ docker run -v `pwd`/pid_get:/pid_get:ro --rm --workdir=/ nginx bash /pid_get
PID of this script: 1
PPID of this script: 0
UID of this script: 0
godtoy:WorkSpace zhaojunlike$ </code>


在容器执行完pid_get 后,容器也就自动退出了,这个时候,打印出了当前的bash运行的pid是1。

所以,如果我们想让容器不挂掉,那么非守护进行的执行是必须得,当然下面也能去让一个容器内部,执行

<code>godtoy:WorkSpace zhaojunlike$ docker run -it nginx bash
root@a8baa5fe77f0:/# nginx
root@a8baa5fe77f0:/# godtoy:WorkSpace zhaojunlike$ </code>

我们使用-it参数可以连接到容器内部的管道,然后我们在容器内部使用nginx命令。最后Ctrl+P+Q退出容器后,容器依然运行。

总结

如果楼主是需要去在docker中使用node,那么就没必要去安装pm2等工具了,直接node,如果你怕你的容器会挂掉,可以加上restart等相关参数比如`docker run .... --restart=always


cf33bbf8c83ceebca562100bda9fef74.png

以上紧紧是个人总结,如果有不对的地方,欢迎网友纠正。



本文转自 Mr_sheng 51CTO博客,原文链接:
http://blog.51cto.com/sf1314/1979312

相关文章
|
1月前
|
前端开发 关系型数据库 MySQL
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
IDEA集成Docker插件打包服务镜像与运行【附Docker命令汇总】
|
1月前
|
Oracle 关系型数据库 数据库
|
1月前
|
Java Shell Docker
Docker启动后怎样运行jar包文件
Docker启动后怎样运行jar包文件
|
17天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
78 0
|
25天前
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
39 0
|
13天前
|
应用服务中间件 nginx Docker
docker实现Nginx
通过以上步骤,你可以使用Docker来快速搭建并运行Nginx服务器,而且可以根据需要进行自定义配置和持久化数据。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
12 1
|
18天前
|
Linux Docker 容器
Linux彻底卸载Docker包括运行拉取的镜像
Linux彻底卸载Docker包括运行拉取的镜像
22 1
|
25天前
|
Java 关系型数据库 数据库
Seata常见问题之docker运行报错如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
98 0
|
25天前
|
Nacos 数据库 Docker
nacos常见问题之docker部署的seata,成功注册到nacos运行报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
36 2
|
30天前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
192 0