Docker的问题及解决方法集合

本文针对Docker容器启动后仅主机可访问映射端口的问题,详细介绍了排查与解决步骤,包括检查与调整firewall、iptables及ip转发设置。

系列文章目录

Docker简单介绍
CentOS7安装配置Docker
Docker基本命令


1、排查Docker端口映射后外部无法访问的问题

问题描述

创建一个docker容器,并进行端口映射。容器启动后,在部署容器的主机上可以访问映射端口,但是其他主机无法访问。

问题排查

出现上述情况,应是请求被拦截。出现该问题的可能是由于firewall配置异常、ip转发关闭、iptables服务拦截了请求

排查firewall

(1) 使用firewall-cmd --state查看防火墙运行情况
如果防火墙处于not running,则可以排除防火墙阻断请求的可能。
如果输出防火墙处于running则表示防火墙正在运行,需进行下一步排查
(2) 使用firewall-cmd --list-portsfirewall-cmd --list-services查看防火墙开放了哪些端口和服务。如果开放的端口中没有包含docker容器对外映射的端口,则可以采取以下解决方式:

  • 关闭防火墙服务systemctl stop firewalld.service
  • 添加策略打开指定端口
$ firewall-cmd --add-port=port/tcp --permanent
$ firewall-cmd reload

查看ip转发是否开启

通过cat /proc/sys/net/ipv4/ip_forward查看ip转发是否开启。如果该值为0则需要配置其开启

$ echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf 

关闭iptables

$ service iptables stop

2、镜像编译时无异常,容器启动后处于Exited状态

问题描述

镜像编译时无异常,容器启动后处于Exited状态,日志显示xxxx.go:xxx: exec user process caused "no such file or directory"

异常原因

镜像的entrypoint设置的启动脚本格式为dos,实际应为unix

解决方法

将启动脚本格式改为unix,然后重新编译镜像即可。

3、Docker启动失败

问题描述

systemctl status docker查看日志Error starting daemon: error while opening volume store metadata database: timeout

解决方法

执行ps axf | grep docker | grep -v grep | awk '{print "kill -9 " $1}' | sudo sh ,然后重启docker。

4、docker容器启动时报错

问题描述

docker容器启动时报错docker: Error response from daemon: OCI runtime create failed: container_linux.go:449;container init caused "write xxxxxx: permission denied"": unknown.

解决方法

  1. 执行setenforce 0后重启容器(该方法在主机重启后,容器会再次报上述错误)
  2. 修改/etc/selinux/config,将SELINUX=enforcing改为SELINUX=disable后,重启服务器,再重启容器(该方法永久生效)

5、Docker容器相连时出现"no route to host"错误

情景简述

docker容器之间可以通过link参数互连。容器也可以将内部端口映射到宿主机上。假设,宿主机ip为192.168.10.1,将一个Spring Boot应用将端口映射到宿主机8080:58080;该应用对应的MySQL数据库容器端口映射到宿主机3306:13306

问题描述

基于上述情景,将SpringBoot应用配置文件中jdbc连接的url改为jdbc:mysql://192.168.10.1:13306xxxx。这样的修改实际看起来可行,然而实际却会出现
no route to host的错误。

问题重现

(1)启动一个MySQL容器
$ docker run -d -p 3306:13306 -e MYSQL_ROOT_PASSWORD=123456 --name=sql mysql
此时使用第三方软件连接MySQL数据库是成功的,说明端口映射是成功的。
(2)启动一个SpringBoot应用镜像生成的容器(application.yml中数据库链接为jdbc:mysql://192.168.10.1:13306xxxx)
$ docker run -d -p 8080:58080 -e db=192.168.10.1:13306 --name=app app:1.0
此时我们会发现应用无法启动,查看日志出现java.net.NoRouteToHostExeeption: No route to host

解决方法

(1)修改Spring Boot应用的启动命令:
docker run -d -p 8080:58080 -e db=tomysql:3306 --link sql:tomysql --name=app app:1.0
此时spring boot应用正常连接数据库,启动成功。
(2)解决方式2
修改docker的配置⽂件,新增配置--userland-proxy=true,如
OPTIONS='--userland-proxy=true

6、Docker配置daemon.json后不生效

问题背景:

问题环境信息如下:
问题发生于WSLUbuntu 22.04,docker版本为20

问题描述

Docker在daemon.json配置镜像仓库地址后,镜像仓库地址配置未生效,即按照修改daemon.json->systemctl daemon-relod ->systemctl restart docker的操作后,执行docker info指令时,Registry Mirrors中并未出现daemon.json中配置的镜像仓库地址。

原因分析:

未正确重启docker和重载daemon,应按照以下流程进行操作

$ systemctl stop docker.service
$ systemctl stop docker.socket
$ systemctl daemon-reload
$ systemctl restart docker

此时执行docker info可以看到配置已生效.

说明

本文的前提是笔者已确认自己的daemon.json文件正确编写,上述步骤操作后,仍然无效,请检查下daemon.json文件是否正确填写,再按照上述步骤重新操作。

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会画画的画师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值