前提与目标
在本地机器(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 反向代理的可选配置。
目录
- 先决条件
- 目录与文件结构
- 快速单容器运行(命令行)
- 推荐的 docker-compose 部署(持久化、环境变量、端口、用户映射)
- 配置 code-server(密码、bind、cert)
- 安装扩展(命令行/启动时)
- 持久化数据与权限问题
- 使用 Nginx 反向代理 + Let's Encrypt(HTTPS)
- 使用 Cloudflare Tunnel 替代反代(可选)
- 安全建议与防火墙
- 日常运维命令
- 故障排查要点
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=(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 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://request_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'
使用流程:
- 配置 nginx/conf.d/code-server.conf(见上文)。
- 启动: docker-compose up -d
- 申请证书(第一次):
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 - reload nginx。
如需我直接生成你主机(或具体 OS)上的完整 docker-compose.yml、nginx conf、certbot 命令和扩展自动安装脚本(按你的域名与路径替换),或提供只在局域网内无需 HTTPS 的最简配置文件,请告诉我你的偏好(局域网 vs 公网;是否需要自动 TLS;宿主机操作系统);我会给出可直接复制粘贴的文件。