1. Docker安装前的环境准备
在开始安装Docker之前,我们需要先了解几个关键概念。Docker是一种容器化技术,它允许你将应用程序及其依赖项打包到一个轻量级、可移植的容器中。与虚拟机不同,Docker容器共享主机操作系统内核,这使得它们更加高效和快速。
1.1 系统要求检查
对于Windows系统:
- Windows 10 64位专业版、企业版或教育版(版本1903或更高)
- 必须启用Hyper-V和容器功能
- 至少4GB内存(建议8GB以上)
对于Linux系统:
- 64位架构(x86_64或arm64)
- 内核版本3.10或更高(建议4.x或更高)
- 支持overlay2存储驱动
对于macOS系统:
- macOS 10.15或更高版本
- 至少4GB内存(建议8GB以上)
- 需要安装Apple Hypervisor框架
重要提示:在Windows家庭版上安装Docker Desktop需要额外的配置步骤,因为家庭版默认不支持Hyper-V。
1.2 虚拟化支持检查
虚拟化技术是Docker运行的关键。你可以通过以下方式检查你的系统是否启用了虚拟化支持:
在Windows上:
- 打开任务管理器(Ctrl+Shift+Esc)
- 切换到"性能"选项卡
- 查看CPU部分,确认"虚拟化"是否显示为"已启用"
在Linux上,可以运行以下命令:
grep -E --color 'vmx|svm' /proc/cpuinfo如果有输出,则表示CPU支持虚拟化技术。
在BIOS中启用虚拟化的步骤(不同主板可能略有差异):
- 重启电脑并进入BIOS设置(通常是按Del、F2或F12键)
- 找到与虚拟化相关的选项(通常名为"Intel VT-x"或"AMD-V")
- 将其设置为"Enabled"
- 保存设置并退出
2. Docker安装详细步骤
2.1 Windows系统安装Docker Desktop
下载Docker Desktop安装程序:
- 访问Docker官网(https://www.docker.com/products/docker-desktop)
- 点击"Download for Windows"按钮
运行安装程序:
- 双击下载的Docker Desktop Installer.exe文件
- 按照向导完成安装(建议使用默认设置)
首次启动配置:
- 安装完成后,从开始菜单启动Docker Desktop
- 系统可能会提示你启用WSL 2功能,点击确认
- 等待Docker服务启动(首次启动可能需要几分钟)
验证安装: 打开命令提示符或PowerShell,运行:
docker --version docker run hello-world如果看到"Hello from Docker!"消息,说明安装成功。
2.2 Linux系统安装Docker Engine
对于基于Debian的系统(如Ubuntu):
卸载旧版本(如果有):
sudo apt-get remove docker docker-engine docker.io containerd runc设置仓库:
sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release添加Docker官方GPG密钥:
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg设置稳定版仓库:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null安装Docker Engine:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin验证安装:
sudo docker run hello-world
对于基于RPM的系统(如CentOS):
卸载旧版本:
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine设置仓库:
sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo安装Docker Engine:
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin启动Docker:
sudo systemctl start docker验证安装:
sudo docker run hello-world
2.3 macOS系统安装Docker Desktop
下载Docker Desktop for Mac:
- 访问Docker官网(https://www.docker.com/products/docker-desktop)
- 点击"Download for Mac"按钮
安装Docker Desktop:
- 双击下载的Docker.dmg文件
- 将Docker图标拖到Applications文件夹
首次启动:
- 从Applications文件夹启动Docker
- 系统可能会提示你输入密码以授权安装
- 等待Docker服务启动(首次启动可能需要几分钟)
验证安装: 打开终端,运行:
docker --version docker run hello-world
3. Docker安装后的基本配置
3.1 配置国内镜像加速器
由于网络原因,直接从Docker Hub拉取镜像可能会很慢。我们可以配置国内镜像源来加速:
对于Linux系统: 编辑或创建
/etc/docker/daemon.json文件:{ "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] }然后重启Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker对于Windows/macOS的Docker Desktop:
- 右键点击系统托盘中的Docker图标
- 选择"Settings" > "Docker Engine"
- 在配置文件中添加上述镜像源配置
- 点击"Apply & Restart"按钮
3.2 配置用户权限(Linux)
默认情况下,Docker需要root权限。为了避免每次都要使用sudo,可以将当前用户添加到docker组:
sudo groupadd docker sudo usermod -aG docker $USER newgrp docker验证是否生效:
docker run hello-world如果不需要sudo就能运行,说明配置成功。
3.3 配置Docker存储位置(可选)
默认情况下,Docker会将镜像和容器存储在系统盘。如果需要更改存储位置:
对于Linux系统:
停止Docker服务:
sudo systemctl stop docker移动现有数据:
sudo mv /var/lib/docker /path/to/new/location创建符号链接:
sudo ln -s /path/to/new/location/docker /var/lib/docker重启Docker服务:
sudo systemctl start docker
对于Windows/macOS的Docker Desktop:
- 在设置中找到"Resources" > "Disk image location"
- 选择新的存储位置
- 点击"Apply & Restart"按钮
4. 常见问题与解决方案
4.1 Docker Desktop启动失败问题
问题1:Virtualization support not detected
解决方案:
- 确认BIOS中已启用虚拟化技术(见1.2节)
- 对于Windows家庭版,需要先安装WSL 2:
wsl --install - 重启电脑后再次尝试启动Docker Desktop
问题2:Docker Desktop启动后立即退出
解决方案:
- 尝试重置Docker Desktop到出厂设置
- 检查系统日志中的具体错误信息
- 确保没有其他虚拟化软件(如VMware、VirtualBox)与Docker冲突
4.2 镜像拉取失败问题
问题:Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection
解决方案:
- 检查网络连接是否正常
- 尝试配置国内镜像源(见3.1节)
- 对于企业网络,可能需要配置代理:
mkdir -p /etc/systemd/system/docker.service.d echo '[Service] Environment="HTTP_PROXY=http://proxy.example.com:8080/" Environment="HTTPS_PROXY=http://proxy.example.com:8080/"' > /etc/systemd/system/docker.service.d/http-proxy.conf systemctl daemon-reload systemctl restart docker
4.3 容器权限问题
问题:Got permission denied while trying to connect to the Docker daemon socket
解决方案:
- 确保当前用户在docker组中(见3.2节)
- 如果问题仍然存在,可以尝试:
但这不是推荐的安全做法,仅用于临时测试sudo chmod 666 /var/run/docker.sock
4.4 存储空间不足问题
问题:No space left on device
解决方案:
- 清理不再使用的容器:
docker container prune - 清理不再使用的镜像:
docker image prune -a - 对于Docker Desktop,可以在设置中增加磁盘映像大小
5. Docker基本使用入门
5.1 常用Docker命令
容器管理:
# 运行容器 docker run -it ubuntu bash # 列出运行中的容器 docker ps # 列出所有容器(包括停止的) docker ps -a # 停止容器 docker stop <container_id> # 启动已停止的容器 docker start <container_id> # 删除容器 docker rm <container_id>镜像管理:
# 拉取镜像 docker pull ubuntu:20.04 # 列出本地镜像 docker images # 删除镜像 docker rmi <image_id> # 构建镜像 docker build -t my-image .日志查看:
# 查看容器日志 docker logs <container_id> # 实时查看日志 docker logs -f <container_id>
5.2 运行第一个应用
让我们运行一个简单的Nginx web服务器:
拉取Nginx镜像:
docker pull nginx运行容器:
docker run --name my-nginx -p 8080:80 -d nginx解释:
--name:为容器指定一个名称-p:将容器的80端口映射到主机的8080端口-d:在后台运行容器
验证: 打开浏览器访问http://localhost:8080,应该能看到Nginx的欢迎页面。
停止并删除容器:
docker stop my-nginx docker rm my-nginx
5.3 使用Docker Compose管理多容器应用
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。
安装Docker Compose:
- 对于Linux:
sudo apt install docker-compose-plugin - 对于Windows/macOS:Docker Desktop已包含Compose
- 对于Linux:
创建docker-compose.yml文件:
version: '3' services: web: image: nginx ports: - "8080:80" db: image: mysql environment: MYSQL_ROOT_PASSWORD: example启动服务:
docker compose up -d停止服务:
docker compose down
6. 高级配置与优化
6.1 资源限制配置
默认情况下,Docker容器可以使用主机的所有资源。我们可以限制容器的资源使用:
内存限制:
docker run -it --memory=512m ubuntu bashCPU限制:
docker run -it --cpus=1.5 ubuntu bash查看资源使用情况:
docker stats
6.2 网络配置
Docker提供了多种网络模式:
桥接模式(默认):
docker run -it --network=bridge ubuntu bash主机模式:
docker run -it --network=host ubuntu bash自定义网络:
docker network create my-network docker run -it --network=my-network ubuntu bash
6.3 数据持久化
容器是临时的,默认情况下数据不会持久化。我们可以使用卷(volumes)来持久化数据:
创建命名卷:
docker volume create my-volume使用卷:
docker run -it --mount source=my-volume,target=/data ubuntu bash绑定挂载(将主机目录挂载到容器):
docker run -it --mount type=bind,source=/host/path,target=/container/path ubuntu bash
6.4 安全最佳实践
不要以root用户运行容器:
docker run -it --user 1000:1000 ubuntu bash限制容器能力:
docker run -it --cap-drop=ALL --cap-add=NET_BIND_SERVICE ubuntu bash使用只读文件系统:
docker run -it --read-only ubuntu bash定期更新Docker和镜像:
sudo apt-get update && sudo apt-get upgrade docker-ce docker pull ubuntu:latest
7. 实际应用场景示例
7.1 开发环境搭建
使用Docker可以快速搭建一致的开发环境:
创建Dockerfile:
FROM python:3.9 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]构建镜像:
docker build -t my-app .运行容器:
docker run -it -p 5000:5000 -v $(pwd):/app my-app
7.2 数据库服务部署
快速部署MySQL数据库:
docker run --name mysql-server \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -e MYSQL_DATABASE=my-db \ -e MYSQL_USER=user \ -e MYSQL_PASSWORD=password \ -p 3306:3306 \ -v mysql-data:/var/lib/mysql \ -d mysql:8.07.3 微服务架构部署
使用Docker Compose部署微服务:
version: '3' services: frontend: build: ./frontend ports: - "3000:3000" depends_on: - backend backend: build: ./backend ports: - "5000:5000" depends_on: - db db: image: postgres:13 environment: POSTGRES_PASSWORD: password volumes: - postgres-data:/var/lib/postgresql/data volumes: postgres-data:7.4 CI/CD流水线集成
在Jenkins中使用Docker:
- 安装Docker插件
- 在Jenkinsfile中添加Docker构建步骤:
pipeline { agent any stages { stage('Build') { steps { script { docker.build("my-image:${env.BUILD_ID}") } } } stage('Test') { steps { script { docker.image("my-image:${env.BUILD_ID}").inside { sh 'npm test' } } } } } }
8. 性能监控与日志管理
8.1 监控Docker容器
使用内置命令:
docker stats docker top <container_id>使用cAdvisor:
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查看监控数据
8.2 日志管理
配置日志驱动: 编辑
/etc/docker/daemon.json:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }使用ELK栈收集日志:
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.9.3 docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.9.3 docker run -d --name logstash --link elasticsearch:elasticsearch -v /path/to/logstash.conf:/usr/share/logstash/pipeline/logstash.conf logstash:7.9.3
8.3 资源使用分析
使用docker system df查看磁盘使用:
docker system df清理无用资源:
docker system prune分析镜像层:
docker history <image_name>
9. 备份与迁移策略
9.1 容器备份
提交容器为镜像:
docker commit <container_id> my-backup导出容器:
docker export <container_id> > container.tar导入容器:
cat container.tar | docker import - my-imported-image
9.2 镜像备份
保存镜像为文件:
docker save -o my-image.tar my-image:tag加载镜像:
docker load -i my-image.tar
9.3 卷备份
备份命名卷:
docker run --rm -v my-volume:/volume -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /volume恢复命名卷:
docker run --rm -v my-volume:/volume -v $(pwd):/backup ubuntu bash -c "cd /volume && tar xvf /backup/backup.tar --strip 1"
9.4 完整迁移方案
在源主机上:
docker save $(docker images -q) -o all-images.tar将all-images.tar传输到目标主机
在目标主机上:
docker load -i all-images.tar对于运行中的容器,可以使用docker-compose.yml文件来重新创建
10. 故障排查与调试技巧
10.1 容器调试
进入运行中的容器:
docker exec -it <container_id> bash检查容器配置:
docker inspect <container_id>查看容器进程:
docker top <container_id>
10.2 网络问题排查
检查容器网络:
docker network inspect bridge测试容器间连通性:
docker run --rm -it --network=my-network alpine ping other-container查看iptables规则(Linux):
sudo iptables -L -n
10.3 存储问题排查
检查卷信息:
docker volume inspect my-volume查看存储驱动信息:
docker info | grep Storage检查overlay2挂载点:
mount | grep overlay
10.4 性能问题排查
使用docker stats监控资源使用
使用perf工具分析(Linux):
docker run --rm --privileged --pid=host -it alpine sh apk add perf perf top使用sysdig工具:
docker run -i -t --name sysdig --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 sysdig/sysdig
11. 安全加固与最佳实践
11.1 最小权限原则
使用非root用户运行容器:
docker run -it --user 1000:1000 ubuntu bash限制内核能力:
docker run -it --cap-drop=ALL --cap-add=NET_BIND_SERVICE ubuntu bash使用只读文件系统:
docker run -it --read-only ubuntu bash
11.2 镜像安全扫描
使用Docker内置扫描(需要Docker Desktop):
docker scan <image_name>使用第三方工具如Trivy:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image <image_name>
11.3 网络隔离
创建自定义网络:
docker network create --driver=bridge --subnet=192.168.100.0/24 my-network限制容器间通信:
docker network create --opt com.docker.network.bridge.enable_icc=false isolated-net
11.4 资源限制
限制内存使用:
docker run -it --memory=512m --memory-swap=1g ubuntu bash限制CPU使用:
docker run -it --cpus=1.5 ubuntu bash限制IO:
docker run -it --device-read-bps /dev/sda:1mb ubuntu bash
12. 企业级部署考虑
12.1 高可用架构
使用Docker Swarm:
docker swarm init docker service create --replicas 3 --name web nginx使用Kubernetes:
minikube start kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=LoadBalancer
12.2 镜像仓库管理
搭建私有仓库:
docker run -d -p 5000:5000 --restart=always --name registry registry:2推送镜像到私有仓库:
docker tag my-image localhost:5000/my-image docker push localhost:5000/my-image从私有仓库拉取:
docker pull localhost:5000/my-image
12.3 配置管理
使用config存储配置:
echo "config content" | docker config create my-config - docker service create --config src=my-config,target=/app/config.conf nginx使用secret存储敏感信息:
echo "secret" | docker secret create my-secret - docker service create --secret my-secret nginx
12.4 监控与告警
使用Prometheus监控:
docker run -d -p 9090:9090 --name=prometheus prom/prometheus配置Grafana可视化:
docker run -d -p 3000:3000 --name=grafana grafana/grafana设置告警:
docker run -d --name=alertmanager -p 9093:9093 prom/alertmanager
13. 持续集成与持续部署
13.1 GitHub Actions集成
name: CI/CD Pipeline on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t my-image . - name: Login to Docker Hub run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin - name: Push Docker image run: | docker tag my-image username/my-image:latest docker push username/my-image:latest13.2 GitLab CI集成
image: docker:stable services: - docker:dind stages: - build - deploy build: stage: build script: - docker build -t my-image . - docker tag my-image registry.example.com/my-image:latest - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.example.com - docker push registry.example.com/my-image:latest deploy: stage: deploy script: - ssh user@server "docker pull registry.example.com/my-image:latest && docker-compose up -d"13.3 Jenkins Pipeline集成
pipeline { agent any stages { stage('Build') { steps { script { docker.build("my-image:${env.BUILD_ID}") } } } stage('Test') { steps { script { docker.image("my-image:${env.BUILD_ID}").inside { sh 'npm test' } } } } stage('Deploy') { steps { script { docker.withRegistry('https://registry.example.com', 'credentials-id') { docker.image("my-image:${env.BUILD_ID}").push('latest') } sshagent(['deploy-key']) { sh "ssh user@server 'docker pull registry.example.com/my-image:latest && docker-compose up -d'" } } } } } }14. 多架构支持与跨平台部署
14.1 构建多架构镜像
创建构建器实例:
docker buildx create --name mybuilder --use构建多架构镜像:
docker buildx build --platform linux/amd64,linux/arm64 -t username/my-image:latest --push .
14.2 运行跨平台容器
显式指定平台:
docker run --platform linux/arm64 -it arm64v8/ubuntu bash使用QEMU模拟:
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
14.3 验证镜像架构
docker inspect --format='{{.Architecture}}' <image_name>15. 性能优化技巧
15.1 构建优化
使用多阶段构建:
FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest WORKDIR /app COPY --from=builder /app/myapp . CMD ["./myapp"]合理利用构建缓存:
- 将不经常变化的指令放在前面
- 合并RUN指令减少层数
15.2 运行时优化
限制资源使用(见11.4节)
使用适当的存储驱动:
- 对于Linux:overlay2
- 对于Windows:windowsfilter
调整日志配置:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
15.3 网络优化
使用host网络模式减少NAT开销
对于大量容器,考虑使用macvlan或ipvlan驱动
调整MTU大小:
docker network create --opt com.docker.network.driver.mtu=1450 my-network
16. 社区资源与进阶学习
16.1 官方文档
- Docker官方文档:https://docs.docker.com/
- Docker Compose文档:https://docs.docker.com/compose/
- Docker Swarm文档:https://docs.docker.com/engine/swarm/
16.2 开源项目
Portainer - Docker管理UI:
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ceTraefik - 反向代理:
docker run -d -p 8080:8080 -p 80:80 --name=traefik -v /var/run/docker.sock:/var/run/docker.sock traefik:latestWatchtower - 自动更新容器:
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
16.3 学习资源
在线课程:
- Docker官方培训:https://training.mirantis.com/
- Udemy Docker课程
书籍推荐:
- 《Docker Deep Dive》
- 《Using Docker》
社区论坛:
- Docker官方论坛:https://forums.docker.com/
- Stack Overflow Docker标签
17. 未来趋势与新技术
17.1 容器运行时接口(CRI)
containerd作为默认运行时:
dockerd --containerd /run/containerd/containerd.sock使用cri-o作为替代运行时
17.2 WebAssembly与Docker
- 使用wasm运行时:
docker run --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 hello-world-wasm
17.3 无服务器容器
AWS Fargate:
aws ecs create-service --cluster my-cluster --service-name my-service --task-definition my-task --launch-type FARGATEAzure Container Instances:
az container create --resource-group my-group --name my-container --image my-image --ports 80
17.4 边缘计算与IoT
使用Docker在边缘设备:
docker run -d --name edge-agent -v /var/run/docker.sock:/var/run/docker.sock azureiotedge-agent轻量级运行时:
docker run --rm --runtime=io.containerd.runc.v2 alpine echo "Hello"
18. 个人经验与建议
在实际工作中使用Docker多年,我总结了以下几点经验:
镜像管理:
- 定期清理无用镜像(
docker image prune -a) - 为生产环境镜像使用特定标签(如
v1.2.3),避免使用latest - 使用多阶段构建减小镜像体积
- 定期清理无用镜像(
网络配置:
- 为不同服务使用不同的自定义网络
- 对于微服务架构,考虑使用服务网格(如Linkerd或Istio)
存储管理:
- 对于数据库等有状态服务,始终使用命名卷
- 定期备份重要卷数据
安全实践:
- 定期扫描镜像中的漏洞
- 使用非root用户运行容器
- 限制容器资源使用
CI/CD集成:
- 在CI流水线中加入镜像扫描步骤
- 使用构建缓存加速CI过程
- 考虑使用Kaniko或Buildah在无Docker环境下构建镜像
监控与日志:
- 集中收集容器日志
- 监控容器资源使用情况
- 设置适当的告警阈值
团队协作:
- 制定统一的Dockerfile编写规范
- 使用相同的开发环境配置
- 文档化所有自定义镜像的使用方法
最后一个小技巧:当遇到奇怪的Docker问题时,尝试先docker system prune清理系统,然后重启Docker服务,这能解决很多莫名其妙的问题。