95384 / Docker部署教程

Created Sun, 07 Jun 2026 06:00:00 +0800 Modified Sun, 07 Jun 2026 07:34:04 +0000
2229 Words

前言

Docker 是目前最流行的容器化平台,通过容器技术将应用及其依赖打包在一起,实现"一次构建,到处运行"。相比传统虚拟机,Docker 更轻量、启动更快、资源占用更少。

本文以 Ubuntu 22.04/24.04 LTS 为例,涵盖从零安装到生产环境配置的完整流程。


环境要求

  • 操作系统:Linux(Ubuntu 20.04+ / Debian 11+ / CentOS 7+)
  • 内核版本:≥ 3.10(建议 5.x+)
  • 架构:x86_64 / arm64
  • 推荐配置:≥ 2GB 内存,≥ 20GB 磁盘

💡 用以下命令检查你的内核版本:

uname -r

安装方式对比

方式 适用场景 难度
APT 仓库安装(推荐) 生产服务器、长期使用
官方一键脚本 快速部署、测试环境
离线安装(.deb 包) 无外网访问的服务器 ⭐⭐⭐
Docker Desktop macOS / Windows 桌面环境

方式一:APT 仓库安装(推荐)

这是官方推荐的安装方式,无缝接收系统更新。

1️⃣ 卸载旧版本

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
    sudo apt-get remove -y $pkg
done

2️⃣ 安装依赖

sudo apt-get update
sudo apt-get install -y ca-certificates curl

3️⃣ 添加 Docker 官方 GPG 密钥和仓库

# 创建密钥目录
sudo install -m 0755 -d /etc/apt/keyrings

# 添加 Docker 官方 GPG 密钥
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
    -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 添加 APT 仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

4️⃣ 安装 Docker

# 安装最新版本
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证安装
sudo docker --version
sudo docker run hello-world  # 看到 Hello from Docker! 即成功

方式二:官方一键脚本(快速部署)

适合测试环境或不想手动配仓库的场景:

# 下载并运行安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 验证安装
sudo docker --version

⚠️ 注意:一键脚本会直接 sudo 执行,建议先审查脚本内容再运行:

less get-docker.sh

方式三:离线安装(无网络环境)

适用于内网服务器、物理隔离环境。

在有网络的机器上下载

访问 Docker 发行版页面,或直接使用命令行:

# 下载指定版本的 .deb 包
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce_24.0.7-1~ubuntu.22.04~jammy_amd64.deb

# 下载依赖包(containerd.io, docker-ce-cli, docker-buildx-plugin, docker-compose-plugin)
# 建议把所有 .deb 扔到一个目录

在内网服务器上安装

sudo dpkg -i *.deb
# 如果有依赖缺失,运行修复命令
sudo apt-get install -f

安装后配置

1️⃣ 免 sudo 运行 Docker(推荐)

每次敲 sudo docker 很烦,把当前用户加入 docker 用户组:

sudo usermod -aG docker $USER
newgrp docker  # 刷新组权限,或退出重新登录
docker ps      # 验证不需要 sudo

⚠️ 安全提醒:加入 docker 组的用户等同于 root 权限,请谨慎分配。生产环境建议限制 docker 组用户范围。

2️⃣ 设置 Docker 开机自启

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

3️⃣ 配置镜像加速(国内服务器必选)

中国大陆服务器拉取 Docker Hub 镜像经常超时,建议配置加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.nju.edu.cn"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

镜像加速器说明:

  • ✅ 只对 Docker Hub 官方镜像生效
  • ❌ 第三方仓库(如 ghcr.ioquay.io)不受影响
  • 加速器稳定性不一,建议准备备用源

安装 Docker Compose

Docker Compose 用于定义和运行多容器应用。目前主流是 V2 版本(集成在 Docker CLI 中)。

推荐方式:Docker Compose Plugin

如果你已通过 APT 安装了 docker-compose-plugin,直接用:

docker compose version
# Docker Compose version v2.27.0

备用方式:独立二进制安装

# 下载最新版
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \
    -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose

docker compose version

⚠️ 重要提醒:新版 Docker Compose 命令是 docker compose(中间没有短横线),旧的独立命令 docker-compose 已逐渐被取代。


常用 Docker 命令速查

镜像管理

docker search nginx          # 搜索镜像
docker pull nginx:latest     # 拉取镜像
docker images                # 查看本地镜像
docker rmi nginx             # 删除镜像
docker system prune -a       # 清理所有未使用的镜像/容器/网络

容器生命周期

docker run -d --name myapp -p 8080:80 nginx    # 后台运行容器
docker ps                                       # 查看运行中的容器
docker ps -a                                    # 查看所有容器(含已停止)
docker stop myapp                               # 停止容器
docker start myapp                              # 启动已停止的容器
docker restart myapp                            # 重启容器
docker rm -f myapp                              # 强制删除容器
docker logs -f myapp                            # 查看实时日志

进入容器交互

docker exec -it myapp bash       # 进入容器终端
docker exec -it myapp sh         # 如果容器没有 bash,用 sh

查看资源占用

docker stats                    # 实时查看所有容器 CPU/内存
docker stats --no-stream        # 单次快照

Docker Compose 实战

docker-compose.yml 是定义多容器服务的标准文件。以下是常用模板:

示例:Nginx + MySQL + PHPMyAdmin

services:
  nginx:
    image: nginx:alpine
    container_name: web_nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    restart: unless-stopped
    networks:
      - webnet

  mysql:
    image: mysql:8.0
    container_name: web_mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_password
      MYSQL_DATABASE: myapp
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped
    networks:
      - webnet

  phpmyadmin:
    image: phpmyadmin:latest
    container_name: web_phpmyadmin
    ports:
      - "8080:80"
    environment:
      PMA_HOST: mysql
    restart: unless-stopped
    networks:
      - webnet

volumes:
  mysql_data:

networks:
  webnet:
    driver: bridge

启动方法:

# 启动所有服务
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f

# 停止并删除
docker compose down

# 重新拉取镜像并启动
docker compose pull
docker compose up -d

生产环境最佳实践

1. 限制日志大小

日志写满磁盘是 Docker 最常见的事故。在 daemon.json 中设置日志限制(如上面已配),或按容器单独设置:

services:
  myapp:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

2. 限制容器资源

防止某个容器占满宿主机资源:

services:
  myapp:
    deploy:
      resources:
        limits:
          cpus: "0.5"       # 最多用 0.5 核
          memory: "512M"    # 最多用 512MB 内存
        reservations:
          cpus: "0.25"
          memory: "256M"    # 最少保证 256MB

3. 使用 restart 策略

策略 行为
no 不自动重启(默认)
always 无论退出码如何,总是重启
unless-stopped 总是重启,除非手动停止
on-failure:5 仅退出码非0时重启,最多重试5次

✅ 推荐:restart: unless-stopped

4. 定期清理

# 定时清理无人使用的镜像、容器、网络
docker system prune -af --volumes --filter "until=168h"  # 清理7天以上的

建议加入 crontab:

0 3 * * 0 /usr/bin/docker system prune -af --volumes --filter "until=168h"

5. 安全建议

# 不要以 root 用户运行容器内进程
# 使用非 root 用户运行
docker run --user 1000:1000 nginx

# 限制容器能力(Capability)
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

# 使用只读根文件系统
docker run --read-only --tmpfs /tmp nginx

常见问题排查

Cannot connect to the Docker daemon

# 检查 Docker 服务是否运行
sudo systemctl status docker

# 启动 Docker
sudo systemctl start docker

# 检查用户是否在 docker 组
groups $USER

permission denied 运行 docker

# 方法1:加 sudo
sudo docker ps

# 方法2:将用户加入 docker 组(推荐)
sudo usermod -aG docker $USER
# 重新登录后生效

no matching manifest for linux/arm64

ARM 架构的机器(如树莓派、飞腾腾锐)拉 x86 镜像时会报错。解决方案:

# 在 docker-compose.yml 中指定平台
services:
  myapp:
    platform: linux/arm64
    image: arm64v8/nginx

或使用 --platform 参数:

docker run --platform linux/arm64 arm64v8/nginx

❌ 拉取镜像超时(国内网络)

# 确认镜像加速已配置
cat /etc/docker/daemon.json

# 手动指定镜像标签(避免 latest 自动请求国外 registry)
docker pull nginx:alpine

# 临时使用代理
export HTTP_PROXY=http://your-proxy:port
export HTTPS_PROXY=http://your-proxy:port

总结

安装 Docker 其实就三步:

# 1. 卸载旧版 → 2. 添加官方源 → 3. 安装
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker

最后验证一下:

docker run hello-world
docker compose version

看到 Hello from Docker! 就大功告成 🎉

进阶推荐:

  • 学习 Dockerfile 编写,构建自定义镜像
  • 了解 docker-compose.yml 完整语法
  • 尝试 Docker Swarm 或 Kubernetes 容器编排