Docker安装与配置全指南:从入门到实践 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上打开任务管理器CtrlShiftEsc切换到性能选项卡查看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 Enginesudo 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 Enginesudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin启动Dockersudo systemctl start docker验证安装sudo docker run hello-world2.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-world3. 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启动失败问题问题1Virtualization support not detected解决方案确认BIOS中已启用虚拟化技术见1.2节对于Windows家庭版需要先安装WSL 2wsl --install重启电脑后再次尝试启动Docker Desktop问题2Docker 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] EnvironmentHTTP_PROXYhttp://proxy.example.com:8080/ EnvironmentHTTPS_PROXYhttp://proxy.example.com:8080/ /etc/systemd/system/docker.service.d/http-proxy.conf systemctl daemon-reload systemctl restart docker4.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_id5.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-nginx5.3 使用Docker Compose管理多容器应用Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。安装Docker Compose对于Linuxsudo apt install docker-compose-plugin对于Windows/macOSDocker Desktop已包含Compose创建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 down6. 高级配置与优化6.1 资源限制配置默认情况下Docker容器可以使用主机的所有资源。我们可以限制容器的资源使用内存限制docker run -it --memory512m ubuntu bashCPU限制docker run -it --cpus1.5 ubuntu bash查看资源使用情况docker stats6.2 网络配置Docker提供了多种网络模式桥接模式默认docker run -it --networkbridge ubuntu bash主机模式docker run -it --networkhost ubuntu bash自定义网络docker network create my-network docker run -it --networkmy-network ubuntu bash6.3 数据持久化容器是临时的默认情况下数据不会持久化。我们可以使用卷(volumes)来持久化数据创建命名卷docker volume create my-volume使用卷docker run -it --mount sourcemy-volume,target/data ubuntu bash绑定挂载将主机目录挂载到容器docker run -it --mount typebind,source/host/path,target/container/path ubuntu bash6.4 安全最佳实践不要以root用户运行容器docker run -it --user 1000:1000 ubuntu bash限制容器能力docker run -it --cap-dropALL --cap-addNET_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:latest7. 实际应用场景示例7.1 开发环境搭建使用Docker可以快速搭建一致的开发环境创建DockerfileFROM 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-app7.2 数据库服务部署快速部署MySQL数据库docker run --name mysql-server \ -e MYSQL_ROOT_PASSWORDmy-secret-pw \ -e MYSQL_DATABASEmy-db \ -e MYSQL_USERuser \ -e MYSQL_PASSWORDpassword \ -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使用cAdvisordocker 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 \ --publish8080:8080 \ --detachtrue \ --namecadvisor \ 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.typesingle-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.38.3 资源使用分析使用docker system df查看磁盘使用docker system df清理无用资源docker system prune分析镜像层docker history image_name9. 备份与迁移策略9.1 容器备份提交容器为镜像docker commit container_id my-backup导出容器docker export container_id container.tar导入容器cat container.tar | docker import - my-imported-image9.2 镜像备份保存镜像为文件docker save -o my-image.tar my-image:tag加载镜像docker load -i my-image.tar9.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 19.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_id10.2 网络问题排查检查容器网络docker network inspect bridge测试容器间连通性docker run --rm -it --networkmy-network alpine ping other-container查看iptables规则Linuxsudo iptables -L -n10.3 存储问题排查检查卷信息docker volume inspect my-volume查看存储驱动信息docker info | grep Storage检查overlay2挂载点mount | grep overlay10.4 性能问题排查使用docker stats监控资源使用使用perf工具分析Linuxdocker run --rm --privileged --pidhost -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/sysdig11. 安全加固与最佳实践11.1 最小权限原则使用非root用户运行容器docker run -it --user 1000:1000 ubuntu bash限制内核能力docker run -it --cap-dropALL --cap-addNET_BIND_SERVICE ubuntu bash使用只读文件系统docker run -it --read-only ubuntu bash11.2 镜像安全扫描使用Docker内置扫描需要Docker Desktopdocker scan image_name使用第三方工具如Trivydocker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image image_name11.3 网络隔离创建自定义网络docker network create --driverbridge --subnet192.168.100.0/24 my-network限制容器间通信docker network create --opt com.docker.network.bridge.enable_iccfalse isolated-net11.4 资源限制限制内存使用docker run -it --memory512m --memory-swap1g ubuntu bash限制CPU使用docker run -it --cpus1.5 ubuntu bash限制IOdocker run -it --device-read-bps /dev/sda:1mb ubuntu bash12. 企业级部署考虑12.1 高可用架构使用Docker Swarmdocker swarm init docker service create --replicas 3 --name web nginx使用Kubernetesminikube start kubectl create deployment nginx --imagenginx kubectl expose deployment nginx --port80 --typeLoadBalancer12.2 镜像仓库管理搭建私有仓库docker run -d -p 5000:5000 --restartalways --name registry registry:2推送镜像到私有仓库docker tag my-image localhost:5000/my-image docker push localhost:5000/my-image从私有仓库拉取docker pull localhost:5000/my-image12.3 配置管理使用config存储配置echo config content | docker config create my-config - docker service create --config srcmy-config,target/app/config.conf nginx使用secret存储敏感信息echo secret | docker secret create my-secret - docker service create --secret my-secret nginx12.4 监控与告警使用Prometheus监控docker run -d -p 9090:9090 --nameprometheus prom/prometheus配置Grafana可视化docker run -d -p 3000:3000 --namegrafana grafana/grafana设置告警docker run -d --namealertmanager -p 9093:9093 prom/alertmanager13. 持续集成与持续部署13.1 GitHub Actions集成name: CI/CD Pipeline on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - 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 userserver docker pull registry.example.com/my-image:latest docker-compose up -d13.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 userserver 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 yes14.3 验证镜像架构docker inspect --format{{.Architecture}} image_name15. 性能优化技巧15.1 构建优化使用多阶段构建FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest WORKDIR /app COPY --frombuilder /app/myapp . CMD [./myapp]合理利用构建缓存将不经常变化的指令放在前面合并RUN指令减少层数15.2 运行时优化限制资源使用见11.4节使用适当的存储驱动对于Linuxoverlay2对于Windowswindowsfilter调整日志配置{ 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.mtu1450 my-network16. 社区资源与进阶学习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管理UIdocker run -d -p 9000:9000 --nameportainer --restartalways -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ceTraefik - 反向代理docker run -d -p 8080:8080 -p 80:80 --nametraefik -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/watchtower16.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 --runtimeio.containerd.wasmedge.v1 --platformwasi/wasm32 hello-world-wasm17.3 无服务器容器AWS Fargateaws ecs create-service --cluster my-cluster --service-name my-service --task-definition my-task --launch-type FARGATEAzure Container Instancesaz container create --resource-group my-group --name my-container --image my-image --ports 8017.4 边缘计算与IoT使用Docker在边缘设备docker run -d --name edge-agent -v /var/run/docker.sock:/var/run/docker.sock azureiotedge-agent轻量级运行时docker run --rm --runtimeio.containerd.runc.v2 alpine echo Hello18. 个人经验与建议在实际工作中使用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服务这能解决很多莫名其妙的问题。