前言
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.io、quay.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 容器编排