
如何在 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镜像默认只安装了curl、git、vim-tiny等工具没有预装 Docker CLI所以装 CLI 是必做步骤。镜像中coder用户UID 1000配置了免密sudoDockerfile 中写入了coder ALL(ALL) NOPASSWD:ALL容器内执行apt-get时需要sudo。启动容器时挂载宿主机 docker.sockdocs/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-serverdocker 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.yamlci/helm-chart/values.yaml中的三个字段extraVars、lifecycle.postStart和extraContainers。需要说明的是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 - --hostunix:///var/run/docker.sock - --hosttcp://0.0.0.0:2376以上条目取自values.yaml中注释掉的 dind 示例。注意 dind 容器要求privileged: true且按 chart 注释使用 dind 时DOCKER_HOST是必填项。Helm 本身的安装方式见 docs/helm.mdhelm 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三个字段启用 Dockerchart 现有示例面向 dind需要特权容器与DOCKER_HOST设置。【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考