Linux系统Docker部署全攻略:从环境准备到生产优化
2026/8/5 7:25:20 网站建设 项目流程

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以上。使用yumdnf包管理器。
  • 其他发行版:如Alpine Linux,因其极度轻量(仅5MB左右),常被用作Docker容器的基础镜像。但在宿主机上直接安装Docker Engine,还是建议用上述主流发行版。

我的经验是:对于新手和个人项目,优先选择Ubuntu LTS;如果公司环境是CentOS/RHEL,则需熟悉其firewalldSELinux的配置,这两者可能会影响容器网络和文件访问。

2.2 宿主机资源与内核检查

Docker对宿主机有一定要求,提前检查可以避免安装失败。

  1. 内核版本检查:运行uname -r。Docker要求内核版本至少为3.10(64位)。现代发行版通常都满足,但老旧的CentOS 7可能需要更新内核(yum update kernel)。
  2. 存储驱动支持:Docker需要特定的存储驱动来管理镜像和容器的分层数据。运行ls -l /sys/class/misc/device-mapper检查device-mapper是否存在,这是overlay2等存储驱动的基础。overlay2是目前推荐且性能最好的驱动,需要内核版本4.0以上。
  3. 资源规划
    • 磁盘空间/var/lib/docker是Docker默认的工作目录,存放所有镜像、容器、卷和网络配置数据。建议预留至少20GB空间。对于生产环境,强烈建议将这个目录挂载到独立的、容量较大的磁盘分区或逻辑卷上。
    • 内存与CPU:视容器内应用需求而定。但宿主机本身需要预留资源。一个基本的建议是,宿主机内存不少于2GB,CPU不少于2核。

一个关键操作:更新系统软件包。这能确保你从干净的基线开始。

# 对于Ubuntu/Debian sudo apt update && sudo apt upgrade -y # 对于CentOS/RHEL sudo yum update -y

3. 三种安装方式深度解析与选型

Docker提供了多种安装途径,没有绝对的好坏,只有适合与否。理解它们的区别,能让你在遇到问题时知道从何入手。

3.1 使用官方仓库安装(推荐方式)

这是最官方、最便于后续升级和维护的方式。原理是将Docker的官方软件仓库地址添加到你的系统源列表,然后通过系统自带的包管理器安装。好处是能自动处理依赖,并方便地接收安全更新。

为什么推荐它?

  1. 版本可控:你可以选择安装最新的稳定版、测试版,甚至指定某个历史版本。
  2. 自动更新:可以和系统其他软件一起通过apt upgradeyum update进行更新。
  3. 官方支持:遇到问题,官方文档的解决思路通常基于此方式。

其核心步骤分为三部分

  1. 安装必要的工具:让系统能通过HTTPS使用仓库。
  2. 添加Docker的官方GPG密钥:用于验证软件包的签名,确保来源可信且未被篡改。
  3. 设置稳定的仓库:告诉包管理器去哪里找Docker的安装包。

3.2 使用便捷脚本安装(快速体验)

Docker官方提供了一个get-docker.sh脚本。执行一条命令,脚本会自动检测你的系统,并完成所有安装步骤。这听起来很美好,但我强烈不建议在生产环境或需要长期维护的主机上使用

为什么不推荐?

  • 缺乏透明性:脚本自动执行了大量操作,你无法精确控制它做了什么,比如安装了哪些依赖、修改了哪些配置。
  • 升级麻烦:通过脚本安装后,升级通常也需要通过脚本,不如包管理器方便。
  • 安全风险:虽然脚本来自官方,但直接运行来自网络的脚本本身就有一定风险(尽管可以审计其内容)。

它的适用场景:快速搭建一个临时的测试或演示环境,用完即弃。

3.3 手动下载DEB/RPM包安装(离线环境)

在某些严格的内网或离线环境中,无法连接外部仓库。这时就需要提前在有网的机器上下载好Docker引擎及其所有依赖的安装包(.deb.rpm文件),然后拷贝到目标服务器进行手动安装。

操作要点

  1. 访问Docker的官方下载页面,找到对应你系统版本和架构的引擎包和依赖包。
  2. 使用dpkg -i(Debian系)或rpm -ivh(RHEL系)命令按顺序安装。依赖关系需要手动处理,非常繁琐。
  3. 这种方式难以升级和维护,是不得已而为之的选择。

我的建议:对于绝大多数情况,请坚定不移地选择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-plugin
  • docker-ce:社区版引擎本体。
  • docker-ce-cli:命令行工具,让你能执行docker命令。
  • containerd.io:行业标准的容器运行时,Docker引擎底层依赖它来管理容器生命周期。
  • docker-compose-plugin:这是新的docker compose(V2版本),作为插件安装。用于通过YAML文件定义和运行多容器应用。

4.4 安装后的基础验证与配置

安装完成后,不要急着跑应用,先做这几件事:

  1. 启动Docker服务并设置开机自启

    sudo systemctl start docker sudo systemctl enable docker
  2. 运行一个测试容器

    sudo docker run hello-world

    如果看到“Hello from Docker!”等欢迎信息,说明引擎、镜像拉取、容器运行整个链条都通了。这是最经典的“冒烟测试”。

  3. (非常重要)将当前用户加入docker组: 默认情况下,执行docker命令需要sudo权限。这很不方便也不安全。解决方案是将你的用户加入docker用户组。

    sudo usermod -aG docker $USER

    操作后,你必须完全退出当前终端会话(关闭终端或输入exit),然后重新登录,这个组权限变更才会生效。之后,你就可以直接运行docker ps而不需要sudo了。

5. 核心配置调优与国内镜像加速

默认安装的Docker能用,但未必好用。针对国内网络环境和生产需求,必须进行一些关键配置。

5.1 配置国内镜像加速器

从Docker Hub拉取镜像,在国内速度可能很慢甚至失败。配置一个镜像加速器是必选项。

  1. 编辑Docker守护进程的配置文件。对于Linux,通常是/etc/docker/daemon.json(如果不存在就创建它)。

    sudo vim /etc/docker/daemon.json
  2. 输入以下内容(以阿里云镜像加速器为例,你需要去阿里云容器镜像服务控制台免费获取专属加速器地址):

    { "registry-mirrors": ["https://your-aliyun-mirror.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "data-root": "/var/lib/docker" }
  3. 保存退出后,重启Docker服务使配置生效:

    sudo systemctl daemon-reload sudo systemctl restart docker

配置项详解

  • registry-mirrors:镜像加速器地址。也可以配置多个,Docker会按顺序尝试。
  • exec-opts:native.cgroupdriver=systemd:对于使用systemd作为初始化系统的发行版(如Ubuntu 16.04+, CentOS 7+),建议设置此项,确保Docker与系统在资源管理上一致,避免出现警告。
  • log-driverlog-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,不是bash

    7. 进阶部署:Docker Compose与生产环境考量

    单容器应用只是开始,现实中的应用往往由多个容器组成(如Web应用+数据库+缓存)。docker-compose(现在作为插件docker compose)就是用来定义和运行多容器应用的工具。

    7.1 使用Docker Compose编排应用

    假设我们有一个简单的WordPress应用,需要MySQL数据库。

    1. 创建一个项目目录,并在其中创建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
    2. 在该目录下,一键启动所有服务:

      docker compose up -d # 注意是`compose`,不是`docker-compose`

      -d表示后台运行。这条命令会拉取镜像(如果本地没有),创建网络、卷,并按依赖顺序启动容器。

    3. 管理服务:

      docker compose down # 停止并移除所有容器、网络(默认保留卷) docker compose ps # 查看本项目下的容器状态 docker compose logs -f wordpress # 跟踪WordPress容器的日志

    7.2 生产环境安全与维护要点

    在个人环境玩玩没问题,但上生产必须谨慎。

    1. 非Root用户运行:我们已经通过docker组让普通用户能操作Docker,但这仍有风险。更安全的方式是使用用户命名空间映射,或者在容器内以非root用户运行应用(在Dockerfile中用USER指令)。
    2. 资源限制:防止单个容器耗尽宿主机资源。在docker runcompose文件中使用--memory--cpus等参数限制容器的CPU和内存使用。
      docker run -d --memory="512m" --cpus="1.5" nginx
    3. 日志轮转与监控:我们之前在daemon.json里配置了日志大小限制。生产环境还需要将日志收集到中心化系统(如ELK)进行监控和分析。
    4. 镜像安全扫描:定期使用docker scan命令(集成Snyk)或第三方工具扫描本地镜像中的已知漏洞。
    5. 备份与恢复:定期备份重要的Docker卷(Volume)数据。卷是持久化容器数据的最佳方式,其物理路径通常在/var/lib/docker/volumes/下。

    8. 常见问题与故障排查实录

    即使按照步骤来,也可能会遇到问题。这里记录几个我高频遇到的坑和解决办法。

    8.1 权限问题:Got permission denied while trying to connect

    现象:执行docker ps等命令时,报错权限被拒绝。原因:当前用户不在docker组内,或者已加入组但未重新登录会话。解决

    1. 确认用户已加入docker组:groups $USER,查看输出是否包含docker
    2. 如果已加入,务必退出当前终端并重新登录
    3. 如果未加入,执行sudo usermod -aG docker $USER后,再执行第2步。

    8.2 镜像拉取失败或极慢

    现象docker pull卡住或报错net/http: TLS handshake timeout原因:网络连接Docker Hub不稳定或被阻。解决

    1. 首要检查:是否已正确配置国内镜像加速器(/etc/docker/daemon.json)。配置后必须重启Docker服务。
    2. 测试加速器是否生效:docker info,在输出中查找Registry Mirrors,看你的加速器地址是否在列。
    3. 可以尝试更换其他加速器,如中科大、网易云等。

    8.3 端口冲突问题

    现象docker run -p 80:80 ...时报错Bind for 0.0.0.0:80 failed: port is already allocated原因:宿主机80端口已被其他程序(如Nginx, Apache)占用。解决

    1. 找出占用端口的进程:sudo ss -tulnp | grep :80sudo lsof -i:80
    2. 要么停止那个进程,要么修改Docker容器的端口映射,例如改为-p 8080:80

    8.4 容器内无法解析域名

    现象:在容器内ping www.baidu.com失败,但ping 8.8.8.8通。原因:Docker容器的DNS配置有问题。解决

    1. 临时进入容器修改/etc/resolv.conf不是好办法,重启会失效。
    2. 最佳实践是在创建容器时指定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所在分区满了,通常是镜像、容器日志或未使用的数据累积过多。解决

    1. 清理无用资源
      docker system prune -a # 谨慎使用!会删除所有停止的容器、未被任何容器使用的网络、悬空镜像、构建缓存。
      可以先运行docker system df查看磁盘使用详情。
    2. 定期清理日志:如果单个容器日志过大,除了全局配置,也可以在运行容器时用--log-opt max-size=10m --log-opt max-file=3参数限制。
    3. 长远之计:规划好数据目录,将其放在独立的大容量分区上。

    安装部署只是第一步,理解Docker的哲学并善用它,才能真正提升开发和运维的效率。从今天起,尝试把你的下一个项目用Docker容器跑起来吧。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询