1. Docker安装指南:从零开始掌握容器化技术
容器化技术已经成为现代软件开发和部署的标配,而Docker作为其中最流行的工具,几乎改变了整个行业的交付方式。我第一次接触Docker是在2014年,当时为了解决"在我机器上能跑"这个经典问题,没想到这个决定彻底改变了我的工作流程。今天,我将分享从零开始安装Docker的完整过程,包括各种你可能遇到的坑和解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统要求
2.1 硬件与操作系统要求
Docker对硬件要求不高,但有一些基本条件需要满足:
- 64位CPU(现代处理器基本都满足)
- 至少2GB内存(4GB以上更佳)
- 20GB可用磁盘空间
支持的操作系统包括:
- Linux(Ubuntu、Debian、CentOS等主流发行版)
- macOS 10.13及以上
- Windows 10/11 Pro/Enterprise(需要开启Hyper-V)
注意:Windows家庭版无法直接安装Docker Desktop,需要额外配置WSL2
2.2 系统环境检查
在Linux系统上,首先检查内核版本:
bash复制uname -r
要求3.10或更高版本(推荐4.x以上)
检查存储驱动支持:
bash复制ls -l /sys/class/misc/device-mapper
确保device-mapper存在
3. Linux系统安装Docker
3.1 Ubuntu/Debian安装步骤
- 卸载旧版本(如有):
bash复制sudo apt-get remove docker docker-engine docker.io containerd runc
- 安装依赖包:
bash复制sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加Docker官方GPG密钥:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 设置稳定版仓库:
bash复制echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装Docker引擎:
bash复制sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
3.2 CentOS/RHEL安装步骤
- 卸载旧版本:
bash复制sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装依赖:
bash复制sudo yum install -y yum-utils
- 设置仓库:
bash复制sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 安装Docker引擎:
bash复制sudo yum install docker-ce docker-ce-cli containerd.io
4. Windows系统安装Docker
4.1 Windows专业版/企业版安装
-
启用Hyper-V:
- 控制面板 → 程序和功能 → 启用或关闭Windows功能
- 勾选Hyper-V和容器功能
- 重启系统
-
下载Docker Desktop安装包:
- 官网下载地址:https://www.docker.com/products/docker-desktop
-
运行安装程序,按向导完成安装
4.2 Windows家庭版解决方案
家庭版用户需要通过WSL2安装:
- 启用WSL功能:
powershell复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
- 启用虚拟机平台:
powershell复制dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
-
下载并安装WSL2内核更新包
-
设置WSL2为默认版本:
powershell复制wsl --set-default-version 2
-
从Microsoft Store安装Ubuntu发行版
-
安装Docker Desktop for Windows(选择WSL2后端)
5. macOS系统安装Docker
5.1 Intel芯片Mac安装
- 下载Docker Desktop for Mac(Intel芯片版)
- 双击DMG文件,将Docker图标拖到Applications文件夹
- 首次运行时,系统会提示需要权限,按指引操作
5.2 Apple Silicon(M1/M2)芯片安装
- 下载Docker Desktop for Mac(Apple芯片版)
- 安装过程与Intel版相同
- 注意:部分x86镜像需要Rosetta 2转译
6. 安装后配置与验证
6.1 启动Docker服务
Linux系统:
bash复制sudo systemctl start docker
sudo systemctl enable docker
6.2 验证安装
运行测试容器:
bash复制docker run hello-world
看到"Hello from Docker!"消息表示安装成功
6.3 非root用户权限配置
为避免每次使用sudo,将用户加入docker组:
bash复制sudo usermod -aG docker $USER
需要重新登录生效
7. 常见问题与解决方案
7.1 镜像下载慢问题
配置国内镜像加速器(以阿里云为例):
- 登录阿里云容器镜像服务
- 获取专属加速器地址
- 创建或修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": ["https://<你的ID>.mirror.aliyuncs.com"]
}
- 重启服务:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
7.2 磁盘空间不足
Docker默认存储在/var/lib/docker,可能占用大量空间。解决方案:
- 查看磁盘使用:
bash复制docker system df
- 清理无用数据:
bash复制docker system prune
- 更改存储位置:
- 停止Docker服务
- 移动现有数据:
bash复制sudo mv /var/lib/docker /new/location- 创建符号链接:
bash复制sudo ln -s /new/location/docker /var/lib/docker
7.3 网络冲突问题
当Docker网络与主机网络冲突时:
- 查看当前网络配置:
bash复制docker network ls
- 创建自定义网络:
bash复制docker network create --subnet=172.18.0.0/16 mynet
- 运行容器时指定网络:
bash复制docker run --network=mynet ...
8. 生产环境优化建议
8.1 日志管理
默认配置下,容器日志可能无限增长。建议配置日志轮转:
修改/etc/docker/daemon.json:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
8.2 资源限制
为防止单个容器占用过多资源:
bash复制docker run -it --cpus="1.5" --memory="512m" ubuntu
限制容器使用1.5个CPU核心和512MB内存
8.3 安全加固
- 禁止容器特权模式:
bash复制docker run --security-opt=no-new-privileges ...
- 启用用户命名空间隔离:
bash复制dockerd --userns-remap=default
- 定期更新Docker版本:
bash复制sudo apt-get update && sudo apt-get upgrade docker-ce
9. 进阶配置与工具链
9.1 Docker Compose安装
管理多容器应用的利器:
- Linux系统安装:
bash复制sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- 验证安装:
bash复制docker-compose --version
9.2 可视化工具Portainer
提供Web界面管理Docker:
bash复制docker volume create portainer_data
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
访问http://localhost:9000 即可使用
9.3 构建优化技巧
- 使用多阶段构建减小镜像体积:
dockerfile复制FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
- 合理利用缓存层:
dockerfile复制# 变化频率低的指令放前面
COPY package.json .
RUN npm install
# 变化频率高的指令放后面
COPY . .
10. 不同场景下的Docker使用模式
10.1 开发环境
使用bind mount实现代码实时同步:
bash复制docker run -v $(pwd):/app -p 3000:3000 node:14
修改主机文件会立即反映到容器中
10.2 测试环境
利用Docker的隔离性实现并行测试:
bash复制docker run -d --name test1 myapp:test
docker run -d --name test2 myapp:test
每个测试用例在独立容器中运行
10.3 生产部署
使用swarm或k8s编排:
bash复制docker swarm init
docker stack deploy -c docker-compose.yml myapp
11. 版本管理与升级策略
11.1 版本兼容性检查
升级前检查:
bash复制docker version
确保Client和Server版本兼容
11.2 平滑升级方案
- 备份重要容器:
bash复制docker export -o mycontainer.tar mycontainer
- 备份卷数据:
bash复制docker run --rm --volumes-from mycontainer -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /data
- 停止服务并升级:
bash复制sudo apt-get update && sudo apt-get install --only-upgrade docker-ce
12. 性能监控与调优
12.1 资源监控
查看容器资源使用:
bash复制docker stats
12.2 性能分析工具
使用cAdvisor:
bash复制docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
访问http://localhost:8080 查看详细指标
13. 容器安全最佳实践
13.1 镜像扫描
使用Trivy扫描漏洞:
bash复制docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image myimage:latest
13.2 最小权限原则
运行容器时:
bash复制docker run --user 1000:1000 --read-only -t alpine
使用非root用户,并以只读模式运行
13.3 网络隔离
创建独立网络:
bash复制docker network create --internal secure-net
docker run --network=secure-net --name=db -d postgres
14. 备份与恢复策略
14.1 容器快照
导出容器:
bash复制docker export -o mycontainer.tar mycontainer
导入:
bash复制cat mycontainer.tar | docker import - myimage:snapshot
14.2 数据卷备份
备份卷数据:
bash复制docker run --rm --volumes-from db -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/postgresql/data
恢复:
bash复制docker run --rm --volumes-from db -v $(pwd):/backup ubuntu bash -c "cd /var/lib/postgresql/data && tar xvf /backup/backup.tar --strip 1"
15. 多架构支持与跨平台构建
15.1 构建多平台镜像
使用buildx:
bash复制docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myimage:multiarch --push .
15.2 运行不同架构容器
在M1 Mac上运行x86容器:
bash复制docker run --platform linux/amd64 ubuntu
16. 企业级部署考量
16.1 私有镜像仓库
搭建Harbor:
bash复制docker-compose -f harbor.yml up -d
16.2 访问控制
配置TLS证书:
bash复制dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2376
16.3 审计日志
启用详细日志:
json复制{
"log-level": "debug",
"audit-log": "/var/log/docker/audit.log"
}
17. 常见开发场景示例
17.1 Python开发环境
dockerfile复制FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
17.2 Node.js开发环境
dockerfile复制FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
17.3 Java Spring Boot应用
dockerfile复制FROM eclipse-temurin:17-jdk-jammy
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY src ./src
CMD ["./mvnw", "spring-boot:run"]
18. 持续集成中的Docker实践
18.1 GitHub Actions示例
yaml复制jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t myapp .
- name: Run tests
run: docker run myapp npm test
18.2 GitLab CI示例
yaml复制build_image:
stage: build
script:
- docker build -t myapp .
- docker run myapp npm test
19. 性能优化高级技巧
19.1 构建缓存优化
dockerfile复制# 单独复制package.json先安装依赖
COPY package.json .
RUN npm install
# 再复制其他文件
COPY . .
19.2 多阶段构建精简
dockerfile复制FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
19.3 镜像层合并
dockerfile复制RUN apt-get update && \
apt-get install -y build-essential && \
rm -rf /var/lib/apt/lists/*
20. 故障排查与调试技巧
20.1 容器内调试
进入运行中的容器:
bash复制docker exec -it mycontainer bash
20.2 日志分析
查看容器日志:
bash复制docker logs -f --tail 100 mycontainer
20.3 网络诊断
检查容器网络:
bash复制docker network inspect bridge
测试容器间连通性:
bash复制docker run --rm --network mynet alpine ping db
21. 容器与主机交互
21.1 文件拷贝
从容器复制文件到主机:
bash复制docker cp mycontainer:/path/to/file /host/path
21.2 端口映射
动态端口映射:
bash复制docker run -p 8080:80 nginx
21.3 环境变量传递
bash复制docker run -e "ENV_VAR=value" myimage
22. 自定义网络配置
22.1 创建自定义网络
bash复制docker network create --driver=bridge --subnet=172.28.0.0/16 mynet
22.2 指定静态IP
bash复制docker run --network=mynet --ip=172.28.1.2 myimage
22.3 网络别名
bash复制docker run --network=mynet --network-alias=db postgres
23. 存储驱动选择与优化
23.1 查看当前存储驱动
bash复制docker info | grep "Storage Driver"
23.2 推荐配置
对于生产环境:
- overlay2(Linux默认)
- zfs(适合大容量存储)
配置方法:
json复制{
"storage-driver": "overlay2"
}
23.3 性能对比
| 驱动类型 | 优点 | 缺点 |
|---|---|---|
| overlay2 | 性能好,社区支持强 | 需要较新内核 |
| aufs | 兼容性好 | 性能较差 |
| devicemapper | 稳定性高 | 配置复杂 |
24. 容器资源限制实践
24.1 CPU限制
限制使用1个CPU核心:
bash复制docker run --cpus="1.0" myimage
24.2 内存限制
限制512MB内存,600MB软限制:
bash复制docker run -m 512m --memory-reservation=600m myimage
24.3 IO限制
限制磁盘IO:
bash复制docker run --device-read-bps /dev/sda:1mb myimage
25. 容器编排入门
25.1 Docker Swarm基础
初始化Swarm:
bash复制docker swarm init
部署服务:
bash复制docker service create --replicas 3 -p 80:80 --name web nginx
25.2 服务扩展
扩展到5个副本:
bash复制docker service scale web=5
25.3 滚动更新
bash复制docker service update --image nginx:1.19 web
26. 容器化数据库实践
26.1 MySQL容器
bash复制docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-v mysql_data:/var/lib/mysql \
mysql:8.0
26.2 Redis容器
bash复制docker run -d \
--name redis \
-v redis_data:/data \
redis:6 \
redis-server --save 60 1 --loglevel warning
26.3 MongoDB容器
bash复制docker run -d \
--name mongo \
-v mongo_data:/data/db \
mongo:5.0
27. 微服务架构中的Docker
27.1 服务发现
使用Consul:
bash复制docker run -d --name=consul -p 8500:8500 consul
27.2 API网关
使用Kong:
bash复制docker run -d --name kong \
--link consul:consul \
-e "KONG_DATABASE=consul" \
-e "KONG_PG_HOST=consul" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
kong
27.3 配置中心
使用Spring Cloud Config:
bash复制docker run -d --name config-server \
-p 8888:8888 \
-v $(pwd)/config:/config \
springcloud/config-server
28. 机器学习环境容器化
28.1 Jupyter Notebook
bash复制docker run -d \
-p 8888:8888 \
-v $(pwd):/home/jovyan/work \
jupyter/datascience-notebook
28.2 TensorFlow服务
bash复制docker run -d \
-p 8501:8501 \
--mount type=bind,source=$(pwd)/models,target=/models \
-e MODEL_NAME=my_model \
tensorflow/serving
28.3 PyTorch训练
dockerfile复制FROM pytorch/pytorch:latest
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "train.py"]
29. 边缘计算中的容器应用
29.1 轻量级运行时
使用Alpine基础镜像:
dockerfile复制FROM alpine:latest
RUN apk add --no-cache python3 py3-pip
29.2 资源受限环境
限制资源使用:
bash复制docker run -it --cpus="0.5" --memory="128m" myedgeapp
29.3 离线部署
保存和加载镜像:
bash复制docker save -o myapp.tar myapp:latest
docker load -i myapp.tar
30. 容器安全扫描与加固
30.1 漏洞扫描
使用Clair:
bash复制docker run -d --name clair -p 6060-6061:6060-6061 quay.io/coreos/clair:latest
30.2 镜像签名
使用Notary:
bash复制docker trust sign myimage:latest
30.3 运行时保护
使用Falco:
bash复制docker run -d \
--name falco \
--privileged \
-v /var/run/docker.sock:/host/var/run/docker.sock \
-v /dev:/host/dev \
-v /proc:/host/proc:ro \
-v /boot:/host/boot:ro \
-v /lib/modules:/host/lib/modules:ro \
-v /usr:/host/usr:ro \
falcosecurity/falco
31. 容器监控与告警
31.1 Prometheus监控
bash复制docker run -d \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
31.2 Grafana可视化
bash复制docker run -d \
-p 3000:3000 \
grafana/grafana
31.3 告警管理
使用Alertmanager:
bash复制docker run -d \
-p 9093:9093 \
-v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager
32. 容器日志管理方案
32.1 ELK栈收集
bash复制docker-compose -f elk.yml up -d
32.2 Fluentd处理
bash复制docker run -d \
-v $(pwd)/fluent.conf:/fluentd/etc/fluent.conf \
-p 24224:24224 \
fluent/fluentd
32.3 Loki轻量方案
bash复制docker run -d \
-p 3100:3100 \
grafana/loki
33. 多租户环境隔离
33.1 用户命名空间
bash复制dockerd --userns-remap=default
33.2 资源配额
使用cgroups限制:
bash复制docker run -d \
--name tenant1 \
--cpus="0.5" \
--memory="512m" \
myapp
33.3 网络隔离
bash复制docker network create --internal tenant1-net
34. 容器化传统应用
34.1 单体应用容器化
dockerfile复制FROM tomcat:9.0
COPY myapp.war /usr/local/tomcat/webapps/
EXPOSE 8080
34.2 数据库迁移
bash复制docker run -d \
--name legacy-db \
-v /path/to/data:/var/lib/mysql \
mysql:5.7
34.3 兼容性测试
bash复制docker run -it --rm \
-v $(pwd):/app \
-w /app \
mcr.microsoft.com/dotnet/framework/sdk:4.8 \
msbuild MyApp.sln
35. 无服务器容器方案
35.1 AWS Fargate
bash复制aws ecs create-service \
--cluster my-cluster \
--service-name my-service \
--task-definition my-task:1 \
--launch-type FARGATE
35.2 Azure Container Instances
bash复制az container create \
--name mycontainer \
--image myimage \
--resource-group myResourceGroup
35.3 Google Cloud Run
bash复制gcloud run deploy my-service \
--image gcr.io/my-project/my-image \
--platform managed
36. 容器镜像构建最佳实践
36.1 最小化基础镜像
dockerfile复制FROM alpine:latest
RUN apk add --no-cache python3
36.2 多阶段构建
dockerfile复制FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM scratch
COPY --from=builder /app/myapp /
CMD ["/myapp"]
36.3 安全扫描
bash复制docker scan myimage:latest
37. 容器网络高级配置
37.1 自定义DNS
bash复制docker run --dns 8.8.8.8 myimage
37.2 网络性能调优
bash复制docker run --network=host myimage
37.3 多主机网络
使用Overlay网络:
bash复制docker network create -d overlay my-overlay-net
38. 容器存储高级方案
38.1 分布式存储
使用Ceph:
bash复制docker run -d \
--name ceph \
--net=host \
-v /etc/ceph:/etc/ceph \
-v /var/lib/ceph:/var/lib/ceph \
ceph/daemon
38.2 高性能存储
使用NVMe:
bash复制docker run -v /mnt/nvme:/data myimage
38.3 存储驱动选择
| 场景 | 推荐驱动 |
|---|---|
| 高并发小文件 | overlay2 |
| 大文件顺序读写 | devicemapper |
| 企业级存储 | zfs |
39. 容器与虚拟机混合部署
39.1 KVM与Docker共存
bash复制docker run --runtime=kata myimage
39.2 安全沙箱容器
使用gVisor:
bash复制docker run --runtime=runsc myimage
39.3 性能对比
| 指标 | 容器 | 虚拟机 |
|---|---|---|
| 启动时间 | 秒级 | 分钟级 |
| 资源开销 | 低 | 高 |
| 隔离性 | 较弱 | 强 |
40. 未来趋势与新兴技术
40.1 WebAssembly容器
bash复制docker run --runtime=wasmtime wasm-app
40.2 机密计算容器
bash复制docker run --enclave myimage
40.3 边缘容器平台
使用K3s:
bash复制curl -sfL https://get.k3s.io | sh -
