Docker 是一种开源的容器化平台,用于构建、打包、分发和运行应用程序。它将应用程序及其依赖项(如库、运行时环境、系统工具等)打包到一个独立的容器中,确保应用程序在任何环境中都能以一致的方式运行。

核心概念

  1. Docker 镜像
    • 镜像是一个轻量、可执行的独立软件包,包含运行容器所需的文件系统内容、环境变量、程序配置等。
    • 采用分层架构,由多个只读层叠加而成,每一层对应一次构建操作(如 RUNCOPY)。
    • 支持多阶段构建,可显著减小镜像体积。例如,使用 golang:1.17 AS builder 构建应用程序后,仅将二进制文件复制到轻量级镜像(如 alpine:latest)中。
  2. Docker 容器
    • 容器是镜像的运行实例,提供独立、轻量级的运行环境,包含应用程序及其所有依赖项。
    • 基于镜像创建,具有可写层,支持隔离性(通过 Namespace)和资源限制(通过 Cgroups)。
    • 生命周期短暂,可被快速创建、启动、停止和删除。
  3. Docker 仓库
    • 存储和分享 Docker 镜像的地方,开发者可从仓库中获取镜像,并将自己的镜像推送到仓库中。
    • 分为公共仓库(如 Docker Hub)和私有仓库。

底层原理

  1. Namespace
    • 实现资源隔离,为容器创建独立的系统资源视图,包括进程、网络、文件系统、用户等。
    • 例如,PID Namespace 隔离进程 ID,Network Namespace 隔离网络栈。
  2. Cgroups
    • 实现资源限制与管理,用于限制和监控容器的资源使用,包括 CPU、内存、磁盘 I/O 和网络带宽。
    • 防止容器耗尽系统资源,影响其他容器或主机系统的正常运行。
  3. UnionFS(联合文件系统)
    • 允许将多个只读镜像层叠加,形成一个统一的文件系统视图。
    • 容器启动时,在镜像层之上添加可写层,实现写时复制(Copy-on-Write),保证镜像层只读且容器的文件变更隔离。

优势与应用场景

  1. 优势
    • 一致性和可移植性:容器在任何支持 Docker 的平台上都能运行,确保开发和生产环境的一致性。
    • 轻量级和高效性:容器共享宿主机的操作系统内核,资源占用少,启动速度快。
    • 快速部署和交付:减少开发、测试和生产环境之间的差异,提高应用程序的交付速度。
  2. 应用场景
    • 微服务架构:将应用程序拆分为多个独立的微服务,每个微服务运行在一个容器中。
    • 持续集成/持续部署(CI/CD):通过 Docker 实现应用程序的快速构建、测试和部署。
    • 多环境部署:确保应用程序在不同的环境中(如开发、测试、生产)以相同的方式运行。

一、Docker 安装

1. 安装依赖包

sudo apt update
sudo apt install -y apt-transport-https ca-certificates gnupg software-properties-common

2. 添加阿里云 GPG 密钥

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3. 配置阿里云 Docker 仓库

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

说明

  • $(dpkg --print-architecture):自动获取当前系统架构。
  • $(lsb_release -cs):自动获取当前 Ubuntu 版本代号。

4. 安装 Docker 引擎

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

5. 验证安装

sudo docker --version

二、配置优化

1. 配置国内镜像加速器

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors" : [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://dockerproxy.com",
    "https://gst6rzl9.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "http://mirrors.ustc.edu.cn/",
    "https://mirrors.tuna.tsinghua.edu.cn/",
    "http://mirrors.sohu.com/"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug": true,
  "experimental": false
}
EOF

配置说明

  • registry-mirrors:多个国内镜像源,Docker 会自动选择最快的一个。
  • log-driver 和 log-opts:限制单个容器日志大小为 10MB,最多保留 3 个日志文件,防止磁盘占满。
  • storage-driver:推荐使用 overlay2,性能更好。
  • dns:设置公共 DNS,避免容器内网络解析问题。

2. 配置用户组(免 sudo 使用 Docker)

默认情况下,使用 Docker 需要 sudo 权限。可通过将用户加入 docker 用户组实现免密码操作。

sudo groupadd docker             # 创建 docker 组
sudo usermod -aG docker $USER    # 将当前用户加入 docker 组
newgrp docker                    # 刷新组权限,立即生效(无需重新登录)

3. 启动并启用 Docker 服务

sudo systemctl daemon-reload
sudo systemctl enable docker     # 开机自启
sudo systemctl start docker      # 启动服务

检查服务状态:

sudo systemctl status docker

三、环境验证

1. 基础功能测试

运行官方 hello-world 镜像,验证 Docker 是否正常工作。

docker run --rm hello-world

2. 测试镜像拉取速度

拉取一个常用镜像(如 Nginx)

time docker pull nginx:latest

3. 资源限制测试

创建一个受资源限制的测试容器,验证 Docker 的资源控制能力。

docker run -it --rm --name stress-test alpine:latest \
  sh -c "apk add --no-cache stress-ng && stress-ng --cpu 4 --io 4 --vm 2 --vm-bytes 128M --timeout 60s"

另开一个窗口执行命令,看监控资源使用情况:

docker stats stress-test

测试结束后删除容器:

docker rm -f stress-test

四、维护与安全建议

日志轮转配置(防止日志占满磁盘)

Docker 容器日志可能持续增长,建议配置日志轮转。

创建日志轮转配置文件:

sudo tee /etc/logrotate.d/docker <<-'EOF'
/var/lib/docker/containers/*/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}
EOF

说明

  • 每天轮转一次日志。
  • 最多保留 7 个备份。
  • copytruncate:避免重启容器以释放文件句柄。

五、Shell 脚本自动化安装

#!/bin/bash
# Ubuntu 系统全自动安装 Docker 脚本
# 支持 Ubuntu 20.04/22.04/24.04
# 作者:LoneEon

set -e  # 遇到错误立即退出

echo "🚀 开始安装 Docker 环境..."

# 检查是否为 root 用户,避免权限问题
if [ "$(id -u)" -ne 0 ]; then
    echo "❌ 请使用 root 用户运行此脚本,或使用 sudo 执行。"
    exit 1
fi

# 获取当前登录用户名(用于加入 docker 组)
CURRENT_USER=$(logname 2>/dev/null || echo $SUDO_USER)
if [ -z "$CURRENT_USER" ] || [ "$CURRENT_USER" = "root" ]; then
    echo "⚠️  当前为 root 用户,建议切换为普通用户后运行脚本。"
    echo "💡 若继续,请确保后续手动将用户加入 docker 组。"
    read -p "是否继续?[y/N]: " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
    CURRENT_USER="root"
fi

# 1. 安装依赖
echo "🔧 安装依赖包..."
apt update -qq > /dev/null
apt install -y apt-transport-https ca-certificates gnupg software-properties-common > /dev/null

# 2. 添加阿里云 GPG 密钥
echo "🔐 添加阿里云 GPG 密钥..."
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 3. 添加阿里云 Docker 仓库
echo "📦 配置阿里云 Docker 仓库..."
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 安装 Docker
echo "📥 安装 Docker 引擎..."
apt update -qq > /dev/null
apt install -y docker-ce docker-ce-cli containerd.io > /dev/null

# 5. 创建 daemon.json 配置文件
echo "⚙️  配置国内镜像加速与日志策略..."
cat > /etc/docker/daemon.json << 'EOF'
{
   "registry-mirrors": [
     "https://docker.1ms.run",
     "https://docker.xuanyuan.me",
     "https://registry.docker-cn.com",
     "https://docker.mirrors.ustc.edu.cn",
     "https://hub-mirror.c.163.com",
     "https://mirror.baidubce.com"
   ],
   "log-driver": "json-file",
   "log-opts": {
     "max-size": "10m",
     "max-file": "3"
   },
   "storage-driver": "overlay2",
   "dns": ["8.8.8.8", "8.8.4.4"]
}
EOF

# 6. 创建 docker 用户组并添加当前用户
echo "👥 配置用户组,实现免 sudo 使用 Docker..."
groupadd -f docker
usermod -aG docker "$CURRENT_USER"

# 7. 启动并启用 Docker 服务
echo "🔄 启动并设置开机自启 Docker 服务..."
sudo systemctl daemon-reload
sudo systemctl enable docker --now > /dev/null
sudo systemctl restart docker

# 8. 验证安装
echo "✅ 验证 Docker 安装..."
if ! docker --version; then
    echo "❌ Docker 安装失败,请检查日志。"
    exit 1
fi

# 运行 hello-world 测试
echo "🧪 运行测试容器 hello-world..."
docker run --rm hello-world > /dev/null 2>&1 && echo "🎉 Docker 安装成功!" || {
    echo "⚠️  hello-world 测试失败,但 Docker 可能已安装,请检查网络或镜像源。"
}

# 提示用户重新登录以应用组权限
echo
echo "--------------------------------------------------"
echo "✅ Docker 安装完成!"
echo "📌 当前用户 '$CURRENT_USER' 已加入 docker 组。"
echo "💡 请退出终端并重新登录,或执行:"
echo "   newgrp docker"
echo "   或重新登录系统以使用 'docker' 命令无需 sudo。"
echo "--------------------------------------------------"

六、常见问题排查

问题 解决方案
Permission denied 错误 确保用户已加入 docker 组并执行 newgrp docker
镜像拉取慢 检查 /etc/docker/daemon.json 中的 registry-mirrors 是否生效
服务无法启动 查看日志 sudo journalctl -u docker.service
存储驱动错误 确保系统支持 overlay2,一般现代内核均支持

本文详细介绍了在 Ubuntu 系统上部署 Docker 的完整步骤,涵盖安装、国内镜像加速、用户权限配置、服务管理及环境验证。通过合理的配置优化,可显著提升镜像拉取速度,增强系统稳定性与使用便捷性。方案适用于各类 Ubuntu 环境,为后续容器化应用的部署打下坚实基础。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐