
1. 项目概述为什么要在Linux上部署Docker如果你是一名运维工程师、后端开发者或者正在学习云原生技术那么“在Linux上安装Docker”几乎是你绕不开的第一个实操环节。这听起来像是一个简单的命令集合但背后涉及的是从传统虚拟化到容器化思维的转变。我见过太多新手卡在权限、镜像源或者网络配置这些“小问题”上折腾半天。这篇内容就是把我这些年在一线环境从个人测试机到生产服务器部署Docker的经验、踩过的坑和优化技巧系统地梳理给你。简单说Docker是一个开源的容器引擎它能让你的应用及其所有依赖库、环境变量、配置文件打包成一个标准化的“集装箱”即容器。这个集装箱可以在任何安装了Docker的Linux机器上无缝运行彻底解决了“在我机器上好好的”这个经典难题。在Linux上部署它是发挥其轻量、高效、一致性的最佳舞台。无论你是想在Ubuntu上快速搭建一个开发环境还是在CentOS生产服务器上部署微服务这篇超详细的指南都会手把手带你走通全流程并告诉你每一步背后的“所以然”。2. 部署前的核心准备与规划在敲下第一个安装命令之前花十分钟做好规划能避免后面百分之八十的麻烦。这个阶段的核心是选择合适的Linux发行版并做好系统层面的准备。2.1 系统环境选择与考量Docker官方支持主流的Linux发行版但不同发行版的包管理工具和内核版本策略不同这直接影响了安装方式和后续维护。Ubuntu/Debian系列这是最友好、社区资源最丰富的选择。特别是Ubuntu LTS长期支持版本如20.04 LTS或22.04 LTS内核较新软件源对Docker支持完善适合绝大多数开发和生产环境。使用apt包管理器。CentOS/RHEL/Fedora系列常见于企业生产环境更强调稳定性。CentOS 7/8 Stream或RHEL 8都是不错的选择。需要注意的是CentOS 7默认内核版本可能较低需要升级到3.10以上。使用yum或dnf包管理器。其他发行版如Alpine Linux因其极度轻量仅5MB左右常被用作Docker容器的基础镜像。但在宿主机上直接安装Docker Engine还是建议用上述主流发行版。我的经验是对于新手和个人项目优先选择Ubuntu LTS如果公司环境是CentOS/RHEL则需熟悉其firewalld和SELinux的配置这两者可能会影响容器网络和文件访问。2.2 宿主机资源与内核检查Docker对宿主机有一定要求提前检查可以避免安装失败。内核版本检查运行uname -r。Docker要求内核版本至少为3.1064位。现代发行版通常都满足但老旧的CentOS 7可能需要更新内核yum update kernel。存储驱动支持Docker需要特定的存储驱动来管理镜像和容器的分层数据。运行ls -l /sys/class/misc/device-mapper检查device-mapper是否存在这是overlay2等存储驱动的基础。overlay2是目前推荐且性能最好的驱动需要内核版本4.0以上。资源规划磁盘空间/var/lib/docker是Docker默认的工作目录存放所有镜像、容器、卷和网络配置数据。建议预留至少20GB空间。对于生产环境强烈建议将这个目录挂载到独立的、容量较大的磁盘分区或逻辑卷上。内存与CPU视容器内应用需求而定。但宿主机本身需要预留资源。一个基本的建议是宿主机内存不少于2GBCPU不少于2核。一个关键操作更新系统软件包。这能确保你从干净的基线开始。# 对于Ubuntu/Debian sudo apt update sudo apt upgrade -y # 对于CentOS/RHEL sudo yum update -y3. 三种安装方式深度解析与选型Docker提供了多种安装途径没有绝对的好坏只有适合与否。理解它们的区别能让你在遇到问题时知道从何入手。3.1 使用官方仓库安装推荐方式这是最官方、最便于后续升级和维护的方式。原理是将Docker的官方软件仓库地址添加到你的系统源列表然后通过系统自带的包管理器安装。好处是能自动处理依赖并方便地接收安全更新。为什么推荐它版本可控你可以选择安装最新的稳定版、测试版甚至指定某个历史版本。自动更新可以和系统其他软件一起通过apt upgrade或yum update进行更新。官方支持遇到问题官方文档的解决思路通常基于此方式。其核心步骤分为三部分安装必要的工具让系统能通过HTTPS使用仓库。添加Docker的官方GPG密钥用于验证软件包的签名确保来源可信且未被篡改。设置稳定的仓库告诉包管理器去哪里找Docker的安装包。3.2 使用便捷脚本安装快速体验Docker官方提供了一个get-docker.sh脚本。执行一条命令脚本会自动检测你的系统并完成所有安装步骤。这听起来很美好但我强烈不建议在生产环境或需要长期维护的主机上使用。为什么不推荐缺乏透明性脚本自动执行了大量操作你无法精确控制它做了什么比如安装了哪些依赖、修改了哪些配置。升级麻烦通过脚本安装后升级通常也需要通过脚本不如包管理器方便。安全风险虽然脚本来自官方但直接运行来自网络的脚本本身就有一定风险尽管可以审计其内容。它的适用场景快速搭建一个临时的测试或演示环境用完即弃。3.3 手动下载DEB/RPM包安装离线环境在某些严格的内网或离线环境中无法连接外部仓库。这时就需要提前在有网的机器上下载好Docker引擎及其所有依赖的安装包.deb或.rpm文件然后拷贝到目标服务器进行手动安装。操作要点访问Docker的官方下载页面找到对应你系统版本和架构的引擎包和依赖包。使用dpkg -iDebian系或rpm -ivhRHEL系命令按顺序安装。依赖关系需要手动处理非常繁琐。这种方式难以升级和维护是不得已而为之的选择。我的建议对于绝大多数情况请坚定不移地选择3.1 使用官方仓库安装。下面的详细实操也将以此为主线。4. 基于官方仓库的详细安装实操以Ubuntu 22.04为例让我们进入实战环节。这里以Ubuntu 22.04 LTS为例因为其用户群体最广。其他系统的命令我会在注释中说明差异。4.1 卸载旧版本如有这是一个好习惯避免残留的旧版本文件与新版本冲突。sudo apt remove docker docker-engine docker.io containerd runc注意apt remove不会删除镜像、容器、卷等用户数据它们通常存放在/var/lib/docker。4.2 安装依赖工具与添加仓库# 1. 安装基础工具允许apt通过HTTPS使用仓库 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # 2. 添加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 # 3. 设置稳定版仓库 # 这条命令会创建一个源列表文件告诉apt去哪里找Docker 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关键点解释signed-by明确指定了用于验证的GPG密钥环文件路径这是更安全的做法。$(lsb_release -cs)这个子命令会自动获取你当前系统的代号如jammy对应Ubuntu 22.04。这确保了仓库与系统版本匹配。对于CentOS/RHEL 8添加仓库的命令类似但用的是yum-config-manager工具仓库地址也不同。4.3 安装Docker引擎# 更新apt包索引使其能识别新添加的Docker仓库 sudo apt update # 安装Docker引擎、命令行工具、容器运行时containerd sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugindocker-ce社区版引擎本体。docker-ce-cli命令行工具让你能执行docker命令。containerd.io行业标准的容器运行时Docker引擎底层依赖它来管理容器生命周期。docker-compose-plugin这是新的docker composeV2版本作为插件安装。用于通过YAML文件定义和运行多容器应用。4.4 安装后的基础验证与配置安装完成后不要急着跑应用先做这几件事启动Docker服务并设置开机自启sudo systemctl start docker sudo systemctl enable docker运行一个测试容器sudo docker run hello-world如果看到“Hello from Docker!”等欢迎信息说明引擎、镜像拉取、容器运行整个链条都通了。这是最经典的“冒烟测试”。非常重要将当前用户加入docker组 默认情况下执行docker命令需要sudo权限。这很不方便也不安全。解决方案是将你的用户加入docker用户组。sudo usermod -aG docker $USER操作后你必须完全退出当前终端会话关闭终端或输入exit然后重新登录这个组权限变更才会生效。之后你就可以直接运行docker ps而不需要sudo了。5. 核心配置调优与国内镜像加速默认安装的Docker能用但未必好用。针对国内网络环境和生产需求必须进行一些关键配置。5.1 配置国内镜像加速器从Docker Hub拉取镜像在国内速度可能很慢甚至失败。配置一个镜像加速器是必选项。编辑Docker守护进程的配置文件。对于Linux通常是/etc/docker/daemon.json如果不存在就创建它。sudo vim /etc/docker/daemon.json输入以下内容以阿里云镜像加速器为例你需要去阿里云容器镜像服务控制台免费获取专属加速器地址{ registry-mirrors: [https://your-aliyun-mirror.mirror.aliyuncs.com], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker }保存退出后重启Docker服务使配置生效sudo systemctl daemon-reload sudo systemctl restart docker配置项详解registry-mirrors镜像加速器地址。也可以配置多个Docker会按顺序尝试。exec-opts:native.cgroupdriversystemd对于使用systemd作为初始化系统的发行版如Ubuntu 16.04 CentOS 7建议设置此项确保Docker与系统在资源管理上一致避免出现警告。log-driver和log-opts配置容器日志驱动为json-file并限制单个日志文件最大100MB最多保留3个文件防止日志撑爆磁盘。>命令作用常用参数示例docker pull nginx拉取镜像:latest标签可省略docker images列出本地镜像-a显示所有包括中间层docker run -d -p 80:80 nginx后台运行容器并映射端口-d后台-p端口映射docker ps查看运行中的容器-a查看所有容器docker stop 容器ID停止容器用前几位ID即可docker rm 容器ID删除已停止的容器-f强制删除运行中的docker logs 容器ID查看容器日志-f实时跟踪docker exec -it 容器ID bash进入容器内部-it交互式终端一个实战例子运行一个Nginx web服务器。# 拉取镜像如果本地没有 docker pull nginx:alpine # alpine版本更小巧 # 运行容器将宿主机的8080端口映射到容器的80端口 docker run -d --name my-nginx -p 8080:80 nginx:alpine # 此时在浏览器访问 http://你的服务器IP:8080 就能看到Nginx欢迎页 # 查看容器日志 docker logs my-nginx # 进入容器内部看看 docker exec -it my-nginx /bin/sh # alpine镜像用sh不是bash7. 进阶部署Docker Compose与生产环境考量单容器应用只是开始现实中的应用往往由多个容器组成如Web应用数据库缓存。docker-compose现在作为插件docker compose就是用来定义和运行多容器应用的工具。7.1 使用Docker Compose编排应用假设我们有一个简单的WordPress应用需要MySQL数据库。创建一个项目目录并在其中创建docker-compose.yml文件version: 3.8 # 指定Compose文件格式版本 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 networks: - wp-network wordpress: depends_on: - db image: wordpress:latest ports: - 8080:80 restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html networks: - wp-network volumes: db_data: wp_data: networks: wp-network: driver: bridge在该目录下一键启动所有服务docker compose up -d # 注意是compose不是docker-compose-d表示后台运行。这条命令会拉取镜像如果本地没有创建网络、卷并按依赖顺序启动容器。管理服务docker compose down # 停止并移除所有容器、网络默认保留卷 docker compose ps # 查看本项目下的容器状态 docker compose logs -f wordpress # 跟踪WordPress容器的日志7.2 生产环境安全与维护要点在个人环境玩玩没问题但上生产必须谨慎。非Root用户运行我们已经通过docker组让普通用户能操作Docker但这仍有风险。更安全的方式是使用用户命名空间映射或者在容器内以非root用户运行应用在Dockerfile中用USER指令。资源限制防止单个容器耗尽宿主机资源。在docker run或compose文件中使用--memory、--cpus等参数限制容器的CPU和内存使用。docker run -d --memory512m --cpus1.5 nginx日志轮转与监控我们之前在daemon.json里配置了日志大小限制。生产环境还需要将日志收集到中心化系统如ELK进行监控和分析。镜像安全扫描定期使用docker scan命令集成Snyk或第三方工具扫描本地镜像中的已知漏洞。备份与恢复定期备份重要的Docker卷Volume数据。卷是持久化容器数据的最佳方式其物理路径通常在/var/lib/docker/volumes/下。8. 常见问题与故障排查实录即使按照步骤来也可能会遇到问题。这里记录几个我高频遇到的坑和解决办法。8.1 权限问题Got permission denied while trying to connect现象执行docker ps等命令时报错权限被拒绝。原因当前用户不在docker组内或者已加入组但未重新登录会话。解决确认用户已加入docker组groups $USER查看输出是否包含docker。如果已加入务必退出当前终端并重新登录。如果未加入执行sudo usermod -aG docker $USER后再执行第2步。8.2 镜像拉取失败或极慢现象docker pull卡住或报错net/http: TLS handshake timeout。原因网络连接Docker Hub不稳定或被阻。解决首要检查是否已正确配置国内镜像加速器/etc/docker/daemon.json。配置后必须重启Docker服务。测试加速器是否生效docker info在输出中查找Registry Mirrors看你的加速器地址是否在列。可以尝试更换其他加速器如中科大、网易云等。8.3 端口冲突问题现象docker run -p 80:80 ...时报错Bind for 0.0.0.0:80 failed: port is already allocated。原因宿主机80端口已被其他程序如Nginx, Apache占用。解决找出占用端口的进程sudo ss -tulnp | grep :80或sudo lsof -i:80。要么停止那个进程要么修改Docker容器的端口映射例如改为-p 8080:80。8.4 容器内无法解析域名现象在容器内ping www.baidu.com失败但ping 8.8.8.8通。原因Docker容器的DNS配置有问题。解决临时进入容器修改/etc/resolv.conf不是好办法重启会失效。最佳实践是在创建容器时指定DNS服务器或修改Docker守护进程的默认DNS。 编辑/etc/docker/daemon.json添加{ dns: [8.8.8.8, 114.114.114.114] }重启Docker服务。8.5 磁盘空间不足现象docker命令报错no space left on device。原因/var/lib/docker所在分区满了通常是镜像、容器日志或未使用的数据累积过多。解决清理无用资源docker system prune -a # 谨慎使用会删除所有停止的容器、未被任何容器使用的网络、悬空镜像、构建缓存。可以先运行docker system df查看磁盘使用详情。定期清理日志如果单个容器日志过大除了全局配置也可以在运行容器时用--log-opt max-size10m --log-opt max-file3参数限制。长远之计规划好数据目录将其放在独立的大容量分区上。安装部署只是第一步理解Docker的哲学并善用它才能真正提升开发和运维的效率。从今天起尝试把你的下一个项目用Docker容器跑起来吧。