Docker
1、Failed to start Docker Application Container Engine
在阿里云服务器安装docker后发现无法启动,总是报错Failed to start Docker Application Container Engine
在确定内核版本可用以及安装没有问题后,通过tail -200f /var/log/messages查看系统日志发现问题
解决方法:
/etc/docker/daemon.json配置镜像加速文件,复制的文本上可能存在未知的空白字符被linux识别了出来,导致格式错误,手动打一遍就好
2、unknown instruction: CMD["python3"
在进行第一次创建自定义镜像时报错
CMD["python3", "app.py"]
解决方法:
属于格式错误,CMD和"["之间要有空格
CMD ["python3", "app.py"]
3、apt does not have a stable CLI interface. Use with caution in scripts
构建自定义镜像时,Dockerfile中 RUN apt update 出错
解决方法:
不要在脚本中使用apt命令,使用apt-get命令进行替换apt
4、Do you want to continue? [Y/n] Abort
构建自定义镜像时,在以上提示出现后自动结束构建程序
Dockerfile中有这么一条
RUN apt install python3
RUN apt install python3-pip
正常安装会弹出安装Do you want to continue? [Y/n] 需要用户手动确认,程序会自动Abort从而结束
5、容器启动就停止
运行一个容器后,docker ps看不到运行中的容器,通过docker ps -a 能看到容器已经停止运行,既然能够启动没有报错,docker的配置应该没有什么问题,问题应该在Dockerfile和前台进程上了。
一开始觉得前台进程没什么问题,CMD ["python3", "app.py"],前台进程命令没什么问题
然后重点排查Dockerfile,发现指定工作目录和app.py文件没有在宿主机内创建,又是给权限又是手动创建目录,最后脑子一激灵,工作目录不是应该在容器内创建的吗,重新运行容器并进入内部查看,发现目录和文件都正常被创建了,一筹莫展的时候意外输入了
docker run -it 容器ID
没有通过bash命令进入容器内部,而是直接运行了容器,然后弹出了报错信息
原来是在vim里手打的app.py少了个冒号":" 导致导致前台进程运行出错直接退出了,以后代码还是在运行无误后再拿过来用
6、挂载数据卷失误
运行容器挂载数据卷时,会将本地目录内容映射到容器内,也就是说本地目录如果为空,容器内对应的目录也是空的,需要在挂载前将文件放入本地目录
已挂载的数据卷目录中进行文件修改,需要重启容器才能生效
7、数据库挂载数据卷
docker run -d -p 3306:3306 \
> --name mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/log:/var/log/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/data:/var/lib/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/my.cnf:/etc/mysql \
> -e MYSQL_ROOT_PASSWORD=1213 \
> --privileged=true \
> mysql
通过以上命令运行mysql容器时总是秒退,然后查看日志发现以下错误
需要挂载/var/lib/mysql-files到宿主机,加入以下数据卷之后就成功启动
-v /xiaohuodemo/mysql/nginx_mysql_demo/mysql-files
MYSQL
1、could not open log file
背景:在宿主机内删除数据库后,重启mysql容器也没有同步删除容器内的应删除的数据库,初步怀疑是容器重启后读取到日志内创建数据库的操作而没有读取到删除数据库的操作导致数据库一直被重新创建
然后在宿主机内数据卷目录下手手动rm binlog,删除了所有日志文件,再次启动Mysql容器就报" could not open log file" 错误,查阅了一番,得出结论:绝对不能手动rm 删除binlog文件,基本都会报主从不一致错误,一旦出现这种情况,只能重新做从库
建议:
- 避免对binlog文件做压缩删除等直接操作,可以通过调整参数修改binlog清理策略.
- 需要手工删除binlog时,可以进入MySQL通过purge命令去删除。
PURGE BINARY LOGS BEFORE '2020-11-25 13:09:51';
2、Error on realpath() on ‘/var/lib/mysql-files‘ (Error 2 - No such file or directory)
用以下命令创建一个正式使用的数据库
docker run -d -p 3306:3306 --name mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/log/:/var/log/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/data/:/var/lib/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/my.cnf:/etc/mysql/conf.d \
> -e MYSQL_ROOT_PASSWORD=1213 \
> --privileged=true \
> --restart=always \
> mysql
启动后数据库容器秒退,查看日志报错Error on realpath() on ‘/var/lib/mysql-files‘ (Error 2 - No such file or directory),
解决方法:
经过查询,应该是在挂载my.cnf配置时需要额外挂载/var/lib/mysql-files文件,但是又出现Could not open unix socket lock file /var/lib/mysql/mysql.sock.lock 这个报错用时良久也无法解决,干脆跳过寻找其他办法。最后决定不覆盖my.cnf文件,挂载/etc/mysql/conf.d目录,成功解决
解决方法:
新开一个mysql容器,复制/etc/mysql/conf.d目录下所有文件到宿主机本地/xiaohuodemo/mysql/nginx_mysql_demo/conf/conf.d/,然后将宿主机内之前写好的my.cnf改名放到/xiaohuodemo/mysql/nginx_mysql_demo/conf/conf.d/目录下,最后再挂载目录时把该目录挂载上去,命令如下
docker run -d -p 3306:3306 --name mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/log/:/var/log/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/data/:/var/lib/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/conf/conf.d/:/etc/mysql/conf.d \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/mysql-files/:/var/lib/mysql-files \
> -e MYSQL_ROOT_PASSWORD=1213 \
> --privileged=true \
> --restart=always \
> mysql
启动成功,通过ip:3306连接成功