Docker容器应用中常见问题的解决:自定义hosts重启丢失、停止容器报错、启动后台任务报错、禁用ipv6

一、Docker容器添加自定义hosts重启丢失问题

    在docker容器中手动修改了hosts增加了一些域名的解析,但对容器进行重启后hosts全部丢失了。

    因为容器中的/etc/hosts,、/etc/resolv.conf、/etc/hostname这三个文件并不存在于镜像中,而是存在于宿主机的/var/lib/docker/containers/目录中,在重启docker容器时会通过mount的形式将这些文件挂载到容器内部。

    因此会覆盖容器中对这些文件的手动修改。

    如果可以通过指定DNS来解决的话,可以在启动容器时添加选项--dns=x.x.x.x 来指定容器内的dns,也可修改docker的配置文件/etc/docker/daemon.json,加入DNS配置选项,这个就和修改镜像的DNS一样。

    要实现容器中的hosts永久修改和保存,有如下几个方法:

1. 在docker的启动命令中添加参数。

在docker run运行起容器的时候,添加参数--add-host [域名]:[IP],将要访问的其他服务器的host和ip加入到/etc/hosts文件。示例如下:

# 添加1个host指向
docker run -d -p 80:80 --add-host domain.com:192.119.14.23 -name demo demo:latest
# 添加多个host指向
docker run -d -p 80:80 --add-host domain.com:192.119.14.23 --add-host domain2.com:192.119.14.22 -name demo demo:latest

2. 在docker容器启动脚本后添加一个修改hosts命令

这个想法比较直接也可用。

docker exec <容器Id> /bin/sh -c "echo 192.119.14.23 domain.com >> /etc/hosts"

二、Docker停止容器报错 cannot stop container,aa-remove-unknown

    某天发现线上docker中的PHP容器有需要想重启一下,但在执行重启容器时竟然报错Error response from daemon: cannot stop container: ,ttrpc: client shutting down: ttrpc: closed: unknown,加sudo权限执行也不行。觉得挺怪异的。
    经过总结,针对docker cannot stop container有三个可行的解决办法:

1:使用一个急救命令aa-remove-unknown,

    aa-remove-unknown命令正如其所见意义,将清除/etc/apparmor.d/中的所有配置文件,将该列表与当前加载到内核中的配置文件进行比较,然后删除/etc/apparmor.d/中未找到的所有已加载配置文件。当然有可能你的服务器上没有这个命令,然后出现: aa-remove-unknown: command not found 的错误,不过不要紧。安装包apparmor-utils即可。

user@u04007:~$ docker stop 2326ac1d4b43
Error response from daemon: cannot stop container: 2326ac1d4b43: Cannot kill container 2326ac1d4b4322ec1c5184345794d9502820d8b799e0d7fd6b8be63327e87141: ttrpc: client shutting down: ttrpc: closed: unknown
user@u04007:~$ sudo aa-remove-unknown
sudo: aa-remove-unknown: command not found
user@u04007:~$ sudo apt-get install apparmor-utils
Created symlink /etc/systemd/system/sysinit.target.wants/apparmor.service → /lib/systemd/system/apparmor.service.
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
diff: /var/lib/apparmor/profiles/.apparmor.md5sums: No such file or directory
Setting up apparmor-utils (2.11.0-3+deb9u2) ...
Processing triggers for systemd (232-25+deb9u12) ...
#apparmor-utils完成安装,不过很不幸,反正在我的服务器上没有执行成功。
user@u04007:~$ sudo aa-remove-unknown
/usr/sbin/aa-remove-unknown: 65: /usr/sbin/aa-remove-unknown: cannot open /sys/kernel/security/apparmor/profiles: No such file
ERROR: Unable to read apparmorfs profiles file

2:重启docker服务:

    sudo systemctl restart docker.service 不过这个方法不大好。毕竟可能会影响到其它正在运转的业务。

3:找到你的问题原因,清除掉导致cannot stop container问题的障碍。

   我在使用aa-remove-unknown未果的情况下,想了想到底是什么原因导致了我不能stop容器,前两天部署了systemd下的一个service,会调用我的docker容器中的PHP,想来也就是这里导致的吧。然后我看了一下PHP的进程,发现了一些异常。

#如下为在异常状态下的PHP进程
root@n8-022-053:~# ps -ef |grep php
root     1413004 1412986  0 May25 ?        00:00:05 php-fpm: master process (/usr/local/etc/php-fpm.conf)
www-data 1413056 1413004  0 May25 ?        00:00:00 php-fpm: pool www
www-data 1413057 1413004  0 May25 ?        00:00:00 php-fpm: pool www
www-data 1413058 1413004  0 May25 ?        00:00:00 php-fpm: pool www
root     2961690 2696020  0 May28 ?        00:00:05 [php] <defunct>
root     2962382 2696020  0 May28 ?        00:00:05 [php] <defunct>
root     2963230 2696020  0 May28 ?        00:00:04 [php] <defunct>

    如上为在异常状态下的PHP进程,正常情况下我的PHP除了master process外,其它的应该都是www-data用户的命令,因为systemd下的命令我已经kill过了,但这里还有,感觉就像成了僵尸进程(查出来的命令中还有defunct显示)。

    而且因为这些进程在使用导致容器无法终止。怀疑问题就是出现在这里,于是将下面的defunct PHP进程kill掉,再进行容器停止就成功了。

三、在 Docker中启动后台任务时报错container_linux.go:348: starting container process caused

    在docker环境中,在使用jenkins发布系统发布新代码至服务器后进行后台执行任务的重启,但在重启时发生报错:OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused exec: ..: stat exec_file: no such file or directory: unknown。

#执行命令如下:
u04007@u4:/opt/data/www$ docker exec `docker ps -a | grep '9000/tcp' |awk '{print $1}'` /var/www/bin/backrun rundir/code.php
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: "/var/www/bin/backrun": stat /var/www/bin/backrun: no such file or directory": unknown

    报错的提示显示执行bin下面的文件时没有找到这个文件或者目录,但我使用docker exec 进入容器却明明发现此执行文件确实存在,一时搞不清楚出了什么奇怪的问题,因为发布代码没有涉及到其它的修改,但执行却不正常了。

    google找了很多资料,有说是docker版本的问题,有说在启动容器的时候加上其它参数,但从我这里的情况来看,都不应该是这样的问题,因为我之前的代码都运行正常。最后我认真对比了一下两边的代码文件,从颜色差异上发现原代码上这些文件都具有可执行权限,而新发布的代码没有这个权限这么一个差异,并在添加chmod +x执行权限后成功解决了此问题。

    问题解决了当然是兴奋的,但也为docker的这个报错感到郁闷,不可执行的报错它报成了文件不存在的问题,会误导我们排查问题的方向导致问题很难排查出来。

四、在Docker容器中禁用ipv6。Cannot find module ‘node:fs‘错误 

    在使用docker启动服务后使用docker ps -a查看服务列表,PORTS那列里会列出很长的一段,每个端口都展示了两排内容,其中就包括了IPV4和IPV6的地址,有些多余。

    而且会使得整个docker ps -a查看出来的内容显示换行不美观。既没用又会影响命令结果展示,如果能把它关闭掉就好了。

    我这里使用的是UBUNTU18.04 64位,当然网上也提供了一些方法,我整理如下:

1. 使用--dns-opt='options single-request'运行docker 未见效。
2. 使用--sysctl net.ipv6.conf.all.disable_ipv6=1运行。 未见效。
3. 启动时添加 -e "extra_params=--o:net.proto=IPv4"  -e       "PGADMIN_LISTEN_ADDRESS=0.0.0.0" 未见效。

最后我使用如下方法启动容器能实现我要的目标。如下方法说明4

4. 启动容器时直接挂端口在指定的IP下面。如

    docker run --name 容器名称 -p 192.168.162.11:80:80

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值