Docker 镜像使用常见雷区处理

执行 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 服务即可:

20211118110649796.png

    

容器中执行命令出现: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 文件,服务无法启动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃芒果的芬里尔狼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值