Container Desktop

文档

English · Polski · 简体中文

Docker Compose

Container Desktop 在 Apple 的 container CLI 之上运行 docker-compose.yml 定义的 stack —— 而该 CLI 本身并不支持 compose。应用会解析你的 YAML,并把每个服务翻译成普通的 container run 调用:没有额外的守护进程,也没有隐藏状态。通过 容器 → Compose… 打开,粘贴 YAML 然后点击运行。

对于每个项目,应用会:

支持的服务键

说明
image必填。不支持 build: —— 请指向一个现成的镜像。
container_name覆盖默认的 <项目>-<服务> 名称。
command / entrypoint字符串或列表。多段 entrypoint(例如 ["dotnet", "dbmgr.dll"])会被正确翻译。
environment支持映射和列表两种写法。
ports短语法("8080:80",可加 /udp)和长语法。
volumes源:目标[:ro];命名卷必须已经存在。
mem_limit / cpus虚拟机资源限制(也支持 deploy.resources.limits)。默认为 1 GB —— 吃内存的初始化任务(例如数据库初始化)通常需要 mem_limit: 4g
depends_on列表或映射(除 service_started 之外的条件会被忽略并给出警告)。
x-initContainer Desktop 的扩展 —— 参见 x-init 任务

host.containers.internal

environment 的值或 command 中的任意位置使用主机名 host.containers.internal,即可从容器内部访问 你的 Mac(相当于 Docker 的 host.docker.internal)。

environment:
  DB_SERVER: "host.containers.internal,1433"   # 运行在宿主机上的 SQL Server

为什么用别名而不是 IP:每个 compose 项目都会得到 自己的 vmnet 网络和 自己的 子网,因此宿主机网关地址在不同项目间各不相同,甚至会在重启 container 服务后变化(例如 192.168.64.1192.168.65.1)。应用会在创建项目网络后立即 inspect 它,并把别名替换为真实的网关 IP —— 该映射会打印在进度日志中。

宿主机上的服务必须监听所有网络接口(0.0.0.0),而不是只监听 127.0.0.1,否则无法从 vmnet 子网访问。其他 Container Desktop 项目、或宿主机上 Docker Desktop 发布的端口,也可以用同样的方式访问。

服务主机名(/etc/hosts 互写)

服务之间通过 容器名 互相访问 —— 例如在默认命名下,项目 shop 中的服务 server 就是 shop-server

environment:
  API_URL: "http://shop-server:22000"

container 1.0.0 自带一个用于容器名的 DNS 解析器,但它从来匹配不上:注册名称时不带 FQDN 结尾的点,而 DNS 查询到达时已经被规范化,于是每次查询都以 SERVFAIL 失败。Container Desktop 绕开了这一点:每个服务启动后,应用会读取它的 IP,并在项目内所有服务之间互相写入 /etc/hosts 条目(进度日志会显示每一条映射)。

这些条目写在容器内部,因此只在容器被 重新创建 之前有效。如果你手动停止再启动某个容器、而它的 IP 变了,请用"替换已有容器"重新运行 compose 以刷新这些条目。

x-init 任务

给某个服务加上 x-init: true,它就会作为 一次性初始化任务 运行 —— 例如用同一个镜像、但不同的 entrypoint 来创建数据库。初始化任务会 先于 所有常规服务、按顺序执行到结束;只有当每个初始化任务都成功退出后,常规服务才会启动。

services:
  dbinit:
    image: registry.example.com/server:1.0
    x-init: true
    entrypoint: ["dotnet", "dbmgr.dll"]
    command: create mydb --sqlserver "host.containers.internal,1433" --recreate

  server:
    image: registry.example.com/server:1.0
    # 只有在 dbinit 以退出码 0 结束后才启动

限制

故障排查

← Container Desktop · GitHub · MIT