红茶的个人站点

  • 首页
  • 专栏
  • 开发工具
  • 其它
  • 隐私政策
Awalon
Talk is cheap,show me the code.
  1. 首页
  2. 开发工具
  3. 正文

Dock 容器无法启动的问题排查

2023年10月23日 1970点热度 0人点赞 0条评论

现象

在虚拟机中启动 Docker 的 Canal 镜像失败,现象为启动若干秒后容器自动停止。

启动命令为:

docker run -p 11111:11111 --name canal \
-e canal.destinations=heima \
-e canal.instance.master.address=mysql:3306  \
-e canal.instance.dbUsername=canal  \
-e canal.instance.dbPassword=canal  \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false  \
-e canal.instance.filter.regex=heima\\..* \
--network heima \
-d canal/canal-server:v1.1.5

排查过程

查看容器日志没有有效信息:

[icexmoon@192 ~]$ docker logs canal
DOCKER_DEPLOY_TYPE=VM
==> INIT /alidata/init/02init-sshd.sh
==> EXIT CODE: 0
==> INIT /alidata/init/fix-hosts.py
==> EXIT CODE: 0
==> INIT DEFAULT
Starting sshd: [  OK  ]
Starting crond: [  OK  ]
==> INIT DONE
==> RUN /home/admin/app.sh
==> START ...
start canal ...

可以看到执行到start canal ...这一行后容器停止,原因不明。

我还查看了宿主机的系统日志:

[icexmoon@192 下载]$ journalctl -f
10月 23 15:51:35 192.168.0.88 systemd-coredump[67829]: [🡕] Process 67811 (java) of user 500 dumped core.
​
                                                        Stack trace of thread 102:
                                                        #0  0x00007f2f8f8d24f5 n/a (/lib64/libc-2.12.so + 0x324f5)
                                                        #1  0x00007f2f6fdb9df6 n/a (/usr/java/jdk1.8.0_181-amd64/jre/lib/amd64/libnet.so + 0x12df6)
                                                        #2  0x00007f2f6fdab38b n/a (/usr/java/jdk1.8.0_181-amd64/jre/lib/amd64/libnet.so + 0x438b)
                                                        #3  0x00007ffc9159399e n/a (n/a + 0x0)
                                                        #4  0x74736574616c2f61 n/a (n/a + 0x0)
                                                        ELF object binary architecture: AMD x86-64

系统日志有内核崩溃的记录,疑似内存不够导致。更进一步的排查需要进入容器查看容器内的日志信息。

在这里遇到麻烦,容器无法正常运行,就无法通过docker exec -it ...的命令进入容器内部。

通过网络检索,我找到一个方法:

docker run -p 11111:11111 \
-e canal.destinations=heima \
-e canal.instance.master.address=mysql:3306  \
-e canal.instance.dbUsername=canal  \
-e canal.instance.dbPassword=canal  \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false  \
-e canal.instance.filter.regex=heima\\..* \
--network heima \
-it canal/canal-server:v1.1.5 \
/bin/bash

在这里修改容器的启动命令,去除--name,添加上-it和/bin/bash命令,这样即使容器默认的启动脚本执行失败,也不会立即停止,而是停留在交互式的 bash 工具下。

在容器中手动执行 Canal 的启动脚本:

[root@d7f38933a63f admin]# sh app.sh
==> START ...
start canal ...

问题和之前一样,会停留在start canal ...这行日志输出的位置。

查看详细日志:

[root@d7f38933a63f admin]# cd canal-server/logs
[root@d7f38933a63f logs]# ll
total 0
drwxr-xr-x. 2 admin admin 30 Oct 23 16:33 canal
[root@d7f38933a63f logs]# cd canal/
[root@d7f38933a63f canal]# ll
total 4
-rw-r--r--. 1 admin admin 427 Oct 23 16:33 canal_stdout.log
[root@d7f38933a63f canal]# cat canal_stdout.log
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=96m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
library initialization failed - unable to allocate file descriptor table - out of memory

关键的是这行:

library initialization failed - unable to allocate file descriptor table - out of memory

解决

现在的问题就是检索这个错误的处理方法,我找到了这个。

根据文中给出的方案,修改启动命令后重新启动:

[root@192 mysql]# docker run -p 11111:11111 --name canal \
--ulimit nofile=65535:65535 \
--ulimit nproc=65535:65535 \
-e canal.destinations=heima \
-e canal.instance.master.address=mysql:3306  \
-e canal.instance.dbUsername=canal  \
-e canal.instance.dbPassword=canal  \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false  \
-e canal.instance.filter.regex=heima\\..* \
--network heima \
-d canal/canal-server:v1.1.5
c4402912bdb7842f375b1954c73016be6f3285b2a5a921c462bd1154afd03d62

查看日志:

[root@192 mysql]# docker logs -f canal
DOCKER_DEPLOY_TYPE=VM
==> INIT /alidata/init/02init-sshd.sh
==> EXIT CODE: 0
==> INIT /alidata/init/fix-hosts.py
==> EXIT CODE: 0
==> INIT DEFAULT
Generating SSH1 RSA host key: [  OK  ]
Starting sshd: [  OK  ]
Starting crond: [  OK  ]
==> INIT DONE
==> RUN /home/admin/app.sh
==> START ...
start canal ...
start canal successful
==> START SUCCESSFUL ...

启动成功!

为了防止以后出来类似的问题,可以参考之前那篇文章中的方案,为 Docker 服务添加一个配置文件,并添加上默认的容器启动参数。

参考资料

  • library initialization failed - unable to allocate file descriptor table - out of memoryAborte-CSDN博客

  • 从零开始 Spring Cloud 8:Docker - 红茶的个人站点 (icexmoon.cn)

  • Linux 之旅 18:认识与分析日志文件 - 红茶的个人站点 (icexmoon.cn)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: docker
最后更新:2023年10月23日

魔芋红茶

加一点PHP,加一点Go,加一点Python......

点赞
< 上一篇
下一篇 >

文章评论

取消回复

*

code

COPYRIGHT © 2021 icexmoon.cn. ALL RIGHTS RESERVED.
本网站由提供CDN加速/云存储服务

Theme Kratos Made By Seaton Jiang

宁ICP备2021001508号

宁公网安备64040202000141号