07.docker介绍与常用命令
1. docker概述
1.1 什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如:服务器、网络、内存、存储等等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原来的组态更好的方式来应用这些资源,这些资源的核心虚拟部分是不受现有资源的架设方式,低于或者物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产过程中,虚拟化技术主要是用来解决高性能的物理硬件产能过剩和老的硬件产能过低的重用重组,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用。
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip),桌面虚拟化、服务虚拟化、虚拟机等等。
虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源
1.2 初识Docker
Docker是一个开源的**应用容器引擎**,诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名为Docker Inc),Docker可以让开发者打包他们的应用以及依赖包到一个**轻量级,可移植的容器中**,然后发布到任何流行的linux服务器上,容器是完全使用沙箱机制,相互隔离。

容器性能开销极低,Docker是一种容器技术,解决软件跨环境迁移的问题。
1.3 容器与虚拟机的比较
什么是虚拟机
虚拟机是一个计算机系统的仿真,简单来说,虚拟机可以实现在一台物理计算机上模拟多台计算机运行任务。操作系统和应用共享一台或多台主机(集群)的硬件资源,每台VM有自己的OS,硬件资源是虚拟化的。管理程序(hypervisor)负责创建和运行VM,它连接了硬件资源和虚拟机,完成server的虚拟化。由于虚拟化技术和云服务的出现,IT部门通过部署VM可以降低成本提高效率。
VMs也消耗大量系统资源,每个VM不仅运行一个OS的完整copy并且需要所有硬件的虚拟化copy,这消耗大量RAM和CPU。相比单独计算机,VM是比较经济的,但对于一些应用VM是过度浪费的,需要容器。
什么是容器
容器是将操作系统虚拟化,这与VM虚拟化一个完整的计算机有所不同。容器是在操作系统之上,每个容器共享OS内核,执行文件和库等。共享的组件是只读的,通过共享OS资源能够减少复现OS的代码,意味着一台server仅安装一个OS可以运行多个任务。容器是非常轻量的,仅仅MB水平并且几秒即可启动。相比容器,VM需要几分钟启动,并且大小也大很多。
与VM相比,容器仅需OS、支撑程序和库文件便可运行应用,这意味你可以在同一个server上相比VM运行2-3倍多的应用,并且,容器能帮助创建一个可移植的,一致的开发测试部署环境。
小结:
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 操作系统级 | 进程级 |
| 隔离策略 | 运行于Hypervisor上 | 直接运行在宿主机内核中 |
| 系统资源 | 5-15% | 0-5% |
| 启动速度 | 慢,分钟级 | 快,秒级 |
| 占用磁盘空间 | 非常大,GB-TB级 | 小,KB-MB甚至KB级 |
| 并发性 | 一台宿主机十几个,最多几十个 | 上百个,甚至上百上千个 |
| 高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
结论:
与传统的虚拟化相比,Docker优势体现在启动速度快,占用体积小
2. Docker与虚拟机
2.1 什么是物理机

2.2 什么是虚拟机
虚拟机是一类能够通过软件模拟其他系统行为,做到虚拟化、跨平台等目的的一类的软件。市面上有很多虚拟机产品,如VMware虚拟机、Java虚拟机,它们都有很好的虚拟化能力,我们可以在软件内运行其他操作系统。
2.3 什么是docker

3. Docker组件
3.1 Docker服务端和客户端
Docker是一个客户端-服务端(C/S)架构程序,Docker客户端只需要向Docker服务端或者守护进程发出请求,服务端或者守护进程完成所有工作返回结果,Docker提供了一个命令行工具Docker以及一整套的**Restful API**,可以在同一台宿主机器上运行Docker守护进程或者客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程
docker引擎是一个c/s结构的应用,主要组件见下图:
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信。

3.2 Docker镜像
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个**完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它**应用程序**。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,看看下面这张图:

右边我们看到了多个**只读层**,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
3.3 Docker容器
Docker 利用容器(Container)来运行应用。容器是从镜像创建的**运行实例**。它可以被**启动、开始、停止、删除**。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
创建Container首先要有Image,也就是说Container是通过image创建的。
Container是在原先的Image之上新加的一层,称作**Container layer**,这一层是可读可写的(Image是只读的)。
在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。
Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP。

结论:
容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器
4. docker 常用命令教程
docker 相关的几个重要概念
- 镜像 image:是一个只读的模板,用于创建容器。它包含了应用运行所需的所有内容,比如代码、运行时、库、环境变量和配置文件等
- 容器 container:容器是镜像的运行实例,是一个轻量级、可移植、自给自足的运行环境。每个容器都是彼此隔离的。
- 数据卷Volume: 数据卷是 Docker 提供的一种持久化机制,用于在容器间共享数据,或将容器数据持久保存到宿主机
- Dockerfile:Dockerfile 是一组指令的脚本,用于构建自定义镜像
- Docker Compose:是 Docker 提供的多容器应用编排工具,通过一个
docker-compose.yml文件定义应用的服务、网络和数据卷等 - 仓库Registry:Docker 镜像存储和分发的地方。官方公共仓库:Docker Hub(默认),私有仓库:Harbor、GitHub Container Registry 等。
4.1 镜像(Image)相关命令
| 命令 | 说明 |
|---|---|
docker pull <镜像名> | 拉取镜像(如 docker pull nginx) |
docker images | 查看本地镜像 |
docker rmi <镜像名或ID> | 删除本地镜像 |
docker build -t <镜像名> . | 构建镜像(需配合 Dockerfile) |
示例:
docker pull redis:6.2
docker rmi redis
docker build -t myapp:latest .
4.2 容器(Container)相关命令
| 命令 | 说明 |
|---|---|
docker run | 创建并运行容器 |
docker ps | 查看正在运行的容器 |
docker ps -a | 查看所有容器(包括已停止) |
docker stop <容器名/ID> | 停止容器 |
docker start <容器名/ID> | 启动已停止容器 |
docker rm <容器名/ID> | 删除容器 |
docker exec -it <容器名> bash | 进入容器终端 |
示例:
# 以交互方式运行 Ubuntu 容器
docker run -it ubuntu bash# 以后台方式运行 nginx 容器并映射端口
docker run -d -p 8080:80 nginx# 查看容器
docker ps -a# 进入正在运行的容器
docker exec -it mynginx bash
4.3 网络与数据卷
| 命令 | 说明 |
|---|---|
docker network ls | 查看网络 |
docker volume ls | 查看数据卷 |
docker run -v /宿主路径:/容器路径 | 映射数据卷 |
docker run --network=<网络名> | 指定容器网络 |
示例:
docker run -d -p 3306:3306 -v /mydata/mysql:/var/lib/mysql --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
4.4 Dockerfile 简单示例
这里演示构建Dockerfile 文件,部署 web 应用
# Dockerfile 示例
FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
5. Docker Compose 使用教程
5.1 Docker Compose 是什么?
Docker Compose 是用于定义和运行多容器 Docker 应用的工具,通过一个 docker-compose.yml 文件定义服务、网络、卷等内容。
5.2 安装(已随 Docker Desktop 一起安装)
验证安装:
docker compose version # 或 docker-compose version(旧写法)
5.3 常用命令
| 命令 | 说明 |
|---|---|
docker compose up | 启动服务(读取当前目录下的 docker-compose.yml) |
docker compose up -d | 后台启动 |
docker compose down | 停止并清理资源 |
docker compose ps | 查看服务状态 |
docker compose logs | 查看日志 |
docker compose exec <服务名> bash | 进入服务容器终端 |
5.4 Compose 示例:运行一个 Web + 数据库
version: "3.5"services:milvus:image: milvusdb/milvus:v2.4.10container_name: milvus_standaloneports:- "19530:19530"- "9091:9091"volumes:- ./milvus_data:/var/lib/milvusenvironment:- ETCD_ENDPOINTS=milvus-etcd:2379- MINIO_ADDRESS=milvus-minio:9000- MINIO_ACCESS_KEY=minioadmin- MINIO_SECRET_KEY=minioadmin- ETCD_AUTO_COMPACTION_RETENTION=0- MILVUS_LOG_LEVEL=infocommand: ["milvus", "run", "standalone"]restart: unless-stoppedredis:image: redis:7.2container_name: redisports:- "6379:6379"volumes:- ./redis_data:/datacommand: redis-server --appendonly yesrestart: unless-stoppedvolumes:milvus_data:redis_data:etcd_data:minio_data:
docker compose up -d # 启动所有服务
docker compose ps # 查看服务状态
docker compose exec web bash # 进入 web 服务容器
docker compose down # 停止并清理容器、网络和卷
6. 其他命令使用
6.1 清理无用资源
docker system prune # 清理所有未使用的容器、网络、镜像
docker volume prune # 清理未使用的数据卷
docker image prune # 清理未使用镜像
6.2 导入导出镜像
docker save -o myapp.tar myapp:latest # 导出镜像
docker load -i myapp.tar # 导入镜像
6.3 小结
| 类型 | 推荐使用方式 |
|---|---|
| 单个容器运行 | 直接 docker run |
| 多服务协同部署 | 使用 docker compose |
| 自动化构建 | 编写 Dockerfile |
| 本地调试 | 使用 docker exec, logs 等 |
7. web 应用部署案例
下面是一个完整的 FastAPI 接口服务示例,并通过 Docker 和 Docker Compose 部署的完整流程。包括:
- 创建 FastAPI 项目代码
- 编写
Dockerfile - 编写
docker-compose.yml - 构建并运行容器
- 浏览器验证接口访问
7.1 项目目录结构:
fastapi-docker-app/
├── app/
│ └── main.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
app/main.py - FastAPI 服务:
from fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"message": "Hello from FastAPI + Docker"}
requirements.txt - 依赖文件
fastapi
uvicorn[standard]
7.2. Dockerfile - 构建镜像
# 使用官方 Python 镜像作为基础
FROM python:3.10-slim# 设置工作目录
WORKDIR /app# 复制依赖文件
COPY requirements.txt .# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 复制代码
COPY app ./app# 设置启动命令
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
7.3 docker-compose.yml - 编排服务
version: '3.8'services:web:build: .ports:- "8000:8000"volumes:- ./app:/app/apprestart: always
在 fastapi-docker-app 根目录执行:
# 构建镜像并启动服务
docker compose up --build -d
7.4 验证服务是否部署成功
打开浏览器访问:
http://localhost:8000/
返回:
{"message": "Hello from FastAPI + Docker"
}
7.5 常用维护命令
docker compose ps # 查看服务状态
docker compose logs -f # 查看实时日志
docker compose exec web bash # 进入容器
docker compose down # 停止并移除容器
可选:添加热更新功能(用于开发)修改 docker-compose.yml:
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
8. 总结
本文介绍的 docker 的基础概念已经 docker 的常用命令,最后通过一个简单的案例演示了 docker 部署服务的完整流程。服务部署是演示基于自有的服务器,实际在公司可能会采用供应商的 k8s 来做服务的部署编排和维护。需要把制作好的镜像上传到云端,然后配置启动参数来更新服务,使用更简单。
