公司动态

Ubuntu系统Docker安装配置全攻略:从零到生产环境部署

📅 2026/8/22 4:03:57
Ubuntu系统Docker安装配置全攻略:从零到生产环境部署
1. 项目概述为什么要在Ubuntu上安装Docker如果你是一名开发者、运维工程师或者正在学习云原生技术那么Docker几乎是你绕不开的工具。它通过容器化技术将应用及其所有依赖打包成一个标准化的单元实现了“一次构建处处运行”的梦想。而Ubuntu作为最流行、社区支持最完善的Linux发行版之一是运行Docker的绝佳平台。无论是个人开发机、测试服务器还是生产环境Ubuntu Docker的组合都极为常见。这篇教程的目的就是带你从零开始在Ubuntu系统上完成Docker引擎的完整安装与基础配置。这不仅仅是敲几条命令我会详细解释每一步背后的逻辑分享我多年在Ubuntu服务器上部署Docker踩过的坑和总结的技巧。无论你是刚接触Linux的新手还是想系统梳理安装流程的老手都能从这里获得可以直接“抄作业”的可靠方案。我们将覆盖从系统准备、官方源安装、到权限配置、镜像加速以及验证测试的全过程确保你安装的Docker既稳定又好用。2. 安装前的核心准备与系统检查在动手安装之前充分的准备工作能避免至少80%的后续问题。很多人安装失败问题往往出在这一步。2.1 系统版本与内核确认首先你需要确认你的Ubuntu版本。Docker对系统版本有要求通常需要64位的Ubuntu Jammy 22.04 (LTS)、Focal 20.04 (LTS) 或 Bionic 18.04 (LTS)。打开终端执行以下命令lsb_release -a你会看到类似Description: Ubuntu 22.04.3 LTS的输出。确保是上述支持的LTS版本。非LTS版本虽然也可能运行但长期支持版本在稳定性和社区支持上更有保障。接下来检查内核版本。Docker需要较新的内核来支持其核心功能如cgroups、命名空间。运行uname -r我建议内核版本至少在4.x以上对于Ubuntu 20.04/22.04默认内核都满足要求。这一步主要是为了排除一些极度老旧或自定义裁剪过的系统。2.2 卸载可能的旧版本如果你的系统上曾经安装过旧版本的Docker可能叫docker、docker.io或docker-engine必须先彻底清理否则会导致冲突。执行以下命令组sudo apt-get remove docker docker-engine docker.io containerd runc注意apt-get remove不会删除镜像、容器、卷等数据文件它们通常存放在/var/lib/docker/。如果你需要全新开始可以手动删除这个目录sudo rm -rf /var/lib/docker但务必谨慎这会导致所有Docker数据丢失。2.3 安装必备工具与配置APT源为了让安装过程更顺畅我们先安装一些用于HTTPS传输和软件源管理的工具sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release关键一步添加Docker官方GPG密钥和APT软件源。这是为了确保我们从官方渠道获取可信的软件包并享受自动更新。不要使用某些过时教程里第三方源那可能导致版本滞后或安全隐患。添加Docker官方的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的官方签名密钥。设置稳定版stable仓库。以下命令适用于amd64/x86_64架构的Ubuntu。如果你用的是ARM架构如树莓派、苹果M芯片需要将命令中的$(dpkg --print-architecture)部分替换为arm64。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这个命令会根据你的系统版本如jammy自动生成正确的源地址。注意网络环境可能导致curl下载密钥或访问软件源缓慢或失败。如果遇到问题可以尝试重试或检查网络连接。这是第一个常见的坑点。3. Docker引擎的安装与核心配置完成准备工作后就可以开始安装Docker引擎本身了。3.1 执行安装命令首先更新APT包索引使其包含我们新添加的Docker仓库sudo apt-get update然后安装Docker引擎、命令行工具、容器运行时Containerd以及插件组件sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin这里解释一下各个包的作用docker-ce: Docker社区版引擎核心。docker-ce-cli: Docker命令行接口让你能用docker命令与引擎交互。containerd.io: 行业标准的容器运行时Docker底层依赖它来管理容器生命周期。docker-compose-plugin: 这是新的Docker Compose V2作为插件安装通过docker compose命令使用。比独立的Python版Compose更集成、高效。安装过程中APT会解析依赖并提示你确认安装。按下Y并回车继续。3.2 管理Docker服务与开机自启安装完成后Docker服务docker.service不会自动启动。我们需要启动它并设置为开机自启这对于服务器环境尤为重要。# 启动Docker服务 sudo systemctl start docker # 设置Docker服务开机自启 sudo systemctl enable docker # 检查Docker服务状态确认其处于活跃active运行状态 sudo systemctl status docker执行status命令后你应该看到绿色的active (running)字样。如果看到失败failed状态通常需要查看日志排查sudo journalctl -xu docker.service。3.3 非root用户权限配置至关重要默认情况下执行docker命令需要sudo权限。每次命令前都加sudo非常麻烦而且某些图形化工具或IDE集成也会因此失败。安全的做法是将你的用户加入docker用户组。# 将当前登录用户加入docker组 sudo usermod -aG docker $USER重要提示执行此命令后权限变更不会立即生效。你需要完全退出当前终端会话并重新登录或者新开一个终端窗口。之后你就可以直接运行docker命令而不需要sudo了。验证是否成功docker version如果能正常显示Client和Server版本信息说明安装和权限配置都成功了。实操心得很多人配置完用户组后忘记注销重登录然后疑惑为什么还要sudo。这是一个高频“坑点”。另外在生产服务器上请谨慎添加用户到docker组因为这意味着该用户拥有了等同于root的权限docker守护进程以root运行。4. 验证安装与基础操作测试安装完成并配置好权限后我们必须进行测试确保Docker能正常工作。4.1 运行经典测试容器最经典的测试是运行一个简单的hello-world容器docker run hello-world这条命令会执行以下动作Docker客户端联系守护进程。守护进程发现本地没有hello-world镜像。守护进程从默认的Docker Hub仓库拉取pull该镜像。拉取成功后守护进程根据该镜像创建一个新的容器并运行。容器内的程序执行输出一段欢迎信息如 “Hello from Docker!”后退出。如果你能看到完整的欢迎信息恭喜你Docker安装成功4.2 运行一个实用的交互式容器为了进一步测试我们可以运行一个更实用的容器比如Ubuntu容器并与之交互docker run -it --rm ubuntu:22.04 bash参数解释-it:-i保持标准输入打开-t分配一个伪终端合起来让我们可以交互式操作容器。--rm: 容器退出后自动删除其文件系统避免留下无用的停止的容器。ubuntu:22.04: 指定要运行的镜像及其标签。bash: 容器启动后要执行的命令。执行后你会进入容器内部的bash shell。可以尝试运行cat /etc/os-release查看系统信息或者ls /查看根目录。输入exit或按CtrlD退出容器。由于使用了--rm参数这个容器实例会被自动清理。5. 配置优化与镜像加速默认安装的Docker可以工作但针对国内网络环境和个人使用习惯进行一些优化配置能极大提升体验。5.1 配置国内镜像加速器从Docker Hub拉取镜像在境内可能非常缓慢。我们可以配置镜像加速器将拉取请求代理到国内的镜像站点。这里以阿里云镜像加速器为例需要注册阿里云账号获取专属地址其他服务商如腾讯云、网易云镜像中心同理。登录阿里云容器镜像服务控制台在“镜像工具”-“镜像加速器”中找到你的专属加速器地址形如https://xxxx.mirror.aliyuncs.com。编辑Docker守护进程配置文件/etc/docker/daemon.json如果不存在则创建sudo nano /etc/docker/daemon.json输入以下内容将your-mirror-address替换为你的实际地址{ registry-mirrors: [https://your-mirror-address.mirror.aliyuncs.com] }你可以配置多个镜像源用逗号分隔。保存并退出编辑器在nano中按CtrlX然后Y再回车。重新加载配置并重启Docker服务sudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效docker info在输出信息中查找Registry Mirrors部分应该能看到你配置的镜像地址。5.2 数据目录与日志配置可选默认情况下Docker的所有镜像、容器、卷数据都存放在/var/lib/docker日志可能比较庞大。如果你的系统根目录空间不大可以考虑在安装初期就将数据目录迁移到更大的磁盘分区。这通常在初始化安装时规划后期迁移较复杂。此外可以在daemon.json中配置日志驱动和大小限制防止日志撑爆磁盘{ registry-mirrors: [...], log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }这样配置后每个容器的日志文件最大为10MB最多保留3个文件旧的会被自动删除。6. 安装Docker Compose独立版本虽然我们已经安装了docker-compose-plugin使用docker compose命令但有些老项目或脚本可能仍依赖旧的、独立的Python版Docker Compose使用docker-compose命令。为了兼容可以额外安装它。从Docker Compose的GitHub Release页面下载指定版本二进制文件到系统路径是最推荐的方式# 下载最新稳定版请查看GitHub Release页面获取最新版本号 sudo curl -L https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 授予二进制文件可执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version注意事项现在有了docker compose插件版和docker-compose独立版两个命令。它们功能几乎相同但插件版与Docker CLI集成更好无需单独管理。建议新项目优先使用docker compose。7. 常见问题与故障排查实录即使按照教程操作你也可能遇到一些问题。这里记录了我遇到过的典型问题及其解决方案。7.1 安装时依赖包冲突或报错问题描述执行sudo apt-get install docker-ce ...时报错提示某些包无法安装或存在依赖冲突。排查思路确保源正确再次检查/etc/apt/sources.list.d/docker.list文件内容是否正确特别是Ubuntu版本代号。彻底清理旧版本确认之前是否用snap或其他方式安装过Docker运行snap list | grep docker和which docker查看。如果有用sudo snap remove docker移除。更新并修复依赖sudo apt-get update sudo apt-get install -f # 尝试修复依赖 sudo apt-get autoremove # 移除无用包尝试指定版本如果最新版有兼容问题可以列出可用版本并安装一个稍旧的稳定版apt-cache madison docker-ce # 列出可用版本 sudo apt-get install docker-ceVERSION_STRING docker-ce-cliVERSION_STRING containerd.io7.2 Docker服务启动失败问题描述sudo systemctl status docker显示状态为failed。排查步骤查看详细日志这是最重要的步骤。sudo journalctl -xu docker.service --no-pager -n 50日志通常会明确指出问题例如权限问题/var/run/docker.sock权限不对。存储驱动问题overlay2驱动所需的内核模块未加载或文件系统不支持。cgroup问题与systemd的cgroup管理器不兼容。检查存储驱动Ubuntu通常使用overlay2。确保你的内核版本支持并且/var/lib/docker所在文件系统是支持的如ext4, xfs。可以尝试在/etc/docker/daemon.json中明确指定{ storage-driver: overlay2 }检查防火墙如果使用了UFW等防火墙确保没有阻止Docker的网络流量。Docker会操作iptables规则有时与UFW冲突。可以考虑在UFW中为Docker放行或调整Docker的iptables策略。7.3 用户加入docker组后仍无权限问题描述执行usermod命令并重新登录后运行docker ps仍报错Got permission denied。排查步骤确认用户是否在组中groups $USER查看输出是否包含docker。重启Docker服务有时需要sudo systemctl restart docker检查/var/run/docker.sock的权限ls -l /var/run/docker.sock通常应该是srw-rw---- 1 root docker ...。如果你的用户不在docker组或者该文件权限异常就会出错。可以尝试手动更改组sudo chown root:docker /var/run/docker.sock终极方案如果以上都不行尝试完全注销图形界面或SSH会话然后重新登录而不仅仅是新开一个终端标签页。7.4 拉取镜像速度极慢或超时问题描述docker pull速度很慢甚至卡住不动最终超时。解决方案确认镜像加速器配置正确严格按照5.1节步骤操作并确保docker info中显示了你的镜像地址。尝试其他镜像源在daemon.json的registry-mirrors数组中添加多个国内源Docker会依次尝试。检查DNSDocker拉取镜像需要域名解析。可以尝试修改Docker的DNS设置在daemon.json中加入{ dns: [8.8.8.8, 114.114.114.114] }然后重启Docker服务。直接使用国内镜像仓库对于一些常用镜像如ubuntu,nginx,redis可以直接从阿里云、腾讯云的公开镜像仓库拉取例如docker pull registry.cn-hangzhou.aliyuncs.com/library/ubuntu:22.047.5 运行容器时端口冲突或无法访问问题描述使用-p 80:80映射端口时报错port is already allocated或者映射后从宿主机无法访问容器服务。排查思路检查端口占用sudo ss -tulpn | grep :80查看是哪个进程占用了宿主机的80端口。检查防火墙宿主机防火墙如UFW可能阻止了对外部访问的放行。需要允许该端口sudo ufw allow 80/tcp理解网络模式默认的bridge网络下-p参数会将容器端口映射到宿主机所有接口0.0.0.0。如果你只想映射到本地回环可以指定-p 127.0.0.1:80:80。8. 进阶配置与日常使用建议完成基础安装和排错后这里有一些进阶配置和使用习惯的建议能让你的Docker体验更上一层楼。8.1 配置日志轮转与资源限制Docker默认的日志如果不加管理会无限增长。除了在daemon.json中全局配置也可以在运行容器时单独指定日志选项docker run --log-opt max-size10m --log-opt max-file3 your-image对于资源限制避免某个容器耗尽所有资源影响宿主机# 限制容器最多使用1个CPU核心和512MB内存 docker run -it --cpus1.0 --memory512m ubuntu:22.04 bash8.2 使用别名简化常用命令你可以将一些常用的、冗长的Docker命令设置为Shell别名添加到~/.bashrc或~/.zshrc中# 查看所有容器包括已停止的 alias dpsdocker ps -a # 查看所有镜像 alias dimgdocker images # 停止所有运行中的容器 alias dstopdocker stop $(docker ps -q) # 删除所有已停止的容器 alias drmdocker rm $(docker ps -aq) # 删除所有悬空镜像未被任何容器引用的中间层镜像 alias dprunedocker image prune -f8.3 数据持久化与卷管理的最佳实践容器本身是无状态的删除容器后其内部产生的数据也会丢失。持久化数据有几种方式绑定挂载Bind Mount将宿主机目录直接挂载到容器。适合开发环境修改即时同步。docker run -v /path/on/host:/path/in/container your-image命名卷Named Volume由Docker管理的存储卷与宿主机路径解耦是生产环境更推荐的方式。docker run -v my-data-volume:/path/in/container your-image卷可以通过docker volume create创建和管理。Dockerfile中的VOLUME指令在镜像构建时声明匿名卷提醒运行时应挂载外部存储。核心建议对于数据库如MySQL、配置文件、应用日志等需要持久化的数据务必使用-v参数进行挂载切勿依赖容器内部存储。8.4 镜像构建与Dockerfile基础学会使用Docker后下一步就是构建自己的镜像。Dockerfile是构建镜像的蓝图。一个简单的Python应用Dockerfile示例如下# 使用官方Python轻量级镜像作为基础 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 将当前目录的依赖文件复制到容器工作目录 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 声明容器运行时监听的端口 EXPOSE 8080 # 定义容器启动时执行的命令 CMD [python, app.py]构建镜像docker build -t my-python-app .运行容器docker run -p 8080:8080 my-python-app掌握Dockerfile的编写你才能真正发挥Docker的威力实现应用环境的标准化封装。