前言:
之前写了一篇 使用docker打包必知必会 ,经过一段时间的使用,需要补充一些关键信息。因为一些人工智能的环境搭建起来是比较费时的,有时候服务器的环境不能直接升级,还不如直接用镜像,就在镜像里面配置。这就又涉及到一些trick。
本文追加的主要内容:
docker代理设置
docker安装和配置
dockerdigest拉取和tag拉取
重温:因为docker是一个进程级的虚拟机; 他的实现依赖Linux的namespace,cgroup 和 unionFS的三大技术,分别实现容器的环境隔离、资源控制和镜像打包。 而mac上并没有上面三个依赖库!所以mac上的docker实际是启动了一个Linux虚拟机,这就是docker在mac上运行性能会有很大的折扣原因,因为他不是真正的进程级,所以mac上的docker来跑SLAM模拟,性能非常差。
重温:配置文件位置:
Linux配置文件 /etc/docker/daemon.json
mac配置文件~/.docker/daemon.json
windows可以直接用docker desktop进行配置。
以上位置如果没有,可以新建。
唯一要注意的原则是:json格式里,列表的最后一个元素不要加逗号。
docker补充问题:
内网环境是否可以离线安装?
可以,但是不建议。
如果是Mac系统,稍微简单一些,需要去docker官网安装软件,不要尝试brew 方法。如果是Linu系统,可以参考:
https://docs.docker.com/desktop/setup/install/linux/ubuntu/
依赖较多,可以用dpkg查询,具体命令请参考DS。
以ubuntu为例,提前安装gnome-terminal, docker-ce, docker-ce-cli ,containerd.io, docker-buildx-plugin, docker-compose-plugin
等。这些库也有依赖,所以要循环执行。
安装Docker Desktop 还是Docker Engine?
这要看你的物理机的操作系统是什么。对于Mac来说,这不是问题,直接选择前者。如果是Linux的桌面版,也选择前者,而在无GUI 的服务器上,Docker Engine 是正确且唯一的选择。它提供了完整的容器运行时能力,轻量且稳定,完全符合服务器运维的需求。以下是对比:

配置文件错了,服务器起不来
直接把原来的配置文件改名,然后用文件流操作<<重新写一份最简单的配置。
sudo vim /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.xuanyuan.me"
]
}
EOF
然后重启
systemctl daemon-reload
systemctl restart docker
Mac系统要用launchctl load /unload / list
目标是:
application.com.docker.docker
然后在逐个增加配置。
arm架构的机器,想拉取amd64架构的镜像,用tag只能拉取到arm的镜像,怎么办?
这就涉及到digest和tag的区别,tag只是一个指针,得用哈希值digest方式:
以Opencode release页面解释:

按照上面的命令,就可以拉取了
docker pull ghcr.io/anomalyco/opencode:1.1.50@sha256:a0f6713f0a1d197b8200be5f468d2236915e7823471ce413a514b2e867fe9344
另一种方法:
命令行增加--platform linux/amd64
下载了不同于当前机器架构的镜像,无法通过docker images看到
这是前一个问题的后续。也有解决方法。
方法一:进入Docker Desktop 即可

方法二:-a 参数 docker images -a

重新docker tag即可。
因为代理设置不当,无法拉取镜像:
如果确认网络是通畅的,但报告无法连接,且连接的地址或端口明显不是官网的仓库地址,大概率是配置代理了。
按照系统代理,终端代理,应用代理进行检查:
1 系统代理:设置- 网络 - 代理,是否配置了自动配置代理。
2 终端代理: echo $http_proxy; echo $https_proxy;
3 应用代理:

基础镜像已经有Entrypoint ,怎么办?
docker的逻辑是:如果后续指定了cmd,entrypoint和cmd会拼接在一起,再执行。
基础镜像如果设置了前者,后者CMD会被拼接执行,这往往不是我们想要的。
比如opencode的官方镜像 ,就配置了 “opencode”,这样验证的时候,只会输出opencode 的命令帮助,然后退出了。
1命令行覆盖入口 或 直接追加命令覆盖cmd
docker启动的时候使用 --entrypoint <命令>,
或
docker run your_image_name echo "Hello, Docker!"
2.使用 docker-compose.yml 文件配置
在docker-compose.yml 文件中,可以通过 entrypoint 和 command 字段来覆盖 Dockerfile 中的定义。
所以对于opencode基础镜像,建议在Dockerfile里面的CMD,把需要的选项增加上去。
注意,空格分割的参数,需要独立
如
CMD ["--port", "4096"]可用
而
CMD ["--port 4096"]则报错
机器是arm架构的,能运行amd64的镜像,并且打制镜像嘛?
这个要实际测试:
运行:docker run 运行强加--platform linux/amd64。
打制:除了上面命令,还要设定远程仓库。这在公网环境是可以的,在离线环境,就必须要搭建一个私有harbor仓库了。具体请搜索DS(DeepSeek)。
最好还是你需要什么架构的镜像,就去对应的架构机器上去打制镜像,因为有的情况下,不同的架构的镜像tag是一样的,是通过digest来区分的,后续还是会有各种麻烦。
增加一个普通账号account 到docker组
新建组:groupadd docker
添加用户:usermod-aG docker account
此时,还需要重启docker后台服务,才可以让account 有权限,也有资料说退出再重新登陆。但经过实验,还是要重启服务。用新账号执行下面命令,看是否成功:
docker info
需要重启docker服务,但不能影响已有容器运行
把某个账号加入到docker组,需要重启服务,但又不想中断已有的容器服务。
修改daemon.json
增加 live-restore:true
然后
systemctl restart docker
夜雨聆风