前提与目标

在本地机器(Linux/macOS/Windows 支持 Docker)使用 Docker 部署 code-server(通过浏览器访问的 VS Code Web),并配置常用插件、持久化数据、HTTPS(可选)、反向代理、以及示例 docker-compose 部署,目标是在局域网或互联网的 Android 平板/其他设备上通过浏览器访问并开发。

下面给出一步步可复制的完整手册;按默认合理选项:使用 coder/code-server 官方镜像、通过 docker-compose 管理、在主机上持久化配置与工作目录,并演示使用 Nginx + Let's Encrypt(certbot)做 HTTPS 反向代理的可选配置。


目录

  1. 先决条件
  2. 目录与文件结构
  3. 快速单容器运行(命令行)
  4. 推荐的 docker-compose 部署(持久化、环境变量、端口、用户映射)
  5. 配置 code-server(密码、bind、cert)
  6. 安装扩展(命令行/启动时)
  7. 持久化数据与权限问题
  8. 使用 Nginx 反向代理 + Let's Encrypt(HTTPS)
  9. 使用 Cloudflare Tunnel 替代反代(可选)
  10. 安全建议与防火墙
  11. 日常运维命令
  12. 故障排查要点

1) 先决条件

  • 已安装 Docker Engine 与 docker-compose(或 Docker Compose V2)。
  • 有可用域名(HTTPS 情形可选,非必须)。
  • 如果仅局域网访问,只需确保主机 IP 在同一网络且防火墙放行相应端口。
  • 今天日期: 2026-05-21。

2) 目录与文件结构(示例)

在主机上创建一个目录用于部署,例如 /opt/code-server:
/opt/code-server

  • docker-compose.yml
  • data/ # code-server 持久化配置与 extensions
    • config.yaml
  • projects/ # 工作目录(你的代码)
  • nginx/ # 反向代理(可选)
    • conf.d/
    • Dockerfile (可选)

3) 快速单容器运行(最快上手)

在终端执行(将 /opt/code-server/projects 挂载为工作目录):
docker run -d
--name code-server
-p 8080:8080
-v /opt/code-server/data:/home/coder/.local/share/code-server
-v /opt/code-server/projects:/home/coder/project
-e PUID=(idu)ePGID=(id -u) -e PGID=(id -g)
-e PASSWORD="YourStrongPassword123"
coder/code-server:latest

解释:

  • -p 8080:8080:在主机映射端口为 8080。
  • data 卷保存配置与已安装扩展(持久化)。
  • projects 卷为工作目录,在 code-server 中显示为 /home/coder/project。
  • PASSWORD 环境变量设置访问密码(auth: password)。

访问:在浏览器打开 http://<HOST_IP>:8080,输入密码登录。


4) 推荐的 docker-compose 部署(生产/长期使用)

在 /opt/code-server 创建 docker-compose.yml,示例:

version: "3.8"
services:
  code-server:
    image: coder/code-server:latest
    container_name: code-server
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080" # 推荐先只绑定本地回环,配合反代或隧道
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - PASSWORD=YourStrongPassword123
      - SUDO_PASSWORD= # 可选
    volumes:
      - ./data:/home/coder/.local/share/code-server
      - ./projects:/home/coder/project
      - /etc/localtime:/etc/localtime:ro

要全网/局域网直接访问把 ports 改为 "8080:8080" 或 "0.0.0.0:8080:8080"。建议初始阶段绑定 127.0.0.1 并通过反向代理或隧道公开。

启动:
cd /opt/code-server
docker-compose up -d

查看日志:
docker-compose logs -f code-server


5) 配置 code-server(config.yaml)

持久化配置文件位置(容器内)通常在 /home/coder/.config/code-server/config.yaml,但官方镜像把配置写在 ~/.local/share/code-server 或 ~/.config。我们在宿主机 data 文件夹创建配置覆盖默认:

创建 data/config.yaml(示例):
bind-addr: 0.0.0.0:8080 # 或 127.0.0.1:8080(若使用反代)
auth: password
password: YourStrongPassword123
cert: false # 若使用反代或 cloudflared,设为 false;若想让 code-server 自带 TLS,提供 cert 文件并设为 true

如果你用 docker-compose 的环境变量 PASSWORD,则 code-server 会优先使用该密码,但保留 config.yaml 可以设置更多项(例如 locale、extensions-dir 等)。

重启容器以使配置生效:
docker-compose restart code-server


6) 安装扩展(两种方式)

A. 在浏览器 GUI 中直接安装:登录 code-server -> Extensions -> 搜索并安装。

B. 在容器启动时通过命令行安装(适合自动化),示例:
docker exec -it code-server code-server --install-extension ms-python.python
或使用 CLI 的 code 命令(镜像内有 code-server 的 code CLI):
docker exec -it code-server /usr/bin/code-server --install-extension ms-python.python

要在 docker-compose 启动时自动安装多个扩展,可用 entrypoint 脚本在容器启动时运行一段安装命令并缓存已安装列表(示例附后)。

示例自动安装脚本(在宿主机 data/install-extensions.sh):
#!/bin/sh
extensions="
ms-python.python
ms-python.vscode-pylance
dbaeumer.vscode-eslint
esbenp.prettier-vscode
eamodio.gitlens
"
for e in extensions;do/usr/bin/codeserverinstallextension"extensions; do /usr/bin/code-server --install-extension "e" || true
done

在 docker-compose 中以 volumes 挂载并在容器命令或 entrypoint 调用该脚本一次性安装。


7) 持久化数据与权限

  • 官方镜像中用户是 coder(uid 1000)。宿主机挂载目录请确保 UID/GID 对应或使用 PUID/PGID 环境变量(官方镜像支持)。
  • 若遇到权限问题,调整宿主目录属主:
    sudo chown -R 1000:1000 ./data ./projects

确保 SELinux 环境(如 CentOS/RHEL)下加上 😒 或 :Z 选项,例如:

  • ./projects:/home/coder/project:Z

8) 使用 Nginx 反向代理 + Let's Encrypt(推荐用于公网与 HTTPS)

思路:将 code-server 绑定到 127.0.0.1:8080,仅在本地可达;Nginx 作为反代监听 80/443,使用 certbot 自动申请 TLS 证书。

示例 docker-compose.yml(包含 nginx 和 certbot):

  • 此处仅给出关键片段,完整文件请创建两个服务: code-server(如上,ports 127.0.0.1:8080:8080)与 nginx(监听 80/443,反代到 code-server:8080),并可用 certbot/certbot 镜像或使用 nginx-proxy + acme companion 等自动化方案。

简单 nginx 配置示例(nginx/conf.d/code-server.conf):
server {
listen 80;
server_name your.domain.example;
location /.well-known/acme-challenge/ { root /var/www/certbot; }
location / {
return 301 https://hosthostrequest_uri;
}
}
server {
listen 443 ssl;
server_name your.domain.example;
ssl_certificate /etc/letsencrypt/live/your.domain.example/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.domain.example/privkey.pem;
location / {
proxy_pass http://code-server:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

申请证书(示例命令在宿主机或 certbot 容器内运行):
sudo certbot certonly --webroot -w /var/www/certbot -d your.domain.example

证书申请成功后,重新加载 nginx:
docker exec nginx_container nginx -s reload

注意:

  • 推荐使用现成的 docker 反代方案:nginx-proxy + jwilder/nginx-proxy + nginx-letsencrypt 或 Traefik(自动 TLS)。Traefik 配置会更简单并能自动获取证书。

9) 使用 Cloudflare Tunnel(cloudflared)替代反代(更简单,免端口转发)

  • 安装 cloudflared 并在宿主机上运行:
    cloudflared tunnel --url http://localhost:8080 --no-autoupdate
  • 或用 Docker 运行 cloudflared,关联到 code-server 服务。
    优点:无需开放端口、自动 HTTPS 与域名映射(需 Cloudflare 账户)。

10) 安全建议

  • 永远启用密码(PASSWORD)或外部 TLS 反向代理;不要将 auth 设置为 none。
  • 将 code-server 绑定到 127.0.0.1 并通过反代或隧道公开,减少直接暴露风险。
  • 使用强密码或 OAuth/OIDC(若使用企业版或额外认证);
  • 定期更新镜像: docker pull coder/code-server:latest 并重建容器。
  • 使用防火墙(ufw/iptables)限制能访问 8080/443 的源 IP(如果可行)。

11) 日常运维命令

  • 启动/停止/重启:
    docker-compose up -d
    docker-compose down
    docker-compose restart code-server

  • 更新镜像并重建:
    docker-compose pull
    docker-compose up -d --force-recreate

  • 查看日志:
    docker-compose logs -f code-server

  • 进入容器调试:
    docker exec -it code-server /bin/sh

  • 列出已安装扩展:
    docker exec -it code-server /usr/bin/code-server --list-extensions


12) 常见问题与排查

  • 无法访问:
    • 检查容器是否运行: docker ps
    • 检查绑定地址(127.0.0.1 vs 0.0.0.0)
    • 检查防火墙与路由器端口转发
  • 权限错误:
    • chown -R 1000:1000 data projects
  • 扩展安装失败:
    • 查看日志,确保网络可达 Marketplace,或使用离线 VSIX 安装: code-server --install-extension /path/to/extension.vsix
  • HTTPS 证书问题:
    • 确认域名解析指向反代服务器、80 端口能被外网访问以完成 ACME 验证。

附:完整示例 docker-compose.yml(code-server + nginx + certbot 简化版)

请按需调整域名、路径与权限;此为示例用于理解组件关系。

version: "3.8"
services:
  code-server:
    image: coder/code-server:latest
    container_name: code-server
    restart: unless-stopped
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - PASSWORD=YourStrongPassword123
    volumes:
      - ./data:/home/coder/.local/share/code-server
      - ./projects:/home/coder/project
    expose:
      - "8080"

  nginx:
    image: nginx:stable
    container_name: code-server-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/www:/var/www/certbot
      - /etc/letsencrypt:/etc/letsencrypt:ro
    depends_on:
      - code-server

  certbot:
    image: certbot/certbot
    container_name: certbot
    volumes:
      - ./nginx/www:/var/www/certbot
      - /etc/letsencrypt:/etc/letsencrypt
    entrypoint: /bin/sh -c 'trap exit TERM; while :; do sleep 12h & wait $${!}; certbot renew; done'

使用流程:

  1. 配置 nginx/conf.d/code-server.conf(见上文)。
  2. 启动: docker-compose up -d
  3. 申请证书(第一次):
    docker run --rm -v "$(pwd)/nginx/www":/var/www/certbot -v /etc/letsencrypt:/etc/letsencrypt certbot/certbot certonly --webroot --webroot-path=/var/www/certbot -d your.domain.example --email you@example.com --agree-tos --no-eff-email
  4. reload nginx。

如需我直接生成你主机(或具体 OS)上的完整 docker-compose.yml、nginx conf、certbot 命令和扩展自动安装脚本(按你的域名与路径替换),或提供只在局域网内无需 HTTPS 的最简配置文件,请告诉我你的偏好(局域网 vs 公网;是否需要自动 TLS;宿主机操作系统);我会给出可直接复制粘贴的文件。