容器化远程开发环境:code-server + SSH + Python 自启动配置
核心目标构建一个包含Python code-server网页版 VS Code SSH的 Docker 镜像通过 docker-compose 实现外部可访问 code-server浏览器和 SSH终端容器内多服务SSH/code-server自启动容器开机自启 数据持久化环境可配置、可扩展。技术选型底层逻辑组件选型理由基础镜像ubuntu:22.04相比 CentOSUbuntu 对 code-server/python 生态兼容性更好包源更新更及时22.04 为 LTS 版本稳定。进程管理supervisordDocker 容器默认仅支持单进程前台运行supervisord 可管理多进程SSHcode-server并实现进程异常重启。端口规划SSH 用容器内 22 端口映射宿主机 2222避免和宿主机 SSH 冲突code-server 用容器内 8080 端口映射宿主机 8080。数据持久化挂载宿主机目录到容器 /workspace确保代码 / 配置不会随容器删除丢失。二、文件结构与逐行解析核心文件1. 完整文件目录结构dev-env/ # 项目根目录 ├── Dockerfile # 镜像构建脚本 ├── supervisord.conf # 多进程自启动配置 ├── docker-compose.yml # 容器编排配置 └── workspace/ # 代码持久化目录自动创建2. Dockerfile 逐行深度解析# 基础镜像选择Ubuntu 22.04 LTS长期支持版稳定 FROM ubuntu:22.04 # 维护者信息可选便于镜像管理 MAINTAINER dev devexample.com # 环境变量配置 # 1. DEBIAN_FRONTENDnoninteractive禁用Ubuntu安装时的交互提示如时区选择 # 2. CODE_SERVER_PASSWORDcode-server访问密码默认值可被docker-compose覆盖 # 3. SSH_PASSWORDSSH登录root密码默认值可被docker-compose覆盖 ENV DEBIAN_FRONTENDnoninteractive ENV CODE_SERVER_PASSWORD123456 ENV SSH_PASSWORD123456 # 安装系统依赖 # - openssh-serverSSH服务核心包 # - python3/python3-pipPython环境Ubuntu22.04默认python3.10 # - wget下载code-server安装脚本 # - supervisor多进程管理工具 # rm -rf /var/lib/apt/lists/*清理apt缓存减小镜像体积 RUN apt update apt install -y \ openssh-server \ python3 \ python3-pip \ wget \ supervisor \ rm -rf /var/lib/apt/lists/* # 安装code-server # 1. 下载官方安装脚本到/tmp目录 # 2. 赋予执行权限 # 3. --methodstandalone独立安装不依赖系统包管理器--prefix/usr/local安装到系统目录方便全局调用 RUN wget https://code-server.dev/install.sh -O /tmp/install.sh \ chmod x /tmp/install.sh \ /tmp/install.sh --methodstandalone --prefix/usr/local # 配置SSH服务 # 1. mkdir -p /var/run/sshd创建SSH运行时目录SSHD启动必需 # 2. echo root:${SSH_PASSWORD} | chpasswd设置root用户密码读取环境变量 # 3. sed修改sshd_config允许root通过SSH登录默认禁止关闭DNS解析加速SSH连接 RUN mkdir -p /var/run/sshd \ echo root:${SSH_PASSWORD} | chpasswd \ sed -i s/#PermitRootLogin prohibit-password/PermitRootLogin yes/ /etc/ssh/sshd_config \ sed -i s/#UseDNS yes/UseDNS no/ /etc/ssh/sshd_config # 配置supervisord # 1. 创建supervisord配置目录 # 2. 拷贝宿主机的supervisord.conf到容器指定目录后续编写该文件 RUN mkdir -p /etc/supervisor/conf.d COPY supervisord.conf /etc/supervisor/supervisord.conf # 暴露端口 # - 22容器内SSH端口 # - 8080容器内code-server端口 # 注仅声明端口实际映射需在docker-compose中配置 EXPOSE 22 8080 # 容器启动命令 # 启动supervisord加载指定配置文件前台运行适配Docker容器运行规则 CMD [/usr/bin/supervisord, -c, /etc/supervisor/supervisord.conf]3. supervisord.conf 多进程管理核心# [supervisord]主进程配置 [supervisord] nodaemontrue # 关键禁止supervisord后台运行Docker容器要求前台进程否则容器会退出 logfile/var/log/supervisord.log # 主日志文件路径 pidfile/var/run/supervisord.pid # 进程PID文件路径 # [program:sshd]SSH服务子进程配置 [program:sshd] command/usr/sbin/sshd -D # 启动SSH-D前台运行适配supervisord autostarttrue # 容器启动时自动启动SSH autorestarttrue # SSH进程异常退出时自动重启 stdout_logfile/var/log/sshd.log # SSH标准输出日志 stderr_logfile/var/log/sshd.err # SSH错误输出日志 # [program:code-server]code-server服务子进程配置 [program:code-server] # 启动命令 # --bind-addr 0.0.0.0:8080绑定到容器所有IP的8080端口允许外部访问 # --auth password密码认证模式 # --password ${CODE_SERVER_PASSWORD}认证密码读取环境变量 # /workspacecode-server默认工作目录后续挂载到宿主机 commandcode-server --bind-addr 0.0.0.0:8080 --auth password --password ${CODE_SERVER_PASSWORD} /workspace autostarttrue # 容器启动时自动启动code-server autorestarttrue # code-server异常退出时自动重启 stdout_logfile/var/log/code-server.log # code-server标准输出日志 stderr_logfile/var/log/code-server.err # code-server错误输出日志 userroot # 以root用户运行避免权限问题 directory/workspace # 工作目录 priority10 # 启动优先级数字越小越先启动这里SSH优先4. docker-compose.yml 逐行解析容器编排核心# docker-compose版本3.8适配Docker 19.03兼容性好 version: 3.8 # 服务定义 services: # 服务名dev-env自定义 dev-env: # 构建配置基于当前目录的Dockerfile构建镜像 build: . # 镜像标签构建后镜像名为dev-env:python-code-ssh便于识别 image: dev-env:python-code-ssh # 容器名dev-env自定义便于管理 container_name: dev-env # 端口映射 # - 宿主机2222端口 → 容器22端口SSH # - 宿主机8080端口 → 容器8080端口code-server ports: - 2222:22 - 8080:8080 # 数据卷挂载 # 宿主机./workspace目录 → 容器/workspace目录代码持久化 # 注./workspace相对路径对应docker-compose.yml所在目录 volumes: - ./workspace:/workspace # 重启策略 # always无论容器正常退出/异常退出都自动重启宿主机开机时也会自动启动容器 restart: always # 特权模式解决SSH/端口绑定等权限问题生产环境可按需关闭仅开发环境推荐 privileged: true # 环境变量覆盖 # 替换Dockerfile中的默认密码更安全避免硬编码 environment: - CODE_SERVER_PASSWORDmycode123 # 自定义code-server密码 - SSH_PASSWORDmyssh123 # 自定义SSH密码三、完整操作步骤步骤 1准备工作宿主机环境确保宿主机已安装 Docker 和 docker-compose# 安装DockerUbuntu/CentOS通用脚本 curl -fsSL https://get.docker.com | bash -s docker # 安装docker-compose curl -L https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose # 验证安装 docker --version docker-compose --version步骤 2创建项目目录与文件# 创建项目根目录 mkdir -p ~/dev-env cd ~/dev-env # 创建空文件后续粘贴内容 touch Dockerfile supervisord.conf docker-compose.yml # 创建代码持久化目录 mkdir -p workspace步骤 3编写文件内容将上述 Dockerfile、supervisord.conf、docker-compose.yml 的内容分别粘贴到对应文件中可通过 vim/vi 编辑。步骤 4构建并启动容器# 进入项目目录 cd ~/dev-env # 构建镜像 启动容器-d后台运行--build强制重新构建镜像 docker-compose up -d --build # 查看容器状态确认Up状态 docker-compose ps # 或 docker ps | grep dev-env✅ 成功标志输出中dev-env容器状态为Up。步骤 5多维度验证服务可用性验证 1访问 code-server浏览器打开浏览器输入http://宿主机IP:8080如http://192.168.1.100:8080输入 docker-compose.yml 中配置的CODE_SERVER_PASSWORD示例mycode123✅ 成功标志进入 VS Code 网页版左侧文件管理器显示/workspace目录和宿主机~/dev-env/workspace同步。验证 2SSH 连接容器# 宿主机/其他机器执行替换为你的宿主机IP ssh root192.168.1.100 -p 2222输入 docker-compose.yml 中配置的SSH_PASSWORD示例myssh123✅ 成功标志登录到容器终端执行以下命令验证环境# 验证Python python3 --version # 输出Python 3.10.x pip3 --version # 输出pip版本 # 验证code-server code-server --version # 输出code-server版本 # 验证SSH进程 ps aux | grep sshd # 输出sshd进程验证 3自启动功能# 手动重启容器 docker restart dev-env # 查看容器内进程确认SSH/code-server都在运行 docker exec dev-env ps aux # ✅ 成功标志输出包含sshd、code-server、supervisord进程 # 验证开机自启可选 reboot # 重启宿主机 # 重启后执行 docker ps | grep dev-env # ✅ 成功标志容器状态为Up验证 4数据持久化在 code-server 中创建文件/workspace/test.py写入print(Hello Docker!)宿主机查看~/dev-env/workspace/test.py✅ 成功标志文件存在且内容一致停止并删除容器docker stop dev-env docker rm dev-env重新启动容器docker-compose up -d✅ 成功标志~/dev-env/workspace/test.py文件仍存在code-server 中可正常查看 / 编辑。四、进阶配置与优化1. SSH 密钥登录替代密码更安全# 宿主机生成SSH密钥无密码回车 ssh-keygen -t rsa -b 4096 -f ~/.ssh/dev-env-key # 将公钥拷贝到容器先启动容器 docker cp ~/.ssh/dev-env-key.pub dev-env:/root/.ssh/authorized_keys # 进入容器配置权限关键SSH对权限要求严格 docker exec -it dev-env /bin/bash chmod 700 /root/.ssh chmod 600 /root/.ssh/authorized_keys sed -i s/PasswordAuthentication yes/PasswordAuthentication no/ /etc/ssh/sshd_config service ssh restart # 宿主机用密钥登录 ssh root宿主机IP -p 2222 -i ~/.ssh/dev-env-key2. 扩展 Python 依赖预装常用包修改 Dockerfile在安装 python3-pip 后添加# 预装常用Python包如numpy/pandas/flask RUN pip3 install numpy pandas flask -i https://pypi.tuna.tsinghua.edu.cn/simple-i指定清华源加速安装3. 自定义 code-server 配置如插件自动安装在 docker-compose.yml 的 volumes 中添加volumes: - ./workspace:/workspace - ./code-server-config:/root/.config/code-server # 挂载code-server配置目录宿主机./code-server-config/extensions目录放入插件包容器启动后自动加载./code-server-config/config.yaml可自定义 code-server 配置。4. 端口冲突解决若宿主机 8080/2222 端口被占用修改 docker-compose.yml 的 portsports: - 2223:22 # 宿主机2223→容器22 - 8081:8080 # 宿主机8081→容器8080五、常见问题排查问题现象排查方案code-server 无法访问1. 检查容器状态docker ps2. 检查端口映射netstat -tulpngrep 80803. 查看日志docker logs dev-env --tail 100SSH 登录失败1. 检查密码是否正确2. 检查容器 22 端口是否映射docker port dev-env3. 进入容器查看 SSHD 日志cat /var/log/sshd.err容器启动后立即退出1. 查看 supervisord 日志docker exec dev-env cat /var/log/supervisord.log2. 确认 supervisord.conf 中nodaemontrue数据持久化失效检查 volumes 配置docker inspect dev-envgrep Mounts确认宿主机目录正确挂载总结核心逻辑通过supervisord解决 Docker 单进程限制实现 SSHcode-server 自启动通过 docker-compose 的restart: always实现容器开机自启通过 volume 挂载实现数据持久化。访问方式code-server浏览器http://宿主机IP:8080密码认证SSHssh root宿主机IP -p 2222密码 / 密钥认证。扩展性可通过修改 Dockerfile 预装 Python 依赖通过 volume 挂载自定义 code-server 配置适配不同开发场景。安全性生产环境建议禁用 root 密码登录改用 SSH 密钥修改默认端口和密码避免弱口令。完整覆盖了「镜像构建→容器编排→服务验证→进阶优化→问题排查」全流程可直接落地为生产 / 开发用的 Docker 虚拟环境。