Linux系统下Docker安装与配置全指南 1. 为什么要在Linux上安装Docker作为一名长期在Linux环境下工作的开发者我深刻理解容器化技术带来的变革。Docker作为目前最流行的容器引擎能够帮助我们快速构建、部署和运行应用程序。与传统的虚拟机相比Docker容器更加轻量级启动速度更快资源占用更少特别适合现代微服务架构的开发部署需求。在Linux上安装Docker有几个显著优势原生支持Docker最初就是为Linux设计的在Linux上运行性能最佳资源利用率高不需要像Windows或Mac那样运行额外的虚拟机层稳定性强Linux内核的cgroups和namespace特性为容器提供了坚实的隔离基础社区支持完善遇到问题时更容易找到解决方案和社区支持注意虽然Docker也支持Windows和Mac但在这些系统上实际上是运行在一个Linux虚拟机中性能会有一定损耗。2. 安装前的准备工作2.1 系统要求检查在开始安装前我们需要确认系统满足Docker的基本要求内核版本检查uname -r建议使用3.10或更高版本的Linux内核。我建议使用4.x或更高版本以获得更好的稳定性和功能支持。存储驱动检查ls -l /sys/class/misc/device-mapperDocker需要device-mapper支持这是大多数现代Linux发行版的标配。虚拟化支持检查可选grep -E --color vmx|svm /proc/cpuinfo如果你计划在Docker中运行需要硬件虚拟化的应用如某些数据库这个检查很重要。2.2 卸载旧版本如果你之前安装过旧版本的Docker可能叫docker或docker-engine建议先卸载它们以避免冲突sudo apt-get remove docker docker-engine docker.io containerd runc2.3 设置仓库Docker官方推荐通过仓库安装这样可以方便后续的升级维护。我们需要先设置Docker的APT仓库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/null3. Docker安装步骤详解3.1 安装Docker引擎更新APT包索引并安装最新版本的Docker引擎、containerd和Docker Composesudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin这个命令会安装Docker的核心组件docker-ce: Docker社区版docker-ce-cli: Docker命令行工具containerd.io: 容器运行时docker-compose-plugin: Docker Compose V23.2 验证安装安装完成后运行hello-world镜像来验证Docker是否正确安装sudo docker run hello-world如果看到Hello from Docker!的消息说明安装成功。这个命令会自动下载测试镜像并在容器中运行它。3.3 配置非root用户权限默认情况下Docker需要root权限才能运行命令。为了安全和使用方便我们可以将当前用户添加到docker组sudo usermod -aG docker $USER然后需要注销并重新登录或者运行以下命令使更改立即生效newgrp docker现在你可以不使用sudo直接运行Docker命令了docker run hello-world4. 安装后的基本配置4.1 设置Docker开机自启大多数情况下我们希望Docker在系统启动时自动运行sudo systemctl enable docker.service sudo systemctl enable containerd.service4.2 配置镜像加速器国内用户可能会遇到Docker Hub镜像下载慢的问题。我们可以配置国内镜像加速器创建或修改配置文件sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://registry.docker-cn.com] } EOF重新启动Docker服务sudo systemctl daemon-reload sudo systemctl restart docker国内常用的镜像加速地址包括阿里云加速器需要注册账号获取专属地址网易云镜像中心https://hub-mirror.c.163.com腾讯云镜像https://mirror.ccs.tencentyun.com4.3 配置日志和存储驱动对于生产环境建议调整Docker的日志和存储配置sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 }, storage-driver: overlay2 } EOF然后重启Docker服务sudo systemctl restart docker5. 常见问题排查5.1 虚拟化支持问题如果你遇到类似virtualization support not detected的错误可能是系统没有启用虚拟化支持检查BIOS中是否启用了虚拟化技术Intel VT-x或AMD-V对于某些云服务器可能需要联系云服务商开启虚拟化支持在Linux上可以检查内核模块是否加载lsmod | grep kvm如果没有输出可以尝试加载模块sudo modprobe kvm sudo modprobe kvm_intel # Intel CPU # 或 sudo modprobe kvm_amd # AMD CPU5.2 端口冲突问题如果Docker启动失败可能是端口冲突导致的。检查是否有其他服务占用了Docker默认的端口如2375、2376sudo netstat -tulnp | grep 23755.3 存储空间不足Docker默认将镜像和容器存储在/var/lib/docker目录下。如果这个分区空间不足可以考虑清理无用镜像和容器docker system prune -a修改Docker的存储路径到更大的分区sudo systemctl stop docker sudo rsync -aP /var/lib/docker /new/path/ sudo mv /var/lib/docker /var/lib/docker.bak sudo ln -s /new/path/docker /var/lib/docker sudo systemctl start docker6. Docker基本使用入门6.1 运行第一个容器让我们运行一个Nginx web服务器docker run -d -p 8080:80 --name my-nginx nginx这个命令做了以下几件事从Docker Hub下载最新的nginx镜像如果本地没有创建一个新的容器并在后台运行-d参数将容器的80端口映射到主机的8080端口-p参数给容器命名为my-nginx--name参数现在你可以通过浏览器访问http://localhost:8080看到Nginx的欢迎页面。6.2 常用命令速查以下是一些最常用的Docker命令命令描述docker ps查看运行中的容器docker ps -a查看所有容器包括停止的docker images列出本地镜像docker pull image下载镜像docker run options image运行容器docker stop container停止容器docker start container启动已停止的容器docker rm container删除容器docker rmi image删除镜像docker exec -it container bash进入运行中的容器docker logs container查看容器日志docker build -t name .构建镜像6.3 容器与主机的文件交互有时我们需要在容器和主机之间传输文件从主机复制文件到容器docker cp /path/to/local/file container_name:/path/in/container从容器复制文件到主机docker cp container_name:/path/in/container/file /path/to/local挂载主机目录到容器更推荐的方式docker run -v /host/path:/container/path image_name7. 进阶配置与优化7.1 资源限制默认情况下Docker容器可以使用主机的所有资源。在生产环境中我们应该限制容器的资源使用docker run -it --cpus.5 --memory512m ubuntu这个命令限制容器最多使用0.5个CPU核心和512MB内存。7.2 网络配置Docker提供了多种网络模式bridge默认模式容器通过docker0网桥连接host容器直接使用主机网络none无网络连接自定义网络创建隔离的网络环境创建一个自定义网络docker network create my-network然后运行容器时指定网络docker run --networkmy-network nginx7.3 使用Docker Compose对于复杂的多容器应用推荐使用Docker Compose来管理。创建一个docker-compose.yml文件version: 3 services: web: image: nginx ports: - 8080:80 db: image: mysql environment: MYSQL_ROOT_PASSWORD: example然后运行docker compose up -d8. 安全最佳实践8.1 不要以root用户运行容器尽量避免在容器内以root用户运行应用docker run --user 1000:1000 nginx8.2 限制容器能力使用--cap-drop移除不必要的Linux能力docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx8.3 定期更新Docker和镜像保持Docker和容器镜像的最新状态sudo apt-get update sudo apt-get upgrade docker-ce docker pull nginx:latest8.4 扫描镜像漏洞使用Docker内置的扫描工具检查镜像漏洞docker scan nginx9. 性能监控与日志管理9.1 监控容器资源使用查看容器的资源使用情况docker stats9.2 日志管理查看容器日志docker logs -f container_name对于生产环境建议配置日志轮转如前面4.3节所示或使用ELK等集中式日志系统。9.3 使用cAdvisor监控Google的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 \ --publish8081:8080 \ --detachtrue \ --namecadvisor \ gcr.io/google-containers/cadvisor:latest访问http://localhost:8081查看监控数据。10. 实际应用场景示例10.1 开发环境搭建使用Docker可以快速搭建一致的开发环境。例如创建一个包含Node.js和MySQL的开发环境FROM node:14 RUN apt-get update apt-get install -y mysql-client WORKDIR /app COPY package.json . RUN npm install COPY . . CMD [npm, start]然后使用docker-compose.yml配置整个环境version: 3 services: app: build: . ports: - 3000:3000 volumes: - .:/app depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: app_db10.2 持续集成/持续部署在CI/CD流程中使用Docker可以确保构建环境的一致性。例如在GitLab CI中image: docker:latest services: - docker:dind stages: - build - test - deploy build: stage: build script: - docker build -t my-app . - docker tag my-app registry.example.com/my-app:$CI_COMMIT_SHA - docker push registry.example.com/my-app:$CI_COMMIT_SHA10.3 微服务架构Docker非常适合微服务架构。每个服务可以打包成独立的容器通过Docker网络通信version: 3 services: auth-service: image: auth-service:latest ports: - 3001:3000 networks: - backend user-service: image: user-service:latest ports: - 3002:3000 networks: - backend api-gateway: image: api-gateway:latest ports: - 8080:8080 depends_on: - auth-service - user-service networks: - backend networks: backend: driver: bridge11. 备份与迁移11.1 备份Docker数据重要的Docker数据应该定期备份备份容器数据卷docker run --rm --volumes-from my_container -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /volume_path备份整个Docker目录不推荐用于生产环境sudo tar -czvf docker_backup.tar.gz /var/lib/docker11.2 迁移Docker到新主机迁移Docker环境的基本步骤在新主机上安装相同版本的Docker导出镜像docker save -o my_images.tar image1 image2将tar文件复制到新主机并导入docker load -i my_images.tar对于容器建议使用docker-compose重新创建而不是直接迁移12. 清理与维护12.1 清理无用资源定期清理可以释放磁盘空间docker system prune这个命令会删除所有停止的容器所有不被任何容器使用的网络所有悬空的镜像所有悬空的构建缓存添加-a参数会同时删除未被使用的镜像docker system prune -a12.2 检查Docker磁盘使用查看Docker的磁盘使用情况docker system df输出示例TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 5 3 1.2GB 500MB (41%) Containers 3 1 200MB 150MB (75%) Local Volumes 2 1 100MB 50MB (50%) Build Cache 10 0 300MB 300MB (100%)13. 不同Linux发行版的安装差异虽然前面以Ubuntu为例介绍了安装过程但不同Linux发行版的安装方式略有不同13.1 CentOS/RHEL对于CentOS或RHEL系统sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install docker-ce docker-ce-cli containerd.io sudo systemctl start docker sudo systemctl enable docker13.2 Debian对于Debian系统sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/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/debian \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin13.3 其他发行版对于其他发行版可以参考Docker官方文档或使用通用安装脚本curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh14. 使用Docker的替代方案虽然Docker是最流行的容器引擎但也有其他选择14.1 PodmanPodman是一个无守护进程的Docker替代品与Docker CLI兼容sudo apt-get install podman podman run hello-world14.2 LXC/LXDLXC提供了操作系统级别的虚拟化sudo apt-get install lxc sudo lxc-create -t download -n my-container14.3 ContainerdContainerd是Docker底层的容器运行时也可以直接使用sudo apt-get install containerd sudo ctr images pull docker.io/library/nginx:latest sudo ctr run docker.io/library/nginx:latest nginx15. 我在生产环境中的经验分享经过多年在生产环境中使用Docker的经验我总结了一些实用的技巧标签管理为镜像使用有意义的标签避免只用latest。例如v1.2.3、2023-07-01等。健康检查在Dockerfile中添加HEALTHCHECK指令或在docker-compose.yml中配置健康检查。资源限制始终为生产容器设置资源限制防止单个容器占用所有资源。日志轮转配置日志轮转避免日志文件占用所有磁盘空间。安全扫描在CI/CD流程中加入镜像安全扫描步骤。备份策略定期备份重要的数据卷和镜像。监控告警设置容器资源使用和健康状态的监控告警。最小化镜像使用多阶段构建创建尽可能小的镜像。环境分离使用不同的Docker Compose文件或Kubernetes命名空间隔离开发、测试和生产环境。文档记录为每个自定义镜像编写清晰的README说明用途、构建方法和运行要求。