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),仅供参考
返回列表