执行 pull 命令时提示:“certificate has expired or is not yet valid”:
原因:证书失效将导致 docker pull 命令执行会反馈证书问题而失败。
解决方法:需要在本地的 Docker 启动参数新增启动参数 --insecure-registry 0.0.0.0/0
具体实现:NDSL 系统直接修改 /etc/docker/daemon.json ,修改完成后重启 Docker 服务即可:
容器中执行命令出现:System has not been booted with systemd as init system (PID 1). Can't operate
原因:在 Linux Docker 中没法使用 systemd(systemctl) 相关命令的缘由是 1号进程不是 init ,而是其余例如 /bin/bash ,因此致使缺乏相关文件没法运行。
解决方法:使用 /sbin/init 进行初始化
具体实现:使用命令 docker run -tid --privileged=true <Image ID> /sbin/init 新建容器,使用命令 docker exec -it <Container ID> /bin/bash 进入容器
容器中无法启动 MongoDB 等服务:New main PID 558 does not belong to service, and PID file is not owned by root. Refusing.
原因:内核接口阉割
解决方法:在原来容器的基础上创建一个新容器,同时挂载宿主系统的 /sys/fs/cgroup 文件夹
具体实现:
- 提交现有容器为新镜像,然后创建:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08b634bf4c57 5d0da3dc9764 "/sbin/init" 21 hours ago Up 21 hours interesting_pascal
$ docker commit <Container ID> <New Image TagName>
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tools latest 8443adbfc1fb 13 seconds ago 1.2GB
$ docker run -itd --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup <New Image ID> /sbin/init
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c9117a1238f 8443adbfc1fb "/sbin/init" 13 seconds ago Up 12 seconds goofy_diffie
08b634bf4c57 5d0da3dc9764 "/sbin/init" 21 hours ago Up 21 hours interesting_pascal
$ docker exec -it <New Container ID> /bin/bash
- export容器为镜像,然后import为新镜像,以此创建新容器:
$ docker container export -o ./myimage.docker <Container ID>
$ docker import ./myimage.docker <New Image TagName>
$ docker run -itd --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup <New Image ID> /sbin/init
$ docker exec -it <New Container ID> /bin/bash
使用镜像挂载目录创建新容器后对应服务无法启动:about to fork child process, waiting until server is ready for connections.
原因:
i. 目录挂载时依靠用户、用户组 ID 确定目录归属,但父系统用户 ID 与容器中用户 ID 不同,造成目录归属不一致,服务对应用户无法操作挂载目录。
ii. 服务未正常退出,导致进程卡死。
解决方法:镜像中设置 crontab 任务,创建容器自动使用脚本执行刷新权限等操作。
具体实现:crontab 支持特殊标签,其中 @reboot 为系统重启时执行,而到 docker 中执行的时机则为使用镜像创建容器的时候。
@reboot /home/run.sh > /home/result.txt
run.sh:
echo "current date: "`date -d "+8 hour" +"%Y-%m-%d %H:%M:%S"`
chown -R mongod:mongod /var/lib/mongo
rm -rf /var/lib/mongo/*.lock # mongo 为正常退出,数据目录下存在 .lock 文件,服务无法启动。