Ubuntu系统Docker安装配置全指南:从零到实战部署

📅 2026/8/22 4:53:37
Ubuntu系统Docker安装配置全指南:从零到实战部署
1. 项目概述为什么要在Ubuntu上安装Docker如果你是一名开发者、运维工程师或者正在学习云原生技术那么Docker几乎是你绕不开的工具。它通过容器化技术将应用及其所有依赖打包成一个标准化的单元实现了“一次构建处处运行”的梦想。相比于传统的虚拟机Docker容器更轻量、启动更快、资源开销更小极大地提升了开发效率和部署的一致性。那么为什么选择在Ubuntu上安装Docker呢Ubuntu作为最流行的Linux发行版之一以其稳定的长期支持版本、活跃的社区和丰富的软件源著称。Docker官方对Ubuntu的支持非常完善安装路径清晰社区资料也最丰富。无论是用于个人学习、搭建开发测试环境还是作为生产服务器的基石在Ubuntu上部署Docker都是一个稳妥且高效的选择。这篇教程将带你从零开始一步步在Ubuntu系统上完成Docker的安装、配置和基础验证并分享我在多年使用中积累的实战经验和避坑指南。无论你是刚接触Linux的新手还是有一定基础想系统化部署的同行都能从这里找到清晰的指引。2. 安装前的关键准备与系统检查在动手安装之前做好充分的准备工作可以避免后续80%的麻烦。很多人一上来就照着命令敲结果遇到各种报错比如“virtualization support not detected”或者“Docker Desktop failed to start”其实这些问题大多可以在安装前就排查清楚。2.1 确认系统版本与架构首先我们需要确认当前Ubuntu系统的具体版本和CPU架构。Docker对不同版本的系统有不同的软件源和依赖要求。打开终端执行以下命令查看系统信息lsb_release -a你会看到类似如下的输出No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy这里最重要的是Codename代号如 jammy和Release版本号如 22.04。本教程主要针对Ubuntu 20.04 LTS (Focal Fossa) 和 22.04 LTS (Jammy Jellyfish) 这两个最主流的长期支持版本其他版本步骤类似但软件源地址会有所不同。接着确认CPU架构uname -m常见的输出有x86_6464位Intel/AMD或aarch6464位ARM如树莓派4、苹果M系列芯片在Linux虚拟机中。Docker对这两种架构都有良好支持。注意虽然Docker也支持32位系统但官方已逐渐停止维护强烈建议在64位系统上进行安装以获得完整的功能和安全更新。2.2 检查并开启虚拟化支持关键步骤这是最容易出问题的一环尤其是当你后续想运行某些需要嵌套虚拟化的容器时。Docker本身不依赖硬件虚拟化它使用Linux内核的cgroups和namespaces但Docker Desktop for Linux或一些基于虚拟机的工具如旧版Docker Toolbox需要。更重要的是如果你的物理机是Windows并通过WSL2运行Ubuntu或者你打算在Ubuntu虚拟机里再运行Docker那么就必须确保底层的虚拟化支持已开启。对于物理机安装的Ubuntu 检查CPU是否支持虚拟化技术Intel VT-x 或 AMD-V。grep -Eoc (vmx|svm) /proc/cpuinfo如果输出数字大于0说明CPU支持且已在BIOS/UEFI中启用。如果输出是0你需要重启电脑进入BIOS/UEFI设置找到类似“Intel Virtualization Technology”、“AMD-V”或“SVM Mode”的选项将其设置为Enabled。对于虚拟机内的Ubuntu 你需要在虚拟机软件如VMware、VirtualBox的客户机设置中显式开启虚拟化引擎的嵌套功能。例如在VMware中需要编辑虚拟机设置在“处理器”选项中勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI”。对于WSL2下的Ubuntu 这是网络热词中“wsl2安装ubuntu一直卡在安装0%”和“docker desktop failed to start”错误的高发区。首先确保Windows版本满足WSL2要求Win10 1903以上或Win11。然后以管理员身份打开PowerShell运行wsl --set-default-version 2如果之前安装的是WSL1需要转换wsl --set-version Ubuntu 2同时务必在Windows“启用或关闭Windows功能”中确认“Hyper-V”和“Windows Subsystem for Linux”已勾选启用。2.3 卸载旧版本与清理冲突组件如果你的系统上曾经安装过旧版本的Docker可能叫docker,docker.io, 或docker-engine或者安装过有冲突的容器运行时必须先彻底清理干净否则会导致依赖冲突和安装失败。执行以下清理命令sudo apt-get remove docker docker-engine docker.io containerd runc这条命令会移除旧的Docker包。但apt-get remove可能不会删除配置文件和数据。为了彻底清洁我们还可以删除相关的目录和文件操作前请确认你不需要其中的镜像或容器数据sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd完成这些准备工作后你的系统就为一个干净的Docker安装做好了准备。接下来我们将进入正式的安装流程。3. 三种主流安装方法详解与选型在Ubuntu上安装Docker主要有三种途径使用官方便捷脚本、从软件仓库安装、以及手动下载deb包安装。每种方法各有优劣适用于不同的场景。3.1 方法一使用官方便捷脚本最快适合快速搭建测试环境Docker官方提供了一个自动化安装脚本get-docker.sh。这个方法最省心脚本会自动检测你的系统版本配置官方仓库并安装最新的稳定版Docker。操作步骤下载脚本curl -fsSL https://get.docker.com -o get-docker.sh运行脚本需要root权限sudo sh get-docker.sh实操心得与注意事项优点极其简单一条命令解决所有问题特别适合在干净的测试环境或云服务器上快速部署。缺点脚本执行的每一步对你来说是“黑盒”。它默认会安装最新稳定版你无法精细控制安装的版本。此外脚本会自动添加Docker的官方软件源这可能会与你系统中其他的软件源产生冲突虽然概率很低。重要提示永远不要在生产环境中直接运行从网络下载的脚本除非你完全信任其来源并理解其内容。作为安全实践你可以先使用cat get-docker.sh查看脚本内容或者从官方文档页面找到该脚本的链接以确保来源可信。3.2 方法二从APT仓库安装推荐兼顾稳定与可控这是我最推荐的方法也是Docker官方文档首推的方式。通过配置Docker的官方APT软件源来安装你可以享受APT包管理器的所有好处依赖自动解决、版本管理、以及通过sudo apt-get update和sudo apt-get upgrade进行安全更新。详细步骤解析更新APT包索引并安装基础工具sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release这些工具用于安全地添加和管理软件源。添加Docker的官方GPG密钥 GPG密钥用于验证从该软件源下载的软件包的完整性和真实性是安全安装的关键。sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg这条命令创建了密钥环目录并下载、导入Docker的GPG公钥。设置稳定的软件仓库 接下来我们需要告诉APT系统去哪里寻找Docker的软件包。这里需要根据你的Ubuntu版本代号之前查到的如jammy来配置。echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null让我拆解一下这个命令arch$(dpkg --print-architecture)自动获取当前系统架构如amd64。signed-by/etc/apt/keyrings/docker.gpg指定验证软件包签名的密钥。$(lsb_release -cs)自动获取你的Ubuntu版本代号如jammy。整条命令的作用是生成正确的仓库配置字符串并将其写入/etc/apt/sources.list.d/docker.list文件。/etc/apt/sources.list.d/目录下的文件是APT软件源的补充来源这样管理起来更清晰不会污染系统主源文件。更新APT包索引再次并安装Docker 添加新源后必须更新本地软件包列表。sudo apt-get update现在你可以安装Docker引擎、命令行工具、容器运行时等全套组件了sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugindocker-ce: Docker社区版引擎。docker-ce-cli: Docker命令行工具。containerd.io: 行业标准的容器运行时。docker-compose-plugin: Docker Compose V2作为Docker CLI的一个插件用于定义和运行多容器应用。为什么推荐此方法因为它平衡了便利性和可控性。你明确知道软件来源是官方的可以通过apt-cache madison docker-ce查看所有可用版本并选择安装特定版本例如某些生产环境需要锁定版本号。同时后续更新也通过标准的APT系统管理非常规范。3.3 方法三手动下载DEB包安装适用于无外网或特定版本需求在某些严格的内网环境或需要安装历史特定版本时你可以手动下载.deb安装包进行安装。前往 Docker官方APT仓库 。根据你的Ubuntu版本代号如jammy和架构如amd64进入pool/stable/目录。手动下载docker-ce、docker-ce-cli、containerd.io和docker-compose-plugin的deb包。你需要处理它们之间的依赖关系。使用sudo dpkg -i *.deb命令安装。如果遇到依赖错误再运行sudo apt-get install -f来修复。适用场景网络隔离环境、需要精确复现某个旧版本环境、或作为离线安装包分发的场景。对于绝大多数用户方法二已经足够。4. 安装后的核心配置与验证安装完成并不意味着结束合理的配置才能让Docker用起来更顺手、更安全。很多新手卡在“安装成功但用不了”的环节问题往往出在配置和权限上。4.1 管理Docker服务启动、停止与开机自启Docker是以系统服务systemd service的形式运行的。我们需要掌握其基本管理命令。启动Docker服务sudo systemctl start docker设置Docker服务开机自动启动强烈建议sudo systemctl enable docker检查Docker服务状态sudo systemctl status docker执行后如果看到绿色的“active (running)”字样说明服务已成功启动。这是验证安装是否成功的第一步。4.2 解决权限问题将用户加入docker组必做默认情况下执行docker命令需要sudo权限。每次命令前都加sudo非常麻烦而且某些图形化工具也可能因此无法工作。安全的做法是将你的普通用户加入docker用户组。sudo usermod -aG docker $USER执行这条命令后你必须完全注销当前用户然后重新登录或者重启系统才能使组权限生效。仅仅新开一个终端窗口是不够的。验证权限是否生效 重新登录后打开新终端直接运行docker version如果能够正常显示Client和Server的版本信息而不需要sudo说明配置成功。重要安全提示docker组本质上拥有root权限因为Docker守护进程以root身份运行。因此只将你信任的用户加入该组。在多用户系统或生产服务器上需谨慎管理。4.3 运行测试容器验证安装完整性理论验证通过后我们用一个实际的容器来检验Docker是否真的能工作。经典的“Hello World”测试docker run hello-world这条命令会执行以下动作Docker客户端联系守护进程。守护进程发现本地没有hello-world镜像于是从默认的Docker Hub仓库拉取pull该镜像。拉取成功后守护进程根据该镜像创建一个新的容器并运行。容器内的程序执行打印出“Hello from Docker!”等欢迎信息然后退出。如果你能看到成功的欢迎信息那么恭喜你Docker已经在你的Ubuntu系统上完全安装并配置成功了4.4 配置国内镜像加速器提升拉取速度由于网络原因从Docker Hub拉取镜像可能会非常慢甚至失败。配置一个国内的镜像加速器是提升体验的必备操作。这里以阿里云镜像加速器为例需要注册阿里云账号获取专属地址。登录 阿里云容器镜像服务控制台 。在“镜像工具” - “镜像加速器”中你会看到针对不同系统的配置指南复制给你的Ubuntu专属加速器地址格式如https://xxxx.mirror.aliyuncs.com。在Ubuntu上编辑Docker守护进程配置文件sudo nano /etc/docker/daemon.json如果文件不存在则新建。将以下内容写入请替换your-mirror-address为你的实际地址{ registry-mirrors: [https://your-mirror-address] }你可以配置多个镜像源用逗号隔开。例如同时使用阿里云和中科大的源{ registry-mirrors: [ https://your-mirror-address, https://docker.mirrors.ustc.edu.cn ] }保存并退出编辑器在nano中按CtrlX然后按Y再按Enter。重新加载配置并重启Docker服务sudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效docker info在输出信息中查找Registry Mirrors部分如果看到了你配置的地址说明成功。5. 实战进阶Docker Compose与基础使用仅仅安装好Docker引擎就像只买了发动机要造车还得有工具。Docker Compose就是这样一个定义和运行多容器应用的神器。在安装Docker时我们通过docker-compose-plugin已经安装了它的V2版本与docker compose命令集成。5.1 Docker Compose核心概念与快速上手Docker Compose通过一个YAML格式的docker-compose.yml文件来配置你的应用所需的所有服务容器、网络、数据卷等。然后一条命令就能启动整个应用栈。一个最简单的docker-compose.yml示例运行一个Nginx web服务器version: 3.8 # 指定Compose文件格式版本 services: # 定义服务列表 web: # 服务名称 image: nginx:alpine # 使用的镜像 ports: - 8080:80 # 将宿主机的8080端口映射到容器的80端口 volumes: - ./html:/usr/share/nginx/html # 将当前目录下的html文件夹挂载到容器内将上述内容保存为docker-compose.yml然后在同一目录下创建一个html文件夹并在里面放一个index.html文件。使用Compose启动应用docker compose up -dup创建并启动所有定义的服务。-d在后台运行“detached”模式。现在打开浏览器访问http://你的服务器IP:8080就能看到你放在html目录下的网页了。其他常用Compose命令docker compose down停止并移除所有容器、网络默认不会移除数据卷。docker compose ps查看当前Compose项目运行中的容器状态。docker compose logs [service-name]查看指定服务的日志输出。docker compose exec [service-name] [command]在运行中的服务容器内执行命令例如docker compose exec web sh可以进入web容器的shell。5.2 镜像与容器基础管理命令速查掌握以下核心命令你就能应对日常大部分Docker操作镜像相关docker images列出本地所有镜像。docker pull [镜像名]:[标签]拉取镜像如docker pull ubuntu:22.04。docker rmi [镜像ID或名称]删除本地镜像。docker build -t [标签] .根据当前目录的Dockerfile构建镜像。容器生命周期docker run [选项] [镜像]创建并运行一个新容器。常用选项-d后台运行。-p [主机端口]:[容器端口]端口映射。-v [主机路径]:[容器路径]数据卷挂载。--name [名称]为容器指定一个名字。-it交互式终端常与/bin/bash连用进入容器如docker run -it ubuntu:22.04 /bin/bash。docker ps查看运行中的容器。加-a查看所有包括已停止的。docker stop [容器ID或名称]停止一个运行中的容器。docker start [容器ID或名称]启动一个已停止的容器。docker rm [容器ID或名称]删除一个已停止的容器加-f可强制删除运行中的容器。查看信息与日志docker logs [容器ID或名称]查看容器日志。docker exec -it [容器ID或名称] /bin/bash进入一个正在运行的容器的交互式终端。docker inspect [容器ID或名称]获取容器/镜像的底层详细信息JSON格式。6. 常见问题排查与深度优化指南即使按照教程一步步来你也可能会遇到一些“坑”。这里我整理了多年实践中遇到的高频问题及其解决方案。6.1 安装与启动类问题问题1执行docker version或docker run时提示“Cannot connect to the Docker daemon...”原因Docker守护进程没有运行或者当前用户没有连接守护进程的权限。排查步骤检查服务状态sudo systemctl status docker。如果未运行则sudo systemctl start docker。检查用户组运行groups命令查看当前用户是否在docker组内。如果不在请执行sudo usermod -aG docker $USER并重新登录。检查套接字文件权限极少数情况下/var/run/docker.sock文件的权限可能出错。可以检查其权限ls -l /var/run/docker.sock所属组应为docker。问题2拉取镜像速度极慢或超时原因网络连接Docker Hub不稳定。解决方案配置镜像加速器如4.4节所述这是最有效的办法。使用代理如果是在企业内网需要通过代理上网需要为Docker守护进程配置HTTP/HTTPS代理。编辑~/.docker/config.json文件用户级或为系统服务配置环境变量。直接导入导出镜像在内网环境可以先在一台能联网的机器上docker pull和docker save镜像然后通过U盘或内部网络docker load到目标机器。问题3安装时出现依赖冲突或软件包找不到原因系统软件源混乱或之前安装的残留包导致。解决方案彻底清理旧版本见2.3节。检查/etc/apt/sources.list和/etc/apt/sources.list.d/下的文件确保没有重复或冲突的Docker源。运行sudo apt-get update --fix-missing尝试修复。如果问题依旧可以尝试使用sudo apt-get install -f修复损坏的依赖关系然后再重新安装。6.2 运行与资源类问题问题4容器启动后立即退出原因容器内没有前台进程在运行。Docker容器需要至少一个前台进程来保持运行否则任务完成就会退出。解决方案对于Web服务器、数据库等它们本身会以守护进程形式运行没问题。对于某些基础镜像如ubuntu直接docker run ubuntu它没有指定要运行什么命令默认是/bin/bash并且没有提供交互式终端-it所以会立即退出。正确做法要么运行一个长期进程如docker run -d ubuntu tail -f /dev/null要么以交互模式进入如docker run -it ubuntu /bin/bash。问题5提示“端口已被占用”原因宿主机上你试图映射的端口如-p 80:80中的第一个80已经被其他进程占用。排查与解决使用sudo netstat -tulpn | grep :80或sudo lsof -i:80查找是哪个进程占用了80端口。要么停止那个进程要么在docker run时映射到宿主机另一个空闲端口如-p 8080:80。问题6容器内无法连接外部网络如ping不通外网原因Docker的网桥配置问题或宿主机防火墙如UFW阻止了Docker的网络流量。解决方案检查Docker网络docker network lsdocker network inspect bridge。对于Ubuntu的UFW防火墙Docker会直接操作iptables可能与UFW规则冲突。一种常见的做法是允许UFW转发并配置Docker不使用iptables。但更简单但稍欠安全的临时方案是禁用UFW对Docker的影响编辑/etc/default/ufw将DEFAULT_FORWARD_POLICY从DROP改为ACCEPT然后sudo ufw reload。生产环境需要更精细的规则。6.3 性能与存储优化建议优化1更改Docker数据根目录默认在/var/lib/docker如果系统根目录/空间不足可以将Docker的镜像、容器等数据存放到更大的磁盘分区上。停止Docker服务sudo systemctl stop docker。编辑配置文件sudo nano /etc/docker/daemon.json。添加>{ data-root: /new/path/to/docker-data, registry-mirrors: [...] }将旧数据迁移到新位置可选但推荐sudo rsync -avxP /var/lib/docker/ /new/path/to/docker-data/重启Dockersudo systemctl start docker。确认新路径生效docker info | grep Docker Root Dir。优化2配置日志轮转防止日志占满磁盘Docker容器默认的日志驱动json-file会持续产生日志不加以限制可能撑爆磁盘。编辑/etc/docker/daemon.json为所有容器全局配置日志选项{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这表示每个容器的日志文件最大为10MB最多保留3个文件如container.log,container.log.1,container.log.2更旧的会被自动删除。配置后需要重启Docker服务。优化3清理无用资源释放磁盘空间Docker用久了会积累很多停止的容器、未使用的镜像、悬空镜像和构建缓存。一键清理命令谨慎使用会删除所有未使用的资源docker system prune -a-a会一并删除所有未被任何容器引用的镜像不仅仅是悬空镜像。执行前请确认这可能会删除你本地的镜像备份。更精细的清理docker container prune删除所有停止的容器。docker image prune删除所有悬空镜像未被任何容器引用的中间层镜像。docker volume prune删除所有未被容器使用的数据卷。安装和配置Docker只是第一步真正的价值在于用它来封装你的应用、标准化你的开发环境、搭建复杂的服务栈。从今天起尝试将你的下一个项目Docker化你会发现部署和协作变得前所未有的简单。如果在实践中遇到本教程未覆盖的独特问题善用docker --help、docker logs和搜索引擎大部分难题都能在活跃的社区中找到答案。记住容器化是一种思维而Docker是实践这种思维最有力的工具之一。