1. Ubuntu 22.04 系统准备
1.1 系统更新与基础依赖
在开始安装 Docker 之前,我们需要确保系统处于最新状态并安装必要的依赖包。Ubuntu 22.04 默认使用 apt 作为包管理器,执行以下命令更新软件包索引并安装基础工具:
bash复制# 更新软件包列表(-y 参数表示自动确认所有提示)
sudo apt update -y
# 安装 Docker 所需的依赖工具
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common \
gnupg \
lsb-release
这些依赖包的作用分别是:
apt-transport-https:允许 apt 通过 HTTPS 协议访问软件源ca-certificates:提供 CA 根证书,确保 SSL/TLS 连接安全curl:用于从网络下载文件software-properties-common:提供管理软件源的实用工具gnupg:用于验证软件包签名lsb-release:提供标准的 Linux 发行版信息
提示:在中国大陆网络环境下,直接连接 Ubuntu 官方源可能较慢。可以考虑先配置国内镜像源(如阿里云、清华源)再执行更新操作。
1.2 网络与防火墙配置
Ubuntu 22.04 默认使用 ufw(Uncomplicated Firewall)作为防火墙管理工具。Docker 需要开放特定端口才能正常工作,以下是两种配置方案:
方案一:完全关闭防火墙(仅建议测试环境使用)
bash复制# 禁用防火墙
sudo ufw disable
# 验证防火墙状态
sudo ufw status
方案二:按需开放端口(推荐生产环境使用)
bash复制# 允许 Docker 默认端口(2375/2376)
sudo ufw allow 2375/tcp
sudo ufw allow 2376/tcp
# 允许常用的容器端口范围
sudo ufw allow 3000:3999/tcp
sudo ufw allow 8000:8999/tcp
# 启用防火墙
sudo ufw enable
注意事项:如果后续发现容器端口无法访问,首先检查防火墙状态和规则。生产环境中应始终坚持最小权限原则,只开放必要的端口。
2. Docker 引擎安装与配置
2.1 配置 Docker 软件源
为了在中国网络环境下获得更快的下载速度,我们使用阿里云镜像源替代 Docker 官方源:
bash复制# 添加 Docker 的官方 GPG 密钥(阿里云镜像)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置阿里云 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
关键参数说明:
arch=$(dpkg --print-architecture):自动检测系统架构(amd64/arm64等)signed-by:指定用于验证的 GPG 密钥位置$(lsb_release -cs):获取当前系统的 Ubuntu 代号(如 jammy)
2.2 安装 Docker 引擎
更新软件源后安装 Docker 核心组件:
bash复制# 更新软件包索引(使新添加的 Docker 源生效)
sudo apt update -y
# 安装 Docker 引擎(包含 docker-ce, docker-ce-cli 和 containerd.io)
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin
安装完成后验证 Docker 版本:
bash复制docker --version
# 预期输出:Docker version 24.0.5, build 24.0.5-0ubuntu1~22.04.1
2.3 配置 Docker 服务
Docker 安装完成后需要启动服务并设置开机自启:
bash复制# 启动 Docker 服务
sudo systemctl start docker
# 设置开机自动启动
sudo systemctl enable docker
# 检查服务状态
sudo systemctl status docker
正常运行的 Docker 服务会显示 active (running) 状态。如果遇到启动失败的情况,可以查看详细日志:
bash复制journalctl -u docker.service -b
2.4 验证 Docker 安装
运行经典的 hello-world 容器测试 Docker 是否正常工作:
bash复制sudo docker run hello-world
成功运行后会看到类似输出:
code复制Hello from Docker!
This message shows that your installation appears to be working correctly.
...
2.5 配置镜像加速器
国内访问 Docker Hub 官方镜像仓库速度较慢,需要配置镜像加速器。以阿里云为例:
- 登录阿里云容器镜像服务
- 在左侧菜单选择「镜像工具」-「镜像加速器」
- 复制专属加速器地址(每个账号不同)
配置加速器:
bash复制# 创建 Docker 配置目录
sudo mkdir -p /etc/docker
# 配置镜像加速器(替换为你自己的加速器地址)
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重新加载配置并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
验证加速器是否生效:
bash复制docker info | grep "Registry Mirrors"
2.6 非 root 用户权限配置
默认情况下,只有 root 用户和 docker 组用户才能执行 Docker 命令。将当前用户加入 docker 组可以避免每次使用 sudo:
bash复制# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 应用组变更(需要重新登录或使用以下命令)
newgrp docker
# 验证权限(应该能正常执行)
docker ps
安全提示:docker 组用户拥有与 root 等效的权限,在生产环境中应谨慎分配此权限。
3. Docker Compose v2 安装与配置
3.1 安装 Docker Compose 插件
Docker Compose v2 已作为插件集成到 Docker 中,可以直接通过 apt 安装:
bash复制# 安装 Docker Compose 插件
sudo apt install -y docker-compose-plugin
# 验证安装
docker compose version
# 预期输出:Docker Compose version v2.20.2
3.2 兼容性配置(可选)
如果你习惯使用 v1 的 docker-compose 命令,可以创建别名:
bash复制# 临时别名(当前会话有效)
alias docker-compose='docker compose'
# 永久别名(添加到 shell 配置文件)
echo "alias docker-compose='docker compose'" >> ~/.bashrc
source ~/.bashrc
验证别名是否生效:
bash复制docker-compose --version
3.3 卸载旧版 Compose(如存在)
如果系统上安装了旧版的 Python docker-compose,建议卸载以避免冲突:
bash复制# 检查是否安装了旧版
which docker-compose
# 如果返回路径(如 /usr/local/bin/docker-compose),则卸载
sudo rm -f $(which docker-compose)
4. Docker Compose 实战示例
4.1 基础 Nginx 服务
创建一个简单的 Nginx 服务演示 Compose 的基本用法:
bash复制# 创建项目目录
mkdir -p ~/compose-demo/nginx && cd ~/compose-demo/nginx
# 创建 docker-compose.yml 文件
cat > docker-compose.yml <<EOF
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
restart: unless-stopped
EOF
# 创建网页内容
mkdir html
echo "<h1>Hello from Docker Compose v2</h1>" > html/index.html
# 启动服务
docker-compose up -d
# 验证服务
curl http://localhost:8080
4.2 多服务应用示例
下面演示一个包含 Web 应用和数据库的完整示例:
bash复制# 创建多服务项目目录
mkdir -p ~/compose-demo/fullstack && cd ~/compose-demo/fullstack
# 创建 docker-compose.yml
cat > docker-compose.yml <<EOF
version: '3.8'
services:
db:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: example
POSTGRES_USER: user
POSTGRES_DB: appdb
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d appdb"]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
app:
build: .
ports:
- "3000:3000"
environment:
DB_URL: postgres://user:example@db:5432/appdb
REDIS_URL: redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
db_data:
redis_data:
EOF
# 创建简单的 Node.js 应用 Dockerfile
cat > Dockerfile <<EOF
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
EOF
# 启动所有服务
docker-compose up -d
5. 常见问题排查
5.1 镜像拉取失败
问题现象:
code复制Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
解决方案:
- 确认镜像加速器配置正确
- 检查网络连接是否正常
- 尝试手动指定国内镜像:
bash复制docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:alpine
5.2 端口冲突
问题现象:
code复制Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use
解决方案:
- 查找占用端口的进程:
bash复制sudo lsof -i :8080
- 停止冲突进程或修改 Compose 文件中的端口映射
5.3 权限问题
问题现象:
code复制Got permission denied while trying to connect to the Docker daemon socket
解决方案:
- 确保当前用户在 docker 组中:
bash复制groups
- 如果不在组中,执行:
bash复制sudo usermod -aG docker $USER
newgrp docker
- 重启 Docker 服务:
bash复制sudo systemctl restart docker
5.4 存储驱动问题
问题现象:
code复制Error starting daemon: error initializing graphdriver: driver not supported
解决方案:
- 检查当前存储驱动:
bash复制docker info | grep "Storage Driver"
- 修改为 overlay2(编辑 /etc/docker/daemon.json):
json复制{
"storage-driver": "overlay2"
}
- 重启 Docker 服务
6. 性能优化建议
6.1 资源限制
在 Compose 文件中为服务设置资源限制:
yaml复制services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.1'
memory: 256M
6.2 日志管理
配置日志轮转和大小限制:
bash复制# 编辑 Docker 配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
# 重启 Docker
sudo systemctl restart docker
6.3 构建缓存优化
在 Dockerfile 中合理安排指令顺序,最大化利用构建缓存:
dockerfile复制FROM node:18-alpine
# 先复制 package.json 并安装依赖(这层变化较少)
WORKDIR /app
COPY package*.json ./
RUN npm install
# 然后复制其余文件(这层变化频繁)
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
6.4 多阶段构建
对于生产环境镜像,使用多阶段构建减小镜像大小:
dockerfile复制# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
7. 进阶配置
7.1 自定义网络
创建独立的 Docker 网络实现服务隔离:
bash复制# 创建自定义网络
docker network create myapp-net
# 在 Compose 中使用
networks:
default:
external:
name: myapp-net
7.2 环境变量管理
使用环境变量文件管理敏感配置:
bash复制# 创建 .env 文件
echo "DB_PASSWORD=securepassword" > .env
# 在 Compose 中引用
environment:
DB_PASSWORD: ${DB_PASSWORD}
7.3 健康检查
为服务添加健康检查:
yaml复制services:
web:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
7.4 容器资源监控
使用 cAdvisor 监控容器资源使用情况:
yaml复制services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
restart: unless-stopped
8. 生产环境建议
- 日志收集:配置 ELK 或 Loki 等日志系统集中管理容器日志
- 监控告警:部署 Prometheus + Grafana 监控容器指标
- 安全加固:
- 定期更新 Docker 和容器镜像
- 使用非 root 用户运行容器
- 限制容器能力(--cap-drop ALL)
- 备份策略:
- 定期备份重要卷数据
- 导出关键容器镜像
- 编排工具:考虑使用 Kubernetes 管理大规模容器部署
实际部署中,我发现合理配置资源限制能显著提高系统稳定性。特别是在内存管理方面,为每个容器设置适当的内存限制可以防止单个容器耗尽主机资源。另外,定期执行 docker system prune 清理无用镜像、容器和卷,能有效释放磁盘空间。