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 Compose:
sudo 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 V2
3.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.com
4.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 kvmsudo modprobe kvm sudo modprobe kvm_intel # Intel CPU # 或 sudo modprobe kvm_amd # AMD CPU
5.2 端口冲突问题
如果Docker启动失败,可能是端口冲突导致的。检查是否有其他服务占用了Docker默认的端口(如2375、2376):
sudo 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 docker
6. 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_name
7. 进阶配置与优化
7.1 资源限制
默认情况下,Docker容器可以使用主机的所有资源。在生产环境中,我们应该限制容器的资源使用:
docker run -it --cpus=".5" --memory="512m" ubuntu这个命令限制容器最多使用0.5个CPU核心和512MB内存。
7.2 网络配置
Docker提供了多种网络模式:
- bridge:默认模式,容器通过docker0网桥连接
- host:容器直接使用主机网络
- none:无网络连接
- 自定义网络:创建隔离的网络环境
创建一个自定义网络:
docker network create my-network然后运行容器时指定网络:
docker run --network=my-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 \ --publish=8081:8080 \ --detach=true \ --name=cadvisor \ 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/docker
11.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 Podman
Podman是一个无守护进程的Docker替代品,与Docker CLI兼容:
sudo apt-get install podman podman run hello-world14.2 LXC/LXD
LXC提供了操作系统级别的虚拟化:
sudo apt-get install lxc sudo lxc-create -t download -n my-container14.3 Containerd
Containerd是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,说明用途、构建方法和运行要求。
