docker基础及使用docker搭建题目环境过程中的排错

docker基本命令

  • 搜索镜像
    docker search <>

  • 拉取镜像
    docker pull <>

  • 查看已下载的镜像
    docker images
  • 运行容器
    docker run -it <> /bin/bash
    -it 交互式运行
    -d 后台运行
  • 查看正在运行的容器
    docker ps
  • 停止运行容器
    docker stop
  • 查看docker历史运行状态
    docker -a
  • 删除历史运行状态
    docker rm

docker build -t .

docker run -id -p ports:80

docker exec -it bash

docker-compose up -d

用docker搭建题目及排错过程

1.docker运行启动就退出

遇到的第一个问题就是docker一启动就会自动停下来,这个问题老师在课上也讲了,是因为docker容器在后台运行必须有一个前台进程,不然的话会自动停下来,解决方法可以看这个链接针对Docker运行启动就退出问题一站式解决方案

2.docker运行web服务,访问网址显示拒绝访问

因为很不熟悉docker,出现问题也没有一个完整科学的排错流程,所以只是在网上搜索,然而网上的方法全部对我的情况无效。最后在歇斯底里中求助助教,经过助教的帮忙发现是apache服务没起来,进入容器内部手动重启apache后即可正常访问,同时针对这个问题更改dockerfile和start.sh。(在查找资料的过程中还要注意一个问题,docker启动后查看docker状态,端口映射的地方必须是0.0.0.0:xxxx –> 80,否则也会出现拒绝访问的情况)

*3.SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: YES) *

这个报错是因为访问数据库被拒绝,因为后面的@'localhost'代表只允许本地访问数据库,所以访问当然会被拒绝。解决方法也比较简单,只要在dockerfile中将相应的语句修改为'root'@'%'即可,'%'代表任何人都可访问。相似的错误还有Access denied for user 'user'@'localhost',解决方法相同,只要替换localhost为%即可。

mark

4.Error (1133): Can’t find any matching row in the user table

这个错误也比较容易解决,看上图第一个箭头,只要在dockerfile中修改为对应的数据库名字即可。

5.SQLSTATE[HY000][2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

这个错误记不太清了,可能是apache2服务没起来的原因

6.ERROR: The partition with /var/lib/mysql is too full! failed!

同样是个坑爹的错误,因为我的服务器硬盘只有10G,一天中为了解决错误build了无数次docker,但是没删过images,所以到晚上的时候可能硬盘要满了,就报了这个错误,删除几个镜像错误解决。

7.Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY000] [2002] No such file or directory

这个错误是因为sql没起来,手动启动sql服务后恢复正常。

8.xftp可能会导致上传文件不完整

这他妈是最坑的一个bug,昨天一天都深陷在这个坑里无法自拔。原因是服务器在美国,我一直是用xftp向服务器上传文件,延迟较高,然而有一个很重要的html文件内容丢失(文件在,内容空),表现出来的就是访问特定网页返回码200,却是空白页面。这个问题困扰了整整一天,最后实在没办法想改页面,最后在队友让我修改代码的时候机缘巧合的发现我服务器上的文件里是空的。。。。(AKFHY@&!@&#T&*!#&!

9.ubuntu16.04上apache2的默认页面更换

昨天晚上的时候觉得第八个问题排错无望,想更改apache的默认页面,却死活找不到配置文件。要注意每个ubuntu版本的apache配置文件所在位置有所不同(假设是直接安装apache2及相应依赖,没使用lamp等一键安装脚本),ubuntu16.04中apache2的配置文件位置是/etc/apache2/sites-available/000-default.conf

mark

10.问题7进阶版

昨天晚上的时候把第8个问题解决后,重新build、run,还是会出现问题7,虽然手动启动sql后可以恢复服务,但是出题需要全自动部署。又经过了一番搜索,在start.sh中加入sleepecho 'service mysql status',docker运行的时候使用-it即可看到echo输出的信息,从而判断服务是否正常。

11.出一道题真不容易

因为昨天bug太多,最后实在没办法,舍友跟我说让我把其中一个服务正常(但是我却记不起来到底修改了哪些文件及配置)的container commit一下,并且push到自己的dockerhub上,交题目的时候直接FROM 自己的镜像即可。但是今天下午赛宁的人发来消息,说不要用自己docker仓库里的镜像,因为不方便他们调整题目,于是又开始了怀疑人生的环境配置。首先找到了昨天下午助教帮忙改好的可以正常起来apache服务的dockerfile和start.sh(此处说明了保存历史版本的重要性,同时要做好历史版本,可以用时间来命名,方便寻找历史版本),重新build、run。此时却发现地址无法连接,吸取了昨天的经验教训,第一是进入docker查看系统服务情况,发现apache,mysql都正常,经过重复几次build不同版本的dockerfile,才想起来没有打开服务器的对应端口。。。

打开端口,再试一次。发现还是老问题,index.php虽然返回码是200,但却是空白页面,还是老问题了:/view/index/index.html是空的(同样说明了条理的保存历史版本的重要性),重新上传正常的index.html,访问成功。

几个不记得解决方法的问题

关于运行docker容器报错Error response from daemon: EOF问题

Error response from daemon: OCI runtime create failed: container_linux.go:348