现象
在虚拟机中启动 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 服务添加一个配置文件,并添加上默认的容器启动参数。
文章评论