docker/k8s踩坑日志

678 阅读8分钟

1.docker部署问题

docker 启动失败

docker 启动 提示Job for docker.service failed because start of the service was attempted too often.

  • 原因
    • /etc/docker/daemon.json 内容没有配置好
  • 方案
    • 修复/daemon.json, 注意 "data-root": "/data/docker"的路径要根据实际情况来,不同电脑不一样,修改后会丢失原来的镜像信息,切回来即可。
{
"registry-mirrors" : [
    "https://jkfdsf2u.mirror.aliyuncs.com",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries" : [
    "docker-registry.zjq.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "10"
  },
  "data-root": "/data/docker"
}

docker exec执行失败

OCI runtime exec failed: exec failed: unable to start container process: exec: "bash"

  • 原因
    • 不支持 bash启动 ,改用sh
  • 方案
    • docker exec -it container_name sh

用docker部署的nuxt前端项目3000 端口外网无法访问

  • 原因
    • nuxt.config.js 配置里面使用的是默认localhost配置
  • 方案
    • 在nuxt.config.js 配置里 新增下面配置,指明0.0.0.0 所有服务器都可以访问
  server: {
    port: 3000,
    host: '0.0.0.0',
    timing: false
  }

nginx 部署的返向代理 ,但是浏览器无法访问

upstream ssrPages { server 127.0.0.1:3000; }

  • 原因
    • docker 容器通过网桥 到访问到宿主机,所以127.0.0.1 是无法访问到宿主
  • 方案
    • 需要使用网桥 的ip,或者直接公网的ip 做方向代理,通过ipconfig 查看网桥的ip
upstream ssrPages {
    server 172.17.0.1:3000;
}

前端项目提示cdn找不到

项目做docker容器化后,cdn无法访问

  • 原因
    • cdn单独 include,忘记修改 alias /html/cdn; 对应的地址
  • 方案
    • 由于img 也使用的cdn ,也要一样的修改
 alias   /html/cdn; 
 修改为下面完整配置
 alias   /usr/share/nginx/html/cdn;

docker images查看镜像没有实时刷新

  • 当推送的新的镜像上私有仓库(相同的名称+版本号),使用docker images时 显示的create date并不准确。有些显示 Less than a second ago,有些显示 3 days ago,但是晚点看有变回 Less than a second ago
  • 原因
    • 可能是docker 更新需要定时处理
  • 方案
    • 晚点再查看,如果要确认版本,最好看ID

运行docker导致cpu占满

启动docker服务器后,运行node+mongodb服务器时,会导致整个linux服务cpu拉满,其他服务都不可用

  • 原因
    • 后台一直输出数据连接不上,连接不上后,会一直重连,导致资源耗尽
  • 方案
    • 由于docker内部的不同应用的直接使用的是原来的端口,而不是重新映射的端口。如原来是容器里mongodb端口为 是 2886 则node也用2886访问mongodb

前端nuxt项目启动失败

启动打印 2023-05-13 10:42:14,650 ERROR 2075 [app_worker] server got error: bind EADDRNOTAVAIL 10.7.123.127:9001, code: EADDRNOTAVAIL

  • 原因
    • 由于配置
 config.cluster = {
    listen: {
      port: 9001,
      hostname: "10.7.123.127",
    },
  };

直接指定了 10.7.123.127的ip,但是docker容器里又识别这里这个ip

  • 方案
    • 把ip 10.7.123.127 改成 0.0.0.0

使用jenkis打包命令发布 总是代码不生效

  • 原因
npm -v
rm -rf package-lock.json version.tar.gz ./dev_ims_version_pc_egg
cnpm install
cd ..
cp -r dev_ims_version_pc_egg version_egg

构建的时候 使用新文件夹 version_egg,每次重新复制前,应该先删除,再复制,因为默认是提示是否要覆盖,而不是覆盖

  • 方案
    • 在cp -r dev_ims_version_pc_egg version_egg 前面 先执行 rm -rf version_egg

版本管理系统 提交代码总是提示失败

eslint . xxxxxx 
husky pre-commit hook exited with code 1 (error) 
  • 原因
    • 项目使用了eslint ,必须满足指定的格式化才可以
  • 方案
    • 在 package.json 找到 formatter 格式化命令,提交前执行 npm run formatter

全局的docker-compose命令无法使用

  • 原因
    • 存放的docker-compose文件变成了只有9k左右,正常应该是20m, 可能是直接执行curl -L get.daocloud.io/docker/comp… -s-uname -m` > /usr/local/bin/docker-compose 使用该命令下载的 docker-compose文件 有问题
  • 方案
    • 建议把之前备份好另外一台的docker-compose 直接上传使用,并且如果全局无效,需要在 vi ~/.bashrc 加入 全局环境路径
export PATH="$PATH:/usr/local/bin"
source ~/.bashrc 

docker执行pull 拉取镜像失败

执行 docker pull www.test.cn:5000/nginx:3 提示

Error response from daemon: Head "www.test.cn:5000/nginx/v2/yl…": no basic auth credentials

  • 原因
    • 当前docker用户未登陆
  • 方案
#先执行登录
docker login www.test.cn:5000
#用户名
docker 
#密码
123123

docker执行pull 拉取镜像失败

执行 docker pull www.test.cn:5000/ylzs-nginx:… 提示 Error response from daemon: Get "www.test.cn:5000/v2/": net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02"

  • 原因
    • 当前docker用户未登陆,或已经退出
  • 方案

docker执行登录提示错误

执行 docker login www.test.cn:5000 提示

Error response from daemon: Get "http://www.test.cn:5000/v2/": net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
  • 原因
    • 当前输入的用户账号或密码错误
  • 方案
      1. 重新登录输入正确的用户账号和密码
  1. 如果有已经登录成功的电脑,可以复制 /root/.docker/config.json 到有问题的相同路径下。 没有该路径和文件则需要自己先创建

docker部署build失败

使用docker部署build的时候,总是提示 mv: can't rename './version_egg/config': Directory not empty

  • 原因
    • dockerfile 使用了ADD . /app 把当前目录下所有文件都复制到容器,刚好目录下也有 config的文件夹。所以冲突了
  • 方案
    • 按需ADD 文件,不使用ADD . /app 全部复制

日志切割没有生效

  • 原因
    • 不同的nginx的docker镜像对应的logs路径是不一样的,官方默认路径是/var/log/nginx/.log {}, 自己下载定制镜像的默认路径才是 /usr/local/nginx/logs/.log {}
  • 方案
    • 把 /usr/local/nginx/logs/.log {} 修改为 /var/log/nginx/.log {}

在docker容器内不能访问百度

在docker容器内不能访问百度,并且宿主机以外的电脑也不能正常访问 部署的jenkins。需要nginx二次转发。 并且启动centOS7镜像,提示缺少ip4的支持

  • 原因
    • docker的network没有正常启动,docker版本太新,不包含ip4的支持
  • 方案
    • 需要加入ip4的支持,才能桥接访问外网

前端转发的后台接口服务,无法正常访问

前端转发的后台接口服务,无法正常访问,并且重启docker-compose restart 提示

Error response from daemon: Cannot restart container nginx: driver failed programming external connectivity on endpoint nginx (73bd4aa78e2e3019133f877e1eae61d0a6bd27ae54d1c6e2b5a52e9203c9d20e):  
(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 444 -j DNAT --to-destination 172.25.0.3:8443 ! -i br-b825f071da74: iptables: No chain/target/match by that name.
  • 原因
    • iptables的规则被修改了, docker 每次启动都会读取一遍,后续的iptables 如果更新了,依然还是老的规则
  • 方案
    • 重启docker systemctl restart docker

2.docker-compose

执行命令 docker-compose ps 提示错误

 Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml
  • 原因
    • 必须把yml 命名成指定的名称,如docker-compose.yml,或者docker-compose.yaml
  • 方案
    • 把自己定义的 mongodb.yml 改成 docker-compose.yml,并且一定要cd 到所在的目录

启动 docker-compose提示错误2

启动 docker-compose提示(root) Additional property nginx is not allowed

  • 原因

    docker-compose版本太新,会导致解析不了老版本格式的.yml文件
  • 方案
    • 修改,docker-compose.yml文件在头部新增 serive: 并且下面内容要向右偏移一格

docker-compose部署gitlab .启动后访问无效

启动后访问无效 或提示502 Whoops, GitLab is taking too much time to respond.

  • 原因
    • 使用的后台运行,其实程序还没有完成启动完
  • 方案
      1. 运行的时候不开启后台运行,等待日志完整输出完
  1. 使用后台运行,并使用 docker logs -f id 查看日志

gitlab,运行.gitlab-ci.yml 提示 docker: command not found

  • 原因
    • gitlab-runner配置启动 需要映射 本地的 /usr/bin/docker到容器的/bin/docker
  • 方案
    • docker-compose 文件添加
volumes:
- /usr/bin/docker:/bin/docker

curl安装docker-compose 一直sleep

使用curl -L get.daocloud.io/docker/comp… -s-uname -m` > /usr/local/bin/docker-compose 下载的 docker-compose 运行时总是提示sleep ,并不能运行

  • 原因
    • 最新docker-compose 源码对安全做了限制,只能用非root操作
  • 方案
      1. 使用以前下载过的docker-compose 通过ftp上传到指定服务器
  1. 通过 pip执行,缺点:安装的最新版本只能到 1.23, 不能解析最新的yml文件,只能修改版本号为 2 或以下做兼容。

docker-compose部署gitlab,运行.gitlab-ci.yml 提示权限不够

docker-compose部署gitlab,运行.gitlab-ci.yml 提示permission denied while trying to connect to the Docker daemon socket

  • 原因
    • gitlab-runner 运行访问docker.sock文件权限不够
  • 方案
    • 执行命令 sudo chmod -R 777 /var/run/docker.sock

3. k8s部署

运行提示

[ERROR Swap]: running with swap on is not supported. Please disable swap

  • 原因
    • 需要关闭swap分区
  • 方案
swapoff -a #临时 
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
swapon -v # 检查 输出为空,表示swap已关闭

启动k8s的错误

error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: this version of kubeadm only supports deploying clusters with the control plane version >= 1.19.0. Current version: v1.18.0

  • 原因
    • init的指定版本与实际安装的kubeadm 不一致
  • 方案
    • 移除原来的kubeadm,再重新安装
yum remove -y kubelet kubeadm kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

启动k8s的错误

启动k8s的时候提示 kubelet cgroup driver: “systemd” is different from docker cgroup driver: “cgroupfs”

  • 原因
    • k8s的cgroupfs 模式 和 docker的systemd 不一致
  • 方案
# 修改docker的模式
vi  /etc/docker/daemon.json
# 最后面加入
"exec-opts": ["native.cgroupdriver=cgroupfs"]