在使用Docker时会遇到各种各样问题,下面为日常积累的一些经典问题,值得借鉴!该文章不定期更新维护,分享新的问题及解决方案!
一、IDEA远程连接Docker
1.1 修改配置文件
[root@MyDB1 ~]# vi /lib/systemd/system/docker.service
注释:
(1)0.0.0.0——表示任何ip地址都可以远程访问
(2)默认2375端口,最好修改为不常用的端口,提高安全性
(3)ip地址和端口,根据实际情况修改。可以修改为,只有指定ip才能够远程访问本Docker服务!
1.2 重启Docker服务
[root@MyDB1 ~]# systemctl daemon-reload # 刷新守护进程
[root@MyDB1 ~]# systemctl restart docker # 重启服务
[root@MyDB1 ~]# systemctl status docker # 查看服务状态
注释:从图中可以看到,增加了一个远程访问的守护进程(PID=8395),并实时监听2375端口!
1.3 配置防火墙
[root@MyDB1 ~]# systemctl stop firewalld.service
注释:可以选择关闭防火墙,或者开放“2375”端口。此处只是测试环境,选择直接关闭!
1.4 配置IDEA连接
注释:IP为Docker服务所在服务器的地址,端口为上述配置文件中指定的端口!
二、启动容器失败
2.1 错误日志
docker: Error response from daemon: driver failed programming external connectivity on endpoint lamp3 (46b7917c940f7358948e55ec2df69a4dec2c6c7071b002bd374e8dbf0d40022c): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 86 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
2.2 原因分析
可能是通过非官方提供的操作,从而误删除容器;因删除不彻底,守护进程的iptables规则链失效,启动时根据该规则链找不到相应容器!
2.3 解决方案
重启Docker服务!
systemctl restart docker
三、删除镜像失败
3.1 错误日志
3.2 原因分析
该镜像已被容器引用,无法直接删除!
3.3 解决方案
要想删除该镜像,先删除引用该镜像的所有容器,而后再删除镜像!
docker rm -f 容器名
docker rmi 镜像名
四、清空容器日志
4.1 问题描述
-
容器在运行过程中,随着请求不断,日志文件也不断扩大;
-
Docker服务会在日志文件达到一定阀值时,会自动清理;
-
而随着容器数量的递增,所有日志文件累加起来也不容小觑,而且我们查看一个容器日志也是从头一直刷到最新时刻,很痛苦!
4.2 解决分析
-
为了解决上述问题,我们手动清空一下日志;
-
日志文件默认存储路径:/var/lib/docker/containers/容器ID/容器ID-json.log;
-
思路分析:根据容器名称找到相应的容器id,然后进入对应容器存储路径,删除日志内容;
4.3 解决方案
方案1:(清空指定容器日志)
docker ps -a
cd /var/lib/docker/containers/
ls|grep dd2e4bedfb1e
cd dd2e4bedfb1eebe6d58807207e98bcf00947c3e5615e887bc6371449036a4581
echo > dd2e4bedfb1eebe6d58807207e98bcf00947c3e5615e887bc6371449036a4581-json.log
docker logs -f test-mysql
方案2:(清空所有容器日志)
cd /var/lib/docker/containers/
for i in `find . -name "*.log"`; do cat /dev/null >$i; done
五、删除无效镜像
5.1 问题描述
当我们重新构建镜像时,旧的镜像就会标记为<none>
这个种名称;如何清理这种无效镜像呢?
[root@MyDB1 ~]# docker images|grep '<none>'
5.2 解决方案
[root@MyDB1 ~]# docker rmi $(docker images -f "dangling=true" -q)
六、清理磁盘空间
6.1 需求描述
因磁盘有限,需清理一些长时间不使用的镜像或容器
6.2 解决方案
[root@MyDB1 ~]# docker image prune -a -f # 删除未引用的镜像
[root@MyDB1 ~]# docker container prune -f # 删除未运行的容器
注:可能会误删除近期未运行,但是需要保留的容器!谨慎操作!
七、启动服务报错
7.1 问题描述
- 首次部署项目时,使用docker-copmose来构建镜像并启动服务
- 再次部署项目时,无需重新部署所有服务,所以选择手动单独构建某一个服务镜像,但在启动时报错,提示找不到其他依赖服务
7.2 原因分析
- 手动单独构建时,该容器加入默认的内部网络
- docker-copmose构建时,会自动创建一个新的内部网络,docker-copmose.yml文件中所有容器都会加入该网络
- 而默认网络和copmose创建的网络是不互通的,所以才会出现此问题
[root@MyDB1 ~]# docker network ls
7.3 解决方案
在我们启动容器时,加入指定的网络中!
docker run --restart=always -d --name test-service --network test_defalut test-service:1.0
参数选项:
--restart=always # 该容器随Docker服务启动而启动
-d # 后台运行
--name test-service # 容器名称
--network test_defalut # copmose创建的网络
test-service:1.0 # 镜像名称