资讯动态

Ubuntu系统Docker与Docker Compose完整安装配置指南

发布时间:2026/8/13 6:36:36 来源:尧图企业网站定制
1. 项目概述为什么要在Ubuntu上部署Docker生态如果你是一名开发者、运维工程师或者正在学习云原生和微服务那么Docker几乎是你绕不开的工具。它通过容器化技术将应用及其所有依赖打包成一个标准化的单元实现了“一次构建处处运行”的梦想。而Ubuntu作为最流行、社区支持最完善的Linux发行版之一自然是运行Docker的绝佳平台。今天要聊的就是在Ubuntu系统上从零开始完整地安装Docker引擎以及其核心搭档docker-compose的全过程。这不仅仅是一个简单的“复制粘贴命令”的教程。我会带你理解每一个步骤背后的逻辑为什么官方推荐用仓库安装而不是下载deb包安装后那些看似“多余”的配置操作究竟有何深意docker-compose作为一个独立的Python工具其安装方式又有哪些门道和陷阱通过这篇详细的图文指南你不仅能顺利完成安装更能建立起一套清晰、可复现的部署方法论避免未来在开发、测试或生产环境中踩坑。无论你是刚接触Linux的新手还是想梳理一遍标准化流程的老手这份指南都值得你仔细阅读。2. 核心需求与方案选型解析在开始动手之前我们得先想清楚两个问题我们要装什么以及为什么选择这套方案2.1 Docker引擎社区版与企业版之选Docker分为Docker Engine - Community (Docker CE) 和 Docker Engine - Enterprise (Docker EE)。对于绝大多数个人开发者、测试环境乃至中小型生产环境Docker CE完全足够。它免费、开源并且包含了构建和运行容器所需的核心功能。我们本次安装的目标就是Docker CE。为什么不从Ubuntu默认的软件源安装因为Ubuntu官方源中的Docker版本可能比较旧无法享受到最新的功能和安全更新。Docker官方维护了自己的APT软件仓库能确保我们获取到最新稳定版的Docker CE。这是官方推荐且最可靠的安装方式。2.2 Docker Compose独立工具而非内置命令一个常见的误解是docker-compose是Docker引擎的一部分。实际上它是一个用Python编写的独立命令行工具用于定义和运行多容器的Docker应用。通过一个docker-compose.yml文件你可以配置整个应用的服务、网络、卷等然后用一条命令启动所有服务。它的安装方式相对灵活主要有两种通过Python的pip包管理器安装这是最传统的方式。但前提是你的系统需要有Python和pip环境。直接下载编译好的二进制文件这是目前官方更推荐的方式尤其是对于生产环境。它不依赖系统Python环境独立性强版本管理也更清晰。考虑到环境纯净性和易维护性我们将采用第二种方式——直接下载二进制文件进行安装。2.3 系统准备确认架构与清理旧版本在Ubuntu上安装软件首先要确认系统架构。虽然现在绝大多数PC和服务器都是x86_64也称为amd64架构但在树莓派或某些边缘设备上可能是arm架构。下载错误架构的软件包会导致安装失败。另一个至关重要的前置步骤是清理系统中可能存在的旧版本Docker。这些旧版本可能被称为docker,docker.io, 或docker-engine。它们如果存在会与新安装的Docker CE产生冲突导致不可预知的问题。因此彻底的清理是安装成功的第一步保障。3. 详细安装步骤与实操要点接下来我们进入实战环节。请打开你的Ubuntu终端跟随步骤一步步操作。我使用的是Ubuntu 22.04 LTS但步骤适用于20.04、22.04等主流版本。3.1 步骤一卸载旧版本与依赖更新首先我们需要以管理员权限sudo运行命令来移除所有旧的Docker相关包。sudo apt-get remove docker docker-engine docker.io containerd runc执行这条命令后系统会列出将要移除的软件包并请求确认按Y并回车即可。这里移除的containerd和runc是低版本的容器运行时我们后续会安装Docker官方提供的新版本。注意apt-get remove会移除软件包但保留配置文件。如果你希望彻底清除包括配置文件可以使用sudo apt-get purge docker docker-engine docker.io containerd runc。但通常remove已足够。旧版本清理完毕后更新一下APT软件包索引并安装一些允许APT通过HTTPS使用仓库的必要工具sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-releaseca-certificates用于确保系统能识别和信任HTTPS连接的数字证书。curl命令行下载工具后续我们会用它来下载密钥和二进制文件。gnupg加密工具用于验证下载软件包的签名。lsb-release一个工具可以方便地获取系统发行版信息。3.2 步骤二添加Docker官方GPG密钥与APT仓库为了保证软件来源的安全性和真实性我们需要添加Docker官方的GPGGNU Privacy Guard密钥。这个密钥用于验证从Docker仓库下载的软件包签名。创建密钥环目录如果不存在并添加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.gpgcurl -fsSL-f表示静默失败-s静默模式-S显示错误-L跟随重定向。组合使用是为了稳定地下载。gpg --dearmor将下载的ASCII格式的GPG密钥转换为二进制格式并存放到指定位置。设置仓库地址。这里需要根据你的系统架构来设置。首先查看你的系统架构arch如果输出是x86_64那么架构就是amd64。如果是aarch64则是arm64。确定后使用以下命令设置仓库。以下以amd64为例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$(dpkg --print-architecture)自动获取当前系统的架构。$(lsb_release -cs)自动获取当前Ubuntu的代号如jammy for 22.04。signed-by/etc/apt/keyrings/docker.gpg明确指定用于验证此仓库的密钥位置。tee命令将echo输出的内容写入文件同时 /dev/null避免在终端重复显示。3.3 步骤三安装Docker引擎添加仓库后再次更新APT源然后就可以安装Docker了。sudo apt-get update 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插件docker compose注意命令中是空格而非横杠。它比独立的docker-compose二进制文件集成度更高。但考虑到历史项目和使用习惯我们后面还是会安装独立的docker-compose。安装完成后Docker服务会自动启动。你可以运行一个测试命令来验证安装是否成功sudo docker run hello-world这个命令会从Docker Hub拉取一个名为hello-world的极简镜像并在容器内运行它。如果终端打印出“Hello from Docker!”等欢迎信息说明Docker引擎已经安装并运行正常。3.4 步骤四管理用户组免sudo执行docker命令默认情况下执行docker命令需要sudo权限。这很不方便也存在安全风险相当于赋予了容器root权限。更佳实践是将当前用户加入docker用户组。sudo groupadd docker # 如果docker组不存在则创建通常安装时会自动创建 sudo usermod -aG docker $USER关键操作usermod -aG中的-a代表追加append-G指定附加组。这条命令的意思是将当前用户$USER追加到docker组中。重要提示组权限的变更不会立即生效于当前已登录的会话。你必须完全注销当前用户然后重新登录或者开启一个新的终端窗口如果终端支持重新加载组信息有些需要重启终端程序新的组权限才会生效。重新登录后你可以不使用sudo直接运行docker ps来验证docker ps如果显示容器列表目前应为空而没有权限错误说明配置成功。3.5 步骤五安装独立版Docker Compose虽然我们已经安装了官方的Compose插件docker compose但许多现有脚本、教程和CI/CD流程仍在使用独立的docker-compose带横杠。为了兼容性我们将其一并安装。如前所述我们采用下载二进制文件的方式。首先访问 Docker Compose的GitHub发布页面 查看最新稳定版本号。假设当前最新版本是v2.20.0。下载二进制文件到/usr/local/bin/目录这个目录通常位于系统的可执行路径中。sudo curl -L https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose-L: 跟随重定向。$(uname -s): 获取系统内核名称如Linux。$(uname -m): 获取机器硬件名称如x86_64。-o: 指定输出文件路径。授予可执行权限sudo chmod x /usr/local/bin/docker-compose验证安装docker-compose --version如果安装成功会输出类似Docker Compose version v2.20.0的版本信息。4. 安装后的关键配置与优化安装完成只是第一步合理的配置能让Docker用起来更顺手、更高效、更安全。4.1 配置镜像加速器默认情况下Docker会从Docker Hub拉取镜像。对于国内用户这可能会非常慢。配置一个国内镜像加速器可以极大提升拉取速度。国内常用的加速器地址有Docker中国官方镜像https://registry.docker-cn.com中科大镜像https://docker.mirrors.ustc.edu.cn阿里云加速器需要注册账号后获取专属地址这里以配置Docker中国官方镜像为例。我们需要编辑Docker的守护进程配置文件/etc/docker/daemon.json。如果文件不存在就创建它。sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://registry.docker-cn.com] } EOFtee命令配合Here Document-EOF可以方便地将多行内容写入文件。写入后需要重启Docker服务使配置生效sudo systemctl restart docker重启后可以运行docker info在输出结果的末尾如果看到Registry Mirrors部分包含了你设置的地址说明配置成功。4.2 调整Docker数据存储路径可选默认情况下Docker的镜像、容器、卷等数据都存储在/var/lib/docker目录。如果系统根分区空间不足你可能需要将其迁移到大容量的数据盘上。这是一个需要谨慎操作的高级步骤操作前务必备份数据假设你想将数据迁移到/data/docker目录停止Docker服务sudo systemctl stop docker复制原有数据sudo rsync -avz /var/lib/docker/ /data/docker/备份原目录可选但建议sudo mv /var/lib/docker /var/lib/docker.backup创建软链接sudo ln -s /data/docker /var/lib/docker启动Docker服务sudo systemctl start docker4.3 设置Docker服务开机自启对于服务器环境我们通常希望Docker在系统启动时自动运行。sudo systemctl enable docker.service sudo systemctl enable containerd.service执行后你会看到“Created symlink ...”的提示表示已创建系统启动时的服务链接。5. 基础验证与常用命令速览安装配置完成后我们通过几个核心命令来验证环境并熟悉基本操作。5.1 核心状态检查命令docker version: 显示Docker客户端和服务器引擎的版本信息。这是检查安装是否成功的最直接命令。docker info: 显示详细的系统级Docker信息包括容器/镜像数量、存储驱动、CPU/内存总量、注册镜像地址等。配置镜像加速器后应在此命令输出中看到。systemctl status docker: 检查Docker服务的运行状态。看到active (running)且为绿色即可。5.2 镜像与容器生命周期管理拉取镜像docker pull nginx:latest拉取最新的Nginx镜像运行容器docker run -d --name my-nginx -p 8080:80 nginx后台运行一个名为my-nginx的容器将宿主机的8080端口映射到容器的80端口。docker run -it ubuntu:22.04 /bin/bash以交互模式运行一个Ubuntu容器并进入其bash shell。查看容器docker ps: 查看正在运行的容器。docker ps -a: 查看所有容器包括已停止的。停止/启动/重启容器docker stop my-nginxdocker start my-nginxdocker restart my-nginx进入运行中的容器docker exec -it my-nginx /bin/bash删除容器/镜像docker rm my-nginx: 删除已停止的容器加-f可强制删除运行中的容器。docker rmi nginx:latest: 删除镜像需先删除依赖它的容器。5.3 Docker Compose初体验创建一个简单的docker-compose.yml文件来体验其威力。假设我们要启动一个WordPress博客它依赖一个MySQL数据库。创建一个项目目录并进入mkdir my-wordpress cd my-wordpress创建docker-compose.yml文件version: 3.8 services: db: image: mysql:8.0 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: some_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress_password wordpress: depends_on: - db image: wordpress:latest volumes: - wp_data:/var/www/html ports: - 8000:80 restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress volumes: db_data: wp_data:在项目目录下一键启动所有服务docker-compose up -d-d参数代表在后台运行。打开浏览器访问http://你的服务器IP:8000你应该能看到WordPress的安装界面。而这一切只需要一个YAML文件和一条命令。停止并清理服务docker-compose down这会停止并移除容器、网络但会保留volumes中定义的数据卷db_data和wp_data。如果想连数据卷一起删除使用docker-compose down -v。6. 常见问题与故障排查实录即便按照步骤操作你也可能会遇到一些问题。这里记录了几个最常见的问题和解决方法。6.1 安装Docker时提示“无法定位软件包 docker-ce”问题现象执行sudo apt-get install docker-ce时报错E: Unable to locate package docker-ce。排查思路仓库未添加成功首先检查/etc/apt/sources.list.d/docker.list文件是否存在且内容正确。确保架构和系统代号无误。APT源索引未更新执行sudo apt-get update仔细查看输出看是否有关于Docker仓库的错误信息如404 Not Found。这通常意味着你的系统架构或版本代号在Docker仓库中不存在对应的包。确认$(lsb_release -cs)的输出如jammy是Docker官方支持的Ubuntu版本。GPG密钥问题如果update时有GPG密钥错误可以尝试重新添加密钥并确保/etc/apt/keyrings/docker.gpg文件权限正确应为644。6.2 执行docker命令报错“权限被拒绝”问题现象运行docker ps时提示Got permission denied while trying to connect to the Docker daemon socket。排查思路用户未加入docker组运行groups命令查看当前用户所属组列表中是否有docker。如果没有请执行sudo usermod -aG docker $USER。组权限未生效这是最常见的原因。执行完usermod命令后必须注销并重新登录或者启动一个新的登录会话如打开一个新的终端标签页或窗口。仅仅关闭再打开同一个终端窗口通常是不够的。Docker服务未运行运行sudo systemctl status docker确保服务是active (running)状态。6.3 Docker Compose命令未找到或版本不对问题现象执行docker-compose --version提示command not found或者版本号与预期不符。排查思路路径问题确认/usr/local/bin是否在你的$PATH环境变量中。可以执行echo $PATH查看。通常它都在。文件权限确认/usr/local/bin/docker-compose文件具有可执行权限ls -l /usr/local/bin/docker-compose应显示-rwxr-xr-x。命令混淆注意区分docker-compose独立二进制文件带横杠和docker composeDocker CLI插件空格。我们安装的是前者。如果输入docker-compose提示未找到请检查安装步骤。如果系统同时存在两者它们可能版本不同。下载的二进制文件损坏或不匹配确保下载链接中的$(uname -s)和$(uname -m)能正确解析为Linux和x86_64或aarch64。可以尝试手动拼接URL并在浏览器中测试是否能下载。6.4 镜像拉取速度极慢或失败问题现象docker pull命令长时间卡住或报网络错误。排查思路镜像加速器未生效运行docker info检查Registry Mirrors是否已正确配置为你设置的加速器地址。如果未生效检查/etc/docker/daemon.json文件格式是否正确必须是合法的JSON然后重启Docker服务。加速器地址失效有些公共加速器地址可能会变更或失效。可以尝试更换为其他加速器地址如阿里云需申请、腾讯云等。DNS解析问题尝试ping registry-1.docker.io看是否能解析并连通。如果不能可能是系统DNS设置问题可以尝试修改/etc/resolv.conf将DNS服务器设置为8.8.8.8或114.114.114.114。6.5 运行容器时端口冲突问题现象运行docker run -p 80:80 ...时提示Bind for 0.0.0.0:80 failed: port is already allocated。排查思路查看端口占用在宿主机上运行sudo ss -tulnp | grep :80查看是哪个进程占用了80端口。停止冲突服务如果是Nginx、Apache等Web服务器可以暂时停止它们sudo systemctl stop nginx。更换宿主机端口如果80端口必须被其他服务使用可以修改-p参数例如-p 8080:80将容器内的80端口映射到宿主机的8080端口。7. 进阶配置与生产环境考量对于个人开发环境上述配置基本足够。但如果用于团队协作或生产环境还需要考虑更多。7.1 日志驱动与日志管理默认情况下Docker容器的日志即容器内进程的标准输出和错误输出会以JSON格式存储在宿主机的/var/lib/docker/containers/容器ID/容器ID-json.log文件中。如果不加管理日志文件会无限增长占用大量磁盘空间。可以在/etc/docker/daemon.json中配置全局的日志驱动和日志轮转策略{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, registry-mirrors: [https://registry.docker-cn.com] }max-size: 单个日志文件的最大大小超过则轮转。max-file: 保留的旧日志文件最大数量。修改后需重启Docker服务。你也可以在运行单个容器时通过--log-opt参数覆盖全局设置。7.2 存储驱动选择Docker支持多种存储驱动如overlay2,aufs,devicemapper等用于管理镜像和容器的分层数据。对于Ubuntu默认且推荐的是overlay2它性能好且稳定。通常不需要更改。你可以通过docker info查看当前的存储驱动。7.3 资源限制与监控为了防止单个容器耗尽宿主机资源可以在运行容器时设置资源限制-m 或 --memory: 限制容器使用的最大内存如-m 512m。--memory-swap: 内存和交换分区的总限制。--cpus: 限制容器可以使用的CPU核心数如--cpus1.5表示最多使用1.5个核心的计算能力。对于运行中的容器可以使用docker stats命令实时查看所有容器的CPU、内存、网络IO等资源使用情况。7.4 安全最佳实践非Root用户运行容器在Dockerfile中使用USER指令指定一个非root用户来运行应用进程。定期更新定期运行sudo apt-get update sudo apt-get upgrade docker-ce docker-ce-cli containerd.io来更新Docker及其组件修复安全漏洞。审计镜像来源尽量使用官方镜像或可信来源的镜像。对于自定义镜像定期扫描漏洞可以使用docker scan命令或集成到CI/CD流程中。限制容器能力使用--cap-drop和--cap-add来精细控制容器拥有的Linux内核能力遵循最小权限原则。例如可以丢弃所有能力只添加必要的docker run --cap-dropALL --cap-addNET_BIND_SERVICE ...。8. 从Docker Compose到Docker Compose Plugin你可能注意到我们安装了两个Compose相关的东西独立的docker-compose和作为Docker CLI插件的docker compose插件在安装docker-ce-cli时可能已包含或通过docker-compose-plugin包安装。两者的主要区别命令格式独立版是docker-compose带横杠插件版是docker compose空格。集成度插件版与Docker CLI集成更紧密共享配置和上下文体验更统一。更新方式独立版需要手动下载二进制文件更新插件版可以通过系统包管理器如apt随Docker一起更新。功能插件版v2重写了代码性能更好并逐渐增加了一些新特性。建议对于新项目和新学习可以尝试直接使用docker compose插件命令。对于已有的、使用docker-compose命令的脚本和文档为了兼容性可以继续使用独立版。你甚至可以在系统中共存两者根据习惯选择使用。要检查是否安装了插件可以运行docker compose version如果输出版本信息则说明插件已安装。至此你已经在Ubuntu系统上成功搭建了一个功能完整、配置优化的Docker开发环境。这套环境不仅能用于本地学习和开发其严谨的安装和配置步骤也同样适用于云服务器上的生产环境部署。理解每一步背后的原理能让你在遇到问题时从容应对真正将Docker这个强大的工具为己所用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价