解决:关于docker闪退的问题

2019-04-14  本文已影响0人  Sam_L
问题背景:

在docker下搭建pxc集群,直接拉取的镜像,创建了5个pxc容器,但是当测试负载均衡,挂掉一个节点的时候,没重新启动节点,等第二天接着来的时候,启动这个节点,却出现docker容器闪退的问题。
看了日志,并没有提示什么

定位到:

1)内存问题,调整了内存到4G,然后问题没有解决。。。
2)Docker占用的磁盘空间不足,执行了命令docker system df,查看了Docker的磁盘使用情况,还算可以,然后对磁盘进行清理,删除关闭的容器、无用的数据卷和网络,清理了日志,日志占用了好大空间啊,然后然后,问题还是没有解决。。。

3)看到网上大部分都是关于 Docker容器后台运行,就必须有一个前台进程,
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。

刚开始看没明白这说的是个啥,我没涉及到前后台呢
然后就利用自己创建的容器,观察里面的进程
就是:
当创建一个Docker容器的时候,就会新建一个PID namespace。容器启动进程在该名空间内PID为1。当PID1进程结束之后,Docker会销毁对应的PID名空间,并向容器内所有其它的子进程发送SIGKILL。
使用命令

docker exec 容器名 ps -ef

你会看见


2.png

使用命令

docekr top node1
3.png

使用docker exec命令进入容器PID名空间,并执行应用。通过ps -ef命令,可以看到容器里包含一个PID为1的进程,CMD里,它是容器的启动进程

利用docker top命令,可以让我们从宿主机看到容器的进程信息。容器node1是一个独立的进程,父进程 Docker Daemon。所以Docker可以父子进程的方式在Docker Daemon和容器之间进行交互。

docker exec命令可以进入指定的容器内部执行命令。由于它启动的进程属于容器的namespace和相应的cgroup。但是这些进程的父进程是Docker Daemon而非容器的PID1进程。

如果我们在宿主机中手动杀掉容器的启动进程,容器会自动结束,而容器名空间中所有进程也会退出。
每个容器有独立的PID名空间,容器的生命周期和其PID1进程一致

大家可以去再了解了解关于PID的问题,我这就不说了~

因为我这个只是简单的拉取镜像创建的容器,所以,不会这么复杂需要处理那些“孤儿”进程和“僵尸”进程,或者像采用网上的前台开启一个进程的方式,这个原因我也给pass掉了。。。

❤折腾了好几天,坚持就是好滴~~

❤因为是初创容器,所以里面没有重要的东西,每天我没事就来一遍,把容器删掉,重新拉取镜像几次后,终于日志有反应了,在日志里发现了问题

查看了容器的日志,提示:
WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .
解决:

按照提示信息需要编辑文件grastate.dat ,并设置 safe_to_bootstrap=1
1)退到根目录下

cd /
find .  -name 'grastate.dat'
1.png

2)修改下面每一个grastate.dat 里面的safe_to_bootstrap=0改为 :

safe_to_bootstrap=1
# GALERA saved state
version: 2.1
uuid:    7662648f-5b39-11e9-bf91-8f107c21e6a5
seqno:   -1
safe_to_bootstrap: 1

保存
3)重新启动容器node1
4)查看 docker ps -a 就启动起来了
其他节点也重新设置了一下,
过一会在看的时候,也没有出现闪退情况。

❤至于为啥刚开始日志没有显示,我也不清楚,
估计是镜像拉取和我的机器之间的数据跑偏了吧~哈哈哈哈哈,愁人
为了这一个问题打扰到好多人,谢谢大家啦~

上一篇下一篇

猜你喜欢

热点阅读