ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UOS系统安装Docker完整指南:从软件源配置到镜像加速与权限避坑

UOS系统安装Docker完整指南:从软件源配置到镜像加速与权限避坑 前两天在UOS上帮同事把整套开发环境搬进Docker之后办公室好几个朋友跑过来问安装过程。说实话UOS装Docker这件事说难不难但坑是真不少——软件源、CPU架构、用户权限、镜像加速哪一个环节不留意都能把你卡在原地半天。后台私信也天天有人问“统信操作系统能不能装Docker”“Docker Desktop能不能在UOS上用”。这篇文章我从零开始把UOS上安装Docker的完整流程、遇到的各种报错和处理方式原原本本整理出来适合刚接触UOS的开发者也适合给公司内网环境做技术预研的运维朋友参考。1. 项目概述与场景拆解1.1 为什么要在UOS上装DockerUOS是统信软件基于Linux内核开发的操作系统桌面端日常办公、服务器端业务部署都有不少人在用。日常开发中大家最头疼的一件事就是环境不一致在自己机器上跑得好好的Java服务、Python脚本换一台电脑就可能缺依赖库、版本冲突甚至系统库不一致导致直接崩溃。Docker用容器把应用和运行环境完整打包不管你底层是Ubuntu、CentOS还是UOS只要内核支持容器能力跑起来的结果都一样环境问题彻底解决。除此之外Docker在UOS上还有几个很实际的使用场景第一公司内部要搭统一的中间件环境比如MySQL、Redis、Nginx用容器装比用系统包管理安装省事卸载也干净第二做微服务开发本地需要多个服务联动时容器编排能直接把一套环境拉起来第三很多软件只发布Linux版本但测试环境需求复杂Docker可以一次性隔离出多个互不干扰的沙箱非常适合在国产操作系统上做软件兼容性验证。我也是从这些场景出发才决定在UOS上把Docker完整装起来。1.2 这套方案在什么环境下验证过写这篇文章之前我在三台不同配置的UOS设备上做了完整验证覆盖目前比较主流的硬件环境设备类型操作系统版本CPU架构安装结果普通办公台式机UOS 20 桌面专业版 1060x86_64Intel/AMD正常安装跑MySQL无压力国产笔记本UOS 20 桌面个人版 1070arm64飞腾正常安装镜像需选arm版本虚拟机环境UOS 20 服务器版x86_64正常安装需开启嵌套虚拟化如果你的CPU架构是x86_64也就是Intel或AMD安装路径最顺利软件源直接走Debian标准仓库即可。如果是arm64架构比如飞腾、鲲鹏这些芯片安装思路一样但仓库地址和镜像拉取要额外注意架构类型后面第5章会专门说。特别提醒一下UOS的家庭版和专业版默认都是普通用户安装过程中需要sudo权限如果提示当前用户不在sudoers里先用系统管理员账号去添加权限。2. 动手前的环境确认与基础准备工作2.1 先搞清CPU架构和系统版本很多人安装失败不是因为命令敲错而是软件源压根不符合当前系统。UOS虽然内核是Linux但它是基于Debian体系二次开发的所以Docker安装要参照Debian的软件仓库规则。不同CPU架构对应的仓库架构名不一样直接决定后面source list里是写amd64还是arm64。安装前必须执行的三个检查命令# 查看CPU架构x86_64是Intel/AMDaarch64是arm芯片loongarch64是龙芯 uname -m # 查看系统版本代号确认是Debian哪个版本衍生 cat /etc/os-release # 查看Debian兼容版本UOS一般显示10或11 cat /etc/debian_version我建议你把这三条命令的输出先记下来再往下走。根据我的实测UOS 20系列的/etc/debian_version通常是10.x或11.x分别对应Debian 10buster和Debian 11bullseye。如果你的UOS版本比较新可能显示12.x那就是bookworm。不同代号的Debian源不能混用否则安装依赖时会遇到版本冲突。2.2 更新软件源并补齐基础依赖确认完架构和版本先更新系统软件源。UOS默认源在部分内网环境可能连接较慢如果你的机器能访问外网直接用系统自带的源就行如果访问不畅可以改到国内公共镜像源这一步能让后面apt安装少出很多幺蛾子。用编辑器打开源文件将源地址替换为速度可靠的公共镜像地址。前提是搞清楚系统版本对应的Debian代号比如buster或bullseye。改完执行sudo apt update sudo apt install -y curl wget ca-certificates gnupg2 apt-transport-https software-properties-common这些基础包是添加Docker软件源的必备条件其中ca-certificates负责HTTPS证书校验gnupg2用于导入GPG签名密钥apt-transport-https让apt支持从HTTPS源下载软件包。缺少任何一个后续添加源时都可能报错。2.3 清理系统自带的旧版Docker部分UOS系统镜像里已经预装了docker.io或docker-compose这是Debian官方仓库维护的Docker版本版本号通常比较旧功能也不完整。如果直接在这个基础上添加Docker官方源会导致apt同时管理两个Docker包源轻则报依赖冲突重则把系统自带包管理器搞乱。安装前先看有没有旧版本dpkg -l | grep -i docker如果看到docker.io、docker-compose、containerd、docker-registry这些字样的包先卸载干净sudo apt purge -y docker.io docker-compose containerd runc sudo rm -rf /var/lib/docker /etc/docker卸载时加purge参数是为了把配置文件一并清掉。很多人在旧版本没卸干净的情况下直接装docker-ce最后发现启动不了日志里全是数据库路径冲突排查起来特别折磨人。所以这个步骤别偷懒。3. Docker安装全流程与关键参数说明3.1 配置Docker官方仓库UOS是基于Debian的所以要添加Docker官方的Debian软件源。注意不要用Docker官方默认地址因为国内访问时快时慢最好直接配置国内可用的镜像站我实测用阿里云的Docker镜像站比较稳定同步也及时。先导入GPG密钥curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-ce.gpg这里用了--dearmor把密钥转成二进制格式新版apt要求密钥文件必须放在/usr/share/keyrings/目录下并且以.gpg结尾。如果你直接把apt-key add那种老方法套用上来会收到apt的Deprecation警告不影响安装但不够规范。接着添加软件源。以Debian 11bullseye为例如果你的系统是Debian 10把bullseye换成busterecho deb [archamd64 signed-by/usr/share/keyrings/docker-ce.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian bullseye stable | sudo tee /etc/apt/sources.list.d/docker-ce.list如果你的UOS是arm64架构比如飞腾芯片把archamd64改成archarm64如果是龙芯的loongarch64目前Docker官方源不支持只能下载官方提供的龙芯二进制包这个后面单独说。配置完执行sudo apt update确认能读到Docker仓库列表。3.2 安装docker-ce、containerd与compose插件软件源配好之后安装就很简单了sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这里重点解释每个包是干什么的docker-ce是Docker服务端主程序docker-ce-cli是命令行工具containerd.io是容器运行时负责实际创建和运行容器docker-buildx-plugin是镜像构建插件docker-compose-plugin是Docker Compose v2插件的核心。很多人只装docker-ce结果发现docker compose命令用不了其实就是少了最后这个包。安装完成后先别急着跑容器确认一下服务状态sudo systemctl status docker如果显示active (running)说明服务已经启动。如果状态是inactive或failed继续往下看3.3节的daemon.json配置很多时候是缺了初始化配置导致的。3.3 修改daemon.json并启动服务Docker服务有一个全局配置文件/etc/docker/daemon.json这个文件决定了镜像加速地址、数据存储路径、日志大小等关键参数。UOS默认没有这个文件需要手动创建。对我大多数普通用户来说最值得配置的是镜像加速地址和容器日志大小上限。用编辑器或命令创建配置文件sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json EOF { registry-mirrors: [ https://docker.m.daocloud.io, https://docker.nju.edu.cn ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, storage-driver: overlay2 } EOFregistry-mirrors是镜像加速器地址国内直连Docker Hub拉镜像非常慢配置加速器后下载速度能提升几十倍。log-opts限制单个容器日志文件最大100MB保留3个文件防止日志无限增长把系统盘写满——这个坑我在生产服务器上踩过一个不设防的容器日志能把磁盘撑爆。storage-driver使用overlay2这是Docker在Linux上的默认存储驱动性能好且稳定。改完配置需要重启Docker才能生效sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl enable dockerenable是设置开机自启这一步很重要不然重启UOS之后Docker服务不会自动起来。3.4 当前用户免sudo使用DockerDocker安装完成后默认只有root用户或docker组里的用户能直接操作Docker socket。如果你直接用普通用户运行docker ps会看到经典的报错permission denied while trying to connect to the Docker daemon socket。解决方式是把当前用户加入docker组sudo usermod -aG docker $USER newgrp docker加入docker组之后不用重新启动系统newgrp docker会让当前终端直接切换组身份。之后执行docker ps就不会再报权限错误了。需要说明的是加入docker组相当于把当前用户提升到等同于root的容器管理权限这是Docker官方推荐给个人开发机的做法但在多人服务器上要慎重因为能操作Docker就基本能控制宿主机。4. 验证实践拉镜像、跑容器、部署常用服务4.1 用hello-world验证安装结果环境配置好先跑一个最小的测试镜像确认整体链路通不通docker run --rm hello-world如果配置了镜像加速器几秒钟就能拉取并运行完成。看到Hello from Docker!说明一切正常。如果你的环境拉取hello-world超时先检查网络能否访问镜像加速器再检查/etc/docker/daemon.json里的地址是否填写正确改完还必须重启Docker。4.2 跑一个Nginx容器确认端口映射正常验证最基础的功能我习惯用Nginx容器来测试端口映射和容器生命周期docker run -d --name web-test -p 8080:80 nginx:alpine然后浏览器访问http://localhost:8080看到Nginx欢迎页说明容器已经正常工作。这里有个细节-p 8080:80表示把宿主机的8080端口映射到容器的80端口。如果UOS开启了防火墙记得放行8080端口或者直接关掉防火墙测试。如果访问不通执行sudo docker logs web-test看日志基本都是端口被占用或防火墙拦截。4.3 用docker compose一次性拉起MySQL 8.0和Redis日常开发最常用的就是数据库和缓存我在这里给出一个可以直接抄作业的docker-compose.yml。在工作目录创建文件version: 3.8 services: mysql: image: mysql:8.0 container_name: dev-mysql restart: always environment: MYSQL_ROOT_PASSWORD: root123456 MYSQL_DATABASE: testdb ports: - 3306:3306 volumes: - mysql_data:/var/lib/mysql command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci redis: image: redis:7-alpine container_name: dev-redis restart: always ports: - 6379:6379 volumes: - redis_data:/data command: redis-server --appendonly yes volumes: mysql_data: redis_data:把文件保存为docker-compose.yml然后在同目录执行docker compose up -d这个配置文件里最关键的是volumes挂载。MySQL的数据若不做持久化容器一删数据就全没了所以通过命名卷mysql_data把容器内的/var/lib/mysql目录映射出来。Redis同理--appendonly yes开启AOF持久化确保重启容器后数据不丢失。restart: always让容器在Docker服务重启后自动拉起适合开发环境长期运行。4.4 用Portainer在网页上管理容器如果你不是命令行重度用户或者觉得docker ps、docker logs这些命令太枯燥强烈建议装一个Portainer。它是开源免费的容器管理面板在浏览器里就能查看所有容器状态、日志、CPU和内存占用甚至可以直接在网页上启动和删除容器对UOS桌面用户特别友好。一条命令跑起来docker run -d -p 9000:9000 \ --name portainer \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest浏览器访问http://localhost:9000首次进入设置管理员密码然后选择连接本地Docker环境就可以了。之后在浏览器里点几下就能部署Nginx、MySQL查看容器日志甚至可以看到各个容器的资源占用曲线。对于团队协作场景把Portainer端口开放给同事大家就能共享同一个容器管理界面省去手把手教命令行的成本。5. 常见问题排查与避坑记录5.1 权限与socket连接报错这是UOS上装Docker之后出现频率最高的报错典型症状是docker ps提示permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock原因就是当前用户不在docker组里。执行sudo usermod -aG docker $USER后重新登录或者直接执行newgrp docker切换组身份。还有一个变种报错Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?这个就说明Docker服务没有启动先执行sudo systemctl status docker看服务状态如果服务是failed用sudo journalctl -u docker --no-pager -n 50查看最近日志。我遇到过几次服务起不来的情况去看日志发现都是/etc/docker/daemon.json格式写错——JSON语法多一个逗号、少一个花括号Docker服务直接拒绝启动。改配置时务必用python3 -m json.tool /etc/docker/daemon.json检查格式。5.2 镜像拉取慢或直接超时如果docker pull的时候进度条长时间不动或者报net/http: TLS handshake timeout基本可以确定是镜像加速器没配好或者没生效。先确认daemon.json里有没有registry-mirrors字段然后把加速器地址换成可用的新地址。修改之后必须执行sudo systemctl daemon-reload sudo systemctl restart docker docker info执行docker info后查看Registry Mirrors那一段如果列出了你配置的地址说明加速器已经生效。我实测过加速器对Docker Hub镜像的拉取速度影响非常大不配置的时候一个几百兆的镜像可能要等几十分钟配置之后基本几分钟就能搞定。5.3 arm架构和龙芯平台怎么办arm64架构的设备比如飞腾、鲲鹏芯片按照3.1节把软件源里的archamd64改成archarm64就行Docker官方是支持arm64的。拉镜像时要注意镜像架构MySQL、Redis这些主流镜像都有arm64版本直接在x86服务器上写的mysql:8.0标签在arm设备上也能用Docker会自动拉取对应架构的镜像。真正麻烦的是龙芯平台Docker官方软件源不支持loongarch64架构。目前的替代方案是安装龙芯官方适配的Docker二进制包或者直接安装UOS软件源里的docker.io。我建议优先试试sudo apt install -y docker.io虽然版本旧一点但基本功能都能用。如果你需要新版本的Docker去龙芯开源社区找对应芯片型号的安装包下回来之后用dpkg -i安装遇到依赖缺失再用apt -f install修复。这属于特殊场景日常使用够用就好不必追求版本号最新。5.4 从使用体验聊几句大实话整套流程跑完我最大的感受是UOS装Docker并没有想象中那么复杂只要把软件源选对、镜像加速配好、权限处理好后面就是水到渠成的事。踩过几次坑之后现在但凡在UOS上装Docker我都会做三件事装前先看架构、装后立刻配daemon.json、配完重启并检查docker info。这套流程已经成了我的固定动作公司里其他同事遇到类似问题我都是让他们照这个顺序排查。最后再分享一个小技巧如果你经常在UOS桌面环境里折腾容器可以把Portainer的容器设为restart: always这样每次开机后直接打开浏览器就能看到所有容器状态不用在终端里敲任何命令。这个内容后续还可以扩展的方向是用docker compose把整个开发环境数据库、缓存、消息队列、微服务网关全部编排起来一套命令实现环境秒级重建这个我们改天单独写一篇细说。
返回列表