如何在 code-server 容器内挂载 docker.sock 访问宿主机 Docker 守护进程?
2026/9/10 17:24:44 网站建设 项目流程

如何在 code-server 容器内挂载 docker.sock 访问宿主机 Docker 守护进程?

【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server

如果你用容器方式部署了 code-server,希望在浏览器 IDE 的终端里直接调用宿主机上的 Docker 命令(比如构建、查看宿主机上的容器),就需要把宿主机的 Docker socket 挂载进 code-server 容器,并在容器内装好 Docker CLI。官方 FAQ 给出的路径是:从/var/run/docker.sock挂载 Docker socket,然后在 code-server 容器内安装 Docker CLI,之后就可以访问宿主机守护进程。本文基于 docs/FAQ.md 与 docs/install.md 的 Docker 部署方式,给出这条操作的完整步骤,以及 Helm 部署到 Kubernetes 时的替代配置。

适用前提

  • 宿主机上已有一个运行中的 Docker 守护进程,并且当前用户有权限访问/var/run/docker.sock
  • code-server 以容器方式运行。官方镜像为codercom/code-server,基于debian:13(见 Dockerfile),镜像默认只安装了curlgitvim-tiny等工具,没有预装 Docker CLI,所以装 CLI 是必做步骤。
  • 镜像中coder用户(UID 1000)配置了免密sudo(Dockerfile 中写入了coder ALL=(ALL) NOPASSWD:ALL),容器内执行apt-get时需要sudo

启动容器时挂载宿主机 docker.sock

docs/install.md 的 Docker 章节给出的标准启动命令如下。在它的基础上增加一行-v /var/run/docker.sock:/var/run/docker.sock,即实现 FAQ 所说的 “mount the Docker socket in from/var/run/docker.sock”:

mkdir -p ~/.config docker run -it --name code-server -p 127.0.0.1:8080:8080 \ -v "$HOME/.local:/home/coder/.local" \ -v "$HOME/.config:/home/coder/.config" \ -v "$PWD:/home/coder/project" \ -v /var/run/docker.sock:/var/run/docker.sock \ -u "$(id -u):$(id -g)" \ -e "DOCKER_USER=$USER" \ codercom/code-server:latest

其中-v /var/run/docker.sock:/var/run/docker.sock是唯一相对官方示例新增的参数,作用是把宿主机 socket 以同路径暴露给容器,容器内的 Docker CLI 通过它直连宿主机守护进程。其余挂载、UID/GID 透传均保留官方命令原样。

注意一个副作用前提:挂载 docker.sock 意味着容器内对 Docker 的所有操作实际作用于宿主机守护进程,能启动、停止宿主机上的任何容器,因此这只应在受信任的部署环境里做。

在容器内安装 Docker CLI

进入已启动的容器(容器名沿用上面的code-server):

docker exec -it code-server /bin/sh

然后安装 Docker CLI。包名docker.io取自仓库 Helm chart 中在容器内装 Docker 的示例命令(values.yaml 的lifecycle.postStart示例):

sudo apt-get update && sudo apt-get install -y docker.io

这一步的影响范围只在 code-server 容器自身的文件系统里,不会改动宿主机上的任何包。

验证是否接上了宿主机守护进程

FAQ 给出的成功标准是:安装完 Docker CLI 后 “you should be able to access the daemon”。在容器内执行一条 Docker 命令即可核对,例如:

docker ps

如果命令能连通守护进程并列出宿主机上运行的容器,说明 CLI 已经通过挂载的docker.sock与宿主机守护进程通信,而不是连接容器内不存在的本地 daemon。

宿主机目录挂载的路径对应规则

FAQ 同时说明了容器内跑 Docker 时的卷挂载限制:当你想从 code-server 容器里运行一个容器、把目录挂载进容器的/home/coder/myproject时,必须保证宿主机 Docker 守护进程所见的/home/coder/myproject与挂载进 code-server 容器的那个目录是同一个路径,挂载才能生效。也就是说,凡是 code-server 容器内以宿主机路径身份被 Docker 二次挂载的目录,两侧路径要一致。

可选分支:用 Helm 部署到 Kubernetes 时

FAQ 指出,如果在 Kubernetes 上部署并希望启用 Docker,应查看 Helm chart 的values.yaml(ci/helm-chart/values.yaml)中的三个字段:extraVarslifecycle.postStartextraContainers。需要说明的是,chart 里的示例走的是 docker-dind 路线(在 Pod 内再跑一个独立 daemon),与本文挂载宿主机 socket 的方式是两条不同路径,它需要设置DOCKER_HOST环境变量:

# if dind is desired: extraVars: - name: DOCKER_HOST value: "tcp://localhost:2376" lifecycle: enabled: true postStart: exec: command: - /bin/sh - -c - | sudo apt-get update \ && sudo apt-get install -y docker.io extraContainers: | - name: docker-dind image: docker:28.3.2-dind imagePullPolicy: IfNotPresent resources: requests: cpu: 1 ephemeral-storage: "50Gi" memory: 10Gi securityContext: privileged: true procMount: Default env: - name: DOCKER_TLS_CERTDIR value: "" # disable TLS setup command: - dockerd - --host=unix:///var/run/docker.sock - --host=tcp://0.0.0.0:2376

以上条目取自values.yaml中注释掉的 dind 示例。注意 dind 容器要求privileged: true,且按 chart 注释,使用 dind 时DOCKER_HOST是必填项。Helm 本身的安装方式见 docs/helm.md:helm upgrade --install code-server ci/helm-chart。如果你的目标只是让 Pod 使用节点上已有的 Docker socket,则不适用这套 dind 配置,应直接给 Pod 添加 socket 挂载(chart 提供了extraVolumeMounts等扩展挂载字段,但 socket 挂载的具体内容需按集群实际情况配置)。

小结

普通 Docker 部署的最短路径就是:启动命令加一行 socket 挂载,容器内sudo apt-get install -y docker.io,再用docker ps确认能列出宿主机容器。Kubernetes 上则通过extraVars/lifecycle.postStart/extraContainers三个字段启用 Docker,chart 现有示例面向 dind,需要特权容器与DOCKER_HOST设置。

【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询