Docker系统部署技术详解
1. Docker简介
Docker 是一个开源的应用容器引擎,基于Go语言开发,遵循Apache 2.0协议。它允许开发者将应用及其依赖、配置打包到一个轻量级、可移植的“容器”中,从而实现快速交付、部署和运行。
核心概念与架构:
- 镜像:只读的模板,用于创建容器,包含运行应用所需的文件系统、依赖和配置。
- 容器:镜像的运行实例,是一个隔离的进程空间,拥有自己的文件系统、网络和进程树。
- 仓库:集中存放镜像的地方。公共仓库如Docker Hub,私有仓库可自行搭建。
- Docker Daemon:常驻后台的守护进程,负责管理镜像、容器、网络和存储卷。
- Docker Client:用户通过命令行工具或API与Docker Daemon交互。
- Docker Registry:存储镜像的服务器。
与传统虚拟化的区别:
| 特性 | Docker容器 | 传统虚拟机 |
|---|---|---|
| 虚拟化级别 | 操作系统级,共享宿主机内核 | 硬件级,每个VM有独立内核 |
| 启动速度 | 秒级甚至毫秒级 | 分钟级 |
| 性能开销 | 极低,接近原生 | 较高,存在Hypervisor开销 |
| 磁盘占用 | MB级,镜像层可共享 | GB级,每个VM包含完整系统 |
| 隔离性 | 进程级别隔离,安全性较弱 | 完全硬件隔离,安全性强 |
| 部署密度 | 高,单机可运行数百容器 | 低,资源占用大 |
2. Docker与Docker Compose安装和设置
Docker安装步骤
Linux系统(以Ubuntu为例):
卸载旧版本(如有):
1
sudo apt-get remove docker docker-engine docker.io containerd runc
设置仓库并安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 更新包索引并安装依赖
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引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin验证安装:
1
sudo docker run hello-world
Windows/macOS:
- 下载 Docker Desktop 安装包,图形化安装即可。
- Docker Desktop集成了Docker引擎、CLI、Compose和图形化管理界面。
Docker Compose安装
Linux系统单独安装(若未安装docker-compose-plugin):
1 | # 下载最新稳定版 |
注:推荐使用Docker官方提供的docker-compose-plugin(通过docker compose命令使用),它是未来的发展方向。
服务管理设置
Linux系统服务管理:
1 | # 启动Docker服务 |
配置非root用户使用Docker(安全考虑,避免总用sudo):
1 | # 将当前用户添加到docker组 |
3. Docker常用配置
Docker主要配置文件位于 /etc/docker/daemon.json(Linux),若不存在可手动创建。
日志配置
Docker支持多种日志驱动,控制容器日志的存储和行为:
1 | { |
参考配置: sudo curl -L "https://haies.cn/assets/daemon.json" -o /etc/docker/daemon.json
常用日志驱动:
- json-file:默认驱动,日志以JSON格式存储在主机文件系统中。
- journald:日志发送到systemd journal。
- syslog:日志发送到syslog。
- none:不保存任何容器日志。
镜像与数据存储位置配置
默认情况下,Docker镜像、容器等数据存储在 /var/lib/docker。若要更改存储位置:
停止Docker服务:
1
sudo systemctl stop docker
迁移数据(如已有数据):
1
sudo rsync -aqxP /var/lib/docker/ /new/path/docker/
修改配置
/etc/docker/daemon.json:1
2
3{
"data-root": "/new/path/docker"
}重启服务:
1
sudo systemctl start docker
镜像加速器配置(针对国内用户)
1 | { |
配置生效:每次修改daemon.json后,需执行 sudo systemctl restart docker。
其他常用配置
1 | { |
4. Docker容器管理与编排命令
容器生命周期管理
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 运行容器 | docker run -d --name web -p 80:80 nginx:alpine |
后台运行,命名,端口映射 |
| 列出容器 | docker ps -a |
查看所有容器(含停止的) |
| 启动/停止 | docker start/stop web |
启动/停止已有容器 |
| 重启容器 | docker restart web |
重启运行中的容器 |
| 暂停/恢复 | docker pause/unpause web |
暂停/恢复容器进程 |
| 删除容器 | docker rm -f web |
强制删除运行中的容器 |
| 进入容器 | docker exec -it web sh |
交互式进入运行中的容器 |
| 查看日志 | docker logs -f --tail 100 web |
实时查看最后100行日志 |
镜像管理
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 拉取镜像 | docker pull nginx:alpine |
拉取指定标签镜像 |
| 列出镜像 | docker images 或 docker image ls |
查看本地镜像 |
| 构建镜像 | docker build -t myapp:v1 . |
使用当前目录Dockerfile构建 |
| 推送镜像 | docker push myrepo/myapp:v1 |
推送到镜像仓库 |
| 删除镜像 | docker rmi nginx:alpine |
删除本地镜像 |
| 查看历史 | docker history nginx:alpine |
查看镜像构建历史 |
| 保存/加载 | docker save -o nginx.tar nginx:alpine docker load -i nginx.tar |
导出/导入镜像文件 |
Docker Compose编排
docker-compose.yml 示例(定义多服务应用):
1 | version: '3.8' |
常用Compose命令:
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 启动服务 | docker-compose -f qsh-compose.yml -p qsh up -d |
后台启动所有服务 |
| 查看状态 | docker-compose ps |
查看服务运行状态 |
| 查看日志 | docker-compose logs -f web |
跟踪特定服务日志 |
| 停止服务 | docker-compose -f qsh-compose.yml -p qsh down |
停止并移除所有资源 |
| 构建服务 | docker-compose build |
重新构建服务镜像 |
| 执行命令 | docker-compose exec db psql -U postgres |
在服务容器中执行命令 |
| 扩展服务 | docker-compose up -d --scale web=3 |
将web服务扩展到3个实例 |
compose文件若引用dockerfile,dockerfile内有相对路径引用的外部文件,则相对路径以compose文件为基础。
其他实用命令
| 功能 | 命令示例 | 说明 |
|---|---|---|
| 查看资源使用 | docker stats |
实时查看容器资源使用情况 |
| 查看系统信息 | docker info |
查看Docker系统信息 |
| 数据卷管理 | docker volume ls/create/rm |
管理数据卷 |
| 网络管理 | docker network ls/create/rm |
管理网络 |
| 清理资源 | docker system prune -a -f |
清理所有未使用的资源 |
| 清空json.log 日志文件 | sudo sh -c 'find /var/lib/docker/containers -name "*-json.log" -exec truncate -s 0 {} \;' |
保留文件,仅情况内容 |
| 删除json.log 日志文件 | sudo find /var/lib/docker/containers -name "*-json.log" -delete |
删除文件 |
总结
Docker提供了一套完整的容器化解决方案,从镜像构建、容器运行到服务编排。与nerdctl+containerd技术栈相比,Docker更加一体化、开箱即用,适合独立应用部署、开发测试环境和中小型项目。
选择建议:
- 如果需要与Kubernetes深度集成、更轻量的运行时、生产级集群,选择
nerdctl+containerd。 - 如果是老项目维护,或者追求快速上手、一体化体验、独立容器部署或小型项目编排,选择Docker。
掌握Docker的基本概念、安装配置和常用命令,能够显著提升应用部署的效率和一致性,是现代开发运维的必备技能。