尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Zulip 开发环境 Docker 安装与配置实战指南(Vagrant Docker Provider 篇)

Zulip 开发环境 Docker 安装与配置实战指南(Vagrant Docker Provider 篇) Zulip 开发环境 Docker 安装与配置实战指南Vagrant Docker Provider 篇【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulipZulip 是开源的团队协作聊天服务器其开发环境的推荐安装方式在 macOS 与 Linux 上使用 Vagrant Docker 方案由 Vagrant 驱动 Docker 构建一个 Ubuntu 容器将克隆下来的 Zulip 源码目录挂载进容器再在容器内完成依赖安装与初始化。本篇指南以仓库中的 install-docker.md 为核心系统讲解安装 Docker 后必须完成的用户组配置、守护进程daemon启动校验等关键步骤并结合仓库内的 Vagrantfile、dev-vagrant-docker/Dockerfile 等源码带你完整跑通安装 Docker → 配置权限 → 启动开发环境 → 验证服务的整条链路。一、文档定位install-docker.md 在整个搭建流程中的角色install-docker.md 并不是一份独立的完整教程而是 Zulip 官方推荐安装教程 setup-recommended.md 中被{include}指令嵌入的公共片段。在 setup-recommended.md 中Ubuntu/Debian、Fedora、Arch 三个平台的安装步骤都以{include} setup/install-docker.md 的方式引用该文档macOS 平台则要求安装最新版 Docker Desktop。也就是说这份文档解决的是 Docker 安装完成之后、vagrant up --providerdocker之前的前置配置问题包含三个核心动作创建docker用户组并将当前用户加入其中从而免 sudo 直接使用 Docker 命令校验 Docker 守护进程daemon处于运行状态若 daemon 未运行则完成启用与启动。这三个动作是 Zulip 基于 Docker 的 Vagrant 开发环境能否成功拉起的前提任何一步遗漏都会导致后续vagrant up阶段连接容器或执行命令失败。二、安装 Docker 与 Git各发行版差异一览在进入 install-docker.md 的配置步骤之前需要先在各平台完成 Docker 与 Git 的安装。依据 setup-recommended.md不同系统的安装命令如下平台安装命令说明Ubuntu / Debiansudo apt install docker.io git使用发行版自带的docker.io软件包Fedorasudo yum install vagrant git moby-engineFedora 官方仓库不提供docker-ce改用等价的moby-engine包Arch Linuxsudo pacman -S --needed docker gitDocker 与 Git 来自官方仓库Vagrant 需从 AUR如yay -S vagrant安装macOS安装最新版 Docker Desktop文档特别提示若被迫使用旧版 Docker Desktop需在设置中取消勾选 Use gRPC FUSE for file sharing改回osxfs (legacy)文件共享方式再尝试 provisioningUbuntu 的一个已知坑如果你之前安装并移除过旧版 DockerUbuntu 的一个已知 bug 可能导致 Docker 安装后不会自动启用与启动见 setup-recommended.md 的相关描述。此时就需要按下文第三节第 3 步手动启用服务。这正是 install-docker.md 存在的重要原因。三、核心配置三步走docker 组、用户权限与守护进程3.1 为什么需要创建docker组Docker 守护进程默认以 root 身份运行直接执行docker命令需要 root 权限。为避免每次命令都加sudoZulip 开发环境尤其是 Vagrant 通过 Docker provider 构建容器时要求把当前用户加入docker组从而获得通过 Unix socket 与 daemon 通信的权限。3.2 创建docker组并将自己加入其中依次执行以下两条命令install-docker.md$ sudo groupadd docker $ sudo usermod -aG docker $USER修改后必须重新登录log out 后再 log in或重启系统组权限才会生效。生效后可通过以下命令验证输出中应能看到docker出现在组列表中$ groups | grep docker YOURUSERNAME adm cdrom sudo dip plugdev lpadmin sambashare docker从仓库源码看这一步对后续 Docker provider 至关重要Vagrant 构建的开发容器会以与宿主机当前用户相同的 UID 创建名为vagrant的容器内用户见 Dockerfile 中的useradd -ms /bin/bash -u $VAGRANT_UID vagrant并通过共享目录挂载你的 Zulip 克隆。若宿主机用户无法正常调用 Docker整个构建与挂载流程都会中断。3.3 确保 Docker 守护进程正在运行Docker 以后台服务daemon形式运行Docker 命令要正常工作daemon 必须处于运行状态。使用 systemd 检查服务状态install-docker.md$ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-07-15 23:20:46 IST; 18min ago关注第二行Active:的状态。如果显示的是Active: inactive (dead)说明服务没有运行需要依次执行以下三条命令启用并启动服务install-docker.md$ sudo systemctl unmask docker $ sudo systemctl enable docker $ sudo systemctl start dockerunmask解除服务单元可能存在的屏蔽状态部分发行版默认屏蔽 docker 单元enable设置开机自启start立即启动当前会话的服务。在 systemd 被完整启用的 Linux 发行版上执行上述命令后Docker 服务即可正常运行。一个需要特别留意的前提基于容器的 Vagrant Docker provider 本身不依赖 systemd 管理容器但宿主机上的 Docker daemon 必须健康运行Vagrant 才能创建并 SSH 进入开发容器。四、启动 Zulip 开发环境Vagrant Docker 完整流程完成上述配置后进入克隆好的 Zulip 目录并启动环境vagrant-up.md$ cd zulip $ vagrant up --providerdocker4.1 首次运行的完整过程第一次执行该命令耗时较长因为 Vagrant 会依次完成以下工作vagrant-up-details.md下载 Ubuntu 22.04 基础镜像bento/ubuntu-22.04box 或 dev-vagrant-docker 目录中的自定义镜像为 Zulip 配置该容器创建共享目录把宿主机上 Zulip 代码的克隆挂载到容器内的~/zulip在容器内运行./tools/provision脚本下载全部依赖、建立 Zulip 开发服务器的 Python 环境、初始化默认测试数据库。这一过程称为 provisioning。整个过程需要持续稳定的网络连接。若网络不稳定导致 provisioning 中途失败可直接用vagrant provision重试vagrant up在首次成功之后只会启动 guest 而不再执行 provisioning。4.2 仓库源码解读Docker provider 如何构建开发容器Vagrant 配置位于仓库根目录的 Vagrantfile其中 Docker provider 的关键配置段如下# Vagrantfile L73-L82 config.vm.provider docker do |d, override| override.vm.box nil d.build_dir File.join(__dir__, tools, setup, dev-vagrant-docker) d.build_args [--build-arg, VAGRANT_UID#{Process.uid}] if !ubuntu_mirror.empty? d.build_args [--build-arg, UBUNTU_MIRROR#{ubuntu_mirror}] end d.has_ssh true d.create_args [--ulimit, nofile1024:65536] end要点解读build_dir指向 tools/setup/dev-vagrant-docker 目录Vagrant 会依据其中的 Dockerfile 现场构建镜像VAGRANT_UID把宿主机当前用户的 UID 传入构建过程容器内vagrant用户与宿主机用户 UID 一致保证共享目录的读写权限正确has_ssh true表示容器内置 SSH 服务Dockerfile 中EXPOSE 22Vagrant 通过vagrant ssh进入容器--ulimit nofile1024:65536放宽容器内文件描述符限制避免高并发开发场景下触发资源瓶颈。Dockerfile 本身也很有看点基础镜像为ubuntu:22.04安装了openssh-server、sudo、systemd等基础组件为了在 Docker 中启动 PostgreSQL、Redis 等通常由 systemd 托管的服务镜像引入了docker-systemctl-replacement工具将/bin/systemctl替换为systemctl3.py并对postgresql.service做了 template 单元兼容处理Dockerfile L33-L44。容器启动后Vagrant 执行 tools/setup/vagrant-provision 脚本设置 Ubuntu 镜像源、建立~/zulip软链接指向挂载的源码目录最终调用tools/provision完成依赖安装。4.3 端口转发与开发服务器启动Vagrantfile 定义了宿主机与容器的端口转发关系guest 9991 → host 9991以及 9994、9995 两个辅助端口。vagrant up完成后执行vagrant ssh进入容器再启动开发服务器vagrant-ssh.md$ vagrant ssh (zulip-server) vagrantvagrant:/srv/zulip$ ./tools/run-dev正常启动后终端会输出端口分配信息Starting Zulip on: http://localhost:9991/ Internal ports: 9991: Development server proxy (connect here) 9992: Django 9993: Tornado 9994: webpack各端口用途如下表端口用途9991开发服务器代理入口浏览器访问入口9992Django 后端9993Tornado实时事件推送服务9994webpack 前端构建服务随后在宿主机浏览器打开 http://localhost:9991/devlogin 验证环境是否可用能看到 Zulip 的 devlogin 登录页即说明整套 Docker 化开发环境已成功运行。五、高级配置~/.zulip-vagrant-config个性化定制Vagrantfile 会读取用户主目录下的~/.zulip-vagrant-config配置文件按行解析key value格式的配置项#或;开头的行为注释。支持的全部配置项如下配置键默认值作用HTTP_PROXY无设置 HTTP 代理地址需配合vagrant-proxyconf插件使用HTTPS_PROXY无设置 HTTPS 代理地址需配合vagrant-proxyconf插件使用NO_PROXY无不走代理的地址白名单如localhost,127.0.0.1,.example.com,.zulipdev.comHOST_PORT9991宿主机映射端口修改后通过http://localhost:HOST_PORT/访问开发服务器HOST_IP_ADDR127.0.0.1宿主机监听 IP设为0.0.0.0可让其他机器连接开发环境GUEST_CPUS2guest 分配的 CPU 核数仅对 VirtualBox/VMware 等 VM provider 生效GUEST_MEMORY_MB2048guest 分配的内存 MB 数同上容器 provider 下忽略UBUNTU_MIRROR全局镜像指定 Ubuntu 镜像源可加速首次下载VBOXADD_VERSION无指定 VirtualBox Guest Additions 版本5.1 使用代理网络需要代理访问互联网时先安装插件再写入配置$ vagrant plugin install vagrant-proxyconfHTTP_PROXY http://proxy_host:port HTTPS_PROXY http://proxy_host:port NO_PROXY localhost,127.0.0.1,.example.com,.zulipdev.com需要认证的代理写法HTTP_PROXY http://userName:userPassword192.168.1.1:8080 HTTPS_PROXY http://userName:userPassword192.168.1.1:8080 NO_PROXY localhost,127.0.0.1,.example.com,.zulipdev.com注意代理配置写错常见错误是把http://误写成https://会引发难以排查的异常。如果配置了代理且出现报错应首先核对代理配置。不再需要代理时删除配置文件中HTTP_PROXY、HTTPS_PROXY两行并执行vagrant reload即可。若之前vagrant up失败过需要先vagrant destroy清理后再重新拉起。如果配置了代理但未安装vagrant-proxyconf插件Vagrant 会直接退出并提示安装见 Vagrantfile L60-L67。5.2 指定 Ubuntu 镜像源与修改端口首次构建环境需要从 Ubuntu 软件源下载大量软件包靠近你的本地镜像可显著加速。写入UBUNTU_MIRROR http://us.archive.ubuntu.com/ubuntu/修改宿主机访问端口HOST_PORT 9971执行vagrant reload生效后访问 http://localhost:9971/ 即可。若希望其他机器也能访问开发环境可设置HOST_IP_ADDR 0.0.0.0该特殊值表示允许任意 IP 连接。六、常见问题排查6.1 登录后提示符没有(zulip-server)前缀进入容器后命令提示符应形如(zulip-server) vagrant...。若缺少该前缀说明 provisioning 未完整成功。检查容器内var/log/provision.log或 WSL 场景下的~/zulip/var/log/provision.log成功日志末尾应包含类似Zulip development environment setup succeeded!的提示终端中的颜色转义码ESC序列在日志里会显得杂乱属正常现象。修复方式是重新执行 provisioning成功后重新vagrant ssh进入或手动执行source .venv/bin/activate。6.2 常见报错速查报错含义与处理SSL read: error:00000000:...errno 104网络不稳定或过慢换个更稳定的网络反复执行vagrant up直到成功ssh_exchange_identification: Connection closed by remote hostguest 未在运行用vagrant halt; vagrant up重启Timed out while waiting for the machine to bootVagrant 无法与 guest 通信通常是 VirtualBox/Vagrant 本身的 bug重启 guest 一般可解决subprocess.CalledProcessErrortools/provision的某个子命令失败vagrant ssh进入后cd zulip ./tools/provision单独重跑失败子命令即可provision 系统设计上可从容恢复pip install失败多为网络问题或内存不足确保分配给 guest 至少 2GB 内存Zulip 的最低要求更详细的排查说明见 shared-vagrant-errors.md。6.3 目录权限问题若 Vagrant 提示 vagrant 用户无法写入 zulip 目录说明共享目录属主与容器内vagrant用户UID 1000不一致。可在宿主机执行vagrant-provision 中输出的修复指引$ vagrant halt -f $ sudo chown -R 1000:$(id -g) /PATH/TO/ZULIP/CLONE $ vagrant up6.4 更新与重建环境从main分支 rebase 后若启动或测试报错大概率是 provisioning 流程有更新重新运行./tools/provision约一分钟即可。需要彻底重建时可参考 vagrant-rebuild.md 的操作步骤排查问题时tools/diagnose脚本的输出也很有帮助。七、小结本篇围绕 install-docker.md 的三步配置docker 组授权、daemon 状态校验、服务启用启动展开并延伸到 setup-recommended.md 中基于 Vagrant Docker 的完整开发环境搭建流程。核心要点回顾安装 Docker 后必须完成用户组授权与守护进程启动校验这是后续一切 Docker 命令的前提通过vagrant up --providerdocker拉起基于 Ubuntu 22.04 的开发容器源码目录通过共享目录挂载进容器代理、镜像源、端口等可通过~/.zulip-vagrant-config一行配置完成定制大多数失败可通过vagrant provision重试解决日志位于var/log/provision.log。完成以上流程后即可在 http://localhost:9991/devlogin 开始 Zulip 的本地开发与调试。【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表