记一次mac本地部署docker

背景

最近在倒腾本地docker go环境的部署和相关项目的部署,但是由于镜像源拉取失败,以为是镜像源的问题,就手动去更改了docker engine配置的镜像源,但是事先没有验证新国内镜像源的可连接性,导致docker-desktop重启的时候,一直卡死,这个时候没发现是这个配置的问题,就尝试去清理数据,清理镜像和容器,恢复默认配置,甚至通过命令彻底删除一些文件,但是还是重启不了,于是就有了这一波蠢自己浪费自己时间的操作。

环境

  • 系统: macos big sur 版本11.7.10
  • docker-desktop版本:v2.24.2

重装docker-desktop

由于直接移除到废纸篓是没办法彻底删除相关文件,而我重装后还是没办法打开,我就只能通过命令去彻底删除相关文件,具体如下:

# 删除所有核心数据文件和配置(请确保已备份重要数据)
rm -rf ~/.docker
rm -rf ~/Library/Containers/com.docker.docker
rm -rf ~/Library/Group\ Containers/group.com.docker
rm -rf ~/Library/Application\ Support/Docker
# 删除所有缓存和首选项文件
rm -rf ~/Library/Caches/com.docker.docker
rm -rf ~/Library/Preferences/com.docker.docker.plist
# 删除所有日志文件
rm -rf ~/Library/Logs/Docker\ Desktop

以上命令都是通过网上搜索而来,本以为这样就可以生效,然而电脑重启,重新安装原来的deocker-desktop,发现直接展示错误弹窗,看来删除命令破坏了软件原有的存储数据目录(这是我猜的),这个时候我只能通过其他方法去彻底删除了,这个时候就找到一个软件 App clearner, 通过它去彻底删除了docker-desktop, 这次生效了,为了保险起见,我还重新下载了一个支持我系统的docker-desktop(旧版本下载链接),重装后docker-desktop果然可以跑起来了,就是啥都都没有了,需要重新配置,重新拉镜像,重跑容器。

docker-desktop打开报错弹窗

重新配置

先重新配置docker国内镜像源,可以直接打开docker-desktop设置,点击docker engine 去修改,也可以通过手动修改文件( ~/.docker/daemon.json),我改成下面配置:

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "debug": true,
  "dns": [
    "8.8.8.8",
    "233.5.5.5"
  ],
  "experimental": false,
  "registry-mirrors": [
    "https://docker.xuanyuan.me",
    "https://docker.mirrors.ustc.edu.cn",
    "https://***.mirror.aliyuncs.com" //个人阿里云加速镜像,每个人不一样
  ]
}

在配置的过程,我发现了之前重启一直卡死的原因是我换到了一个已废弃的镜像源,本地是链接不上的,但是我还是直接放到了docker engine配置里面,并重启,这个时候我发现又卡死了,docker egine根本启动不起来,导致我又重装了一遍,但是我为了验证猜想,我又重新配上了废弃的镜像源,接着重启,,卡死后我手动退出了docker=desktop, 因为我思考是配置问题,所以我手动去更改了daemon.json文件,删除了废弃的镜像源链接,再次尝试启动,发现真的可以启动啦,这里我发现从一开始应该就是配置问题,才导致我启动卡死,害得我重新安装软件,还得重新生成镜像,这个旧镜像文件命令又让我接下来花费了大量时间去处理,无语!!!。

重新生成镜像

由于上面的一系列操作,我就需要重新去生成镜像,重新生成容器,我的本地项目才能跑起来,不影响我本地开发测试,我本地大部分用php开发,所以大概需要安装环境就是nginx, redis, php各种版本,我整理了我遇到的大概问题:

  1. 基础镜像拉取问题,一般Dockerfile有个from基础镜像,我发现有时候我通过docker build ./`去生成镜像的时候,它在拉取镜像文件这里会卡死,有时候会拉取不成功,这里要确认是镜像不存在还是网络问题,网络问题的话,我建议开启代理,并且最好提前docker pull把镜像文件拉取下来,这样生成新的镜像文件的时候不需要等太久,例如我会先拉取php-fpm:7.3.20版本, 就是`docker pull php-fpm:7.3.20
  2. 基础镜像系统中镜像源的处理,由于这个镜像我需要给里面安装一些常用工具 vim,git, open-ssh等,我的旧镜像文件(Dockerfile) 是通过国内镜像源去加快下载安装速度,但是这次我执行build命令后发现会报错,招不到对应下载包,我尝试了替换各种国内源,但是还是不行,最后解释估计就是国内镜像源的包很多已经废弃掉了,由于我这个基础镜像系统是旧版本(有detain8 也有detain9的),所以最靠谱的还是只能通过官方镜像源:http://archive.debian.org/debian 去安装下载,有代理开起来下载也是挺快的,具体我以安装php-fpm:7.3.20 版本为例:
    # 旧命令,替换为了国内镜像源
    RUN sed -i s@/deb.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && sed -i s@/security.debian.org/@/mirrors.aliyun.com/@g /etc/apt/sources.list \
    && apt-get update --fix-missing && apt-get install -y \
    # 新命令, 记住不同系统版本代号不一样,例如jessie,buster,要根据不一样的系统版本去替换
    RUN set -eux; \
    # 使用 archive.debian.org(支持旧版本 Debian,如 Jessie)
    # 只使用主仓库(jessie-updates 已不存在)
    echo "deb [trusted=yes allow-insecure=yes] http://archive.debian.org/debian buster main" > /etc/apt/sources.list; \
    # 禁用时间戳检查(旧版本仓库需要)
    echo "Acquire::Check-Valid-Until false;" > /etc/apt/apt.conf.d/99no-check-valid-until; \
    # 完全禁用 GPG 验证(归档仓库密钥已过期)
    echo "APT::Get::AllowUnauthenticated \"true\";" > /etc/apt/apt.conf.d/99allow-unauth; \
    echo "Acquire::AllowInsecureRepositories \"true\";" >> /etc/apt/apt.conf.d/99allow-unauth; \
    echo "Acquire::AllowDowngradeToInsecureRepositories \"true\";" >> /etc/apt/apt.conf.d/99allow-unauth; \
    apt-get update -o Acquire::AllowInsecureRepositories=true -o Acquire::AllowDowngradeToInsecureRepositories=true
  3. php-fpm配置问题,启动了容器但是通过9000端口访问不到,一开始是权限问题,我从公司下载下来的基础镜像,它是创建了www用户,但是犹豫配置了慢日志路径(/var/logs/slow.log)不存在,www无法创建该文件,所以启动失败了,竟然是本地开发,可以直接用root用户去启动容器,或者要通过root用户先创建了slow.log文件,再用www用户起动容器。后面成功启动服务了,发现通过nginx服务区转发到php-fpm服务失败了,返回502了,我先优先确认服务是正常启动了,那么就是暴露的端口有问题,通过查看 /usr/local/etc/php-fpm.d/www.conf文件发现端口被改成了7211,而不是9000,这样想访问只能通过暴露7211访问,或者把端口改回9000,这样一解决,就能正常访问了,项目接口也能正常运行处理了。
  4. 容器权限问题研究(这个没深入研究过,一般直接用root去搞就没啥问题,但是生产环境肯定www才安全,这样里面会涉及一些权限问题,会导致你的服务起不来),一般是创建www用户,然后给你的项目目录www权限,以及给www启动服务的权限(例如:RUN groupadd -g 1000 www && useradd -u 1000 -ms /bin/bash -g www www)

总结

  • docker-desktop易卡死,先检查engine配置是否有问题,不急着重装
  • 想要彻底重装通过App Cleaner去清除旧数据会靠谱点,不然容易导致数据存储丢失,重新安装的软件运行不起来
  • 当下自己生成的镜像,最好打个标签存到自己私人库里面,以便后续直接拉取,毕竟你当下Dokerfile的命令,不一定以后还能有效,到时候重新生成就得花时间修改
  • php-fpm服务启动失败,先看权限后看端口

发表评论

电子邮件地址不会被公开。 必填项已用*标注