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 runc
2.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/null
3. 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-world
4. 安装后的基本配置
4.1 设置Docker开机自启
大多数情况下,我们希望Docker在系统启动时自动运行:
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
4.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 docker
5. 常见问题排查
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 2375
5.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 nginx
7.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 -d
8. 安全最佳实践
8.1 不要以root用户运行容器
尽量避免在容器内以root用户运行应用:
docker run --user 1000:1000 nginx
8.2 限制容器能力
使用--cap-drop移除不必要的Linux能力:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
8.3 定期更新Docker和镜像
保持Docker和容器镜像的最新状态:
sudo apt-get update && sudo apt-get upgrade docker-ce
docker pull nginx:latest
8.4 扫描镜像漏洞
使用Docker内置的扫描工具检查镜像漏洞:
docker scan nginx
9. 性能监控与日志管理
9.1 监控容器资源使用
查看容器的资源使用情况:
docker stats
9.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_db
10.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_SHA
10.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: bridge
11. 备份与迁移
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 -a
12.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 docker
13.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-plugin
13.3 其他发行版
对于其他发行版,可以参考Docker官方文档或使用通用安装脚本:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
14. 使用Docker的替代方案
虽然Docker是最流行的容器引擎,但也有其他选择:
14.1 Podman
Podman是一个无守护进程的Docker替代品,与Docker CLI兼容:
sudo apt-get install podman
podman run hello-world
14.2 LXC/LXD
LXC提供了操作系统级别的虚拟化:
sudo apt-get install lxc
sudo lxc-create -t download -n my-container
14.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 nginx
15. 我在生产环境中的经验分享
经过多年在生产环境中使用Docker的经验,我总结了一些实用的技巧:
-
标签管理 :为镜像使用有意义的标签,避免只用latest。例如:v1.2.3、2023-07-01等。
-
健康检查 :在Dockerfile中添加HEALTHCHECK指令,或在docker-compose.yml中配置健康检查。
-
资源限制 :始终为生产容器设置资源限制,防止单个容器占用所有资源。
-
日志轮转 :配置日志轮转,避免日志文件占用所有磁盘空间。
-
安全扫描 :在CI/CD流程中加入镜像安全扫描步骤。
-
备份策略 :定期备份重要的数据卷和镜像。
-
监控告警 :设置容器资源使用和健康状态的监控告警。
-
最小化镜像 :使用多阶段构建创建尽可能小的镜像。
-
环境分离 :使用不同的Docker Compose文件或Kubernetes命名空间隔离开发、测试和生产环境。
-
文档记录 :为每个自定义镜像编写清晰的README,说明用途、构建方法和运行要求。
更多推荐
所有评论(0)