文章
Docker基础概念解析
Containers(容器)、Images(镜像) 和 Volumes(数据卷) 是 Docker 的三个核心概念,它们在容器化应用的开发和部署中扮演着不同的角色
目录
Docker中,Containers(容器)、Images(镜像) 和 Volumes(数据卷) 是 Docker 的三个核心概念,它们在容器化应用的开发和部署中扮演着不同的角色。下面是它们的详细解释和区别:#
基本概念#
1. Containers(容器)#
- 容器是镜像的运行实例。可以把镜像理解为程序的“模板”,而容器是用这个模板创建的“实际运行的程序”。
- 容器中包含了应用运行所需的环境、依赖和配置。
- 容器是可启动、停止、重启和销毁的,是短暂的,一旦删除,里面的修改内容也会丢失(除非挂载了 volume)。 常见命令:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(包括已停止的)
docker start/stop/restart <容器ID或名称>
docker rm <容器ID或名称> # 删除容器
2. Images(镜像)#
- 镜像是一个只读模板,定义了容器中应该运行什么程序、使用什么库和配置。
- 可以通过
Dockerfile来构建镜像,也可以从 Docker Hub 等仓库拉取。 - 镜像本身不能运行,但可以用来创建容器。 常见命令:
docker images # 查看本地镜像
docker pull <镜像名> # 拉取镜像
docker rmi <镜像ID> # 删除镜像
docker build -t myapp . # 从 Dockerfile 构建镜像
3. Volumes(数据卷)#
- Volumes 是 Docker 推荐的数据持久化机制,用于保存容器中的数据,即使容器被删除也不会丢失。
- 常用于数据库数据、上传文件、日志等需要保留的数据。
- Volumes 可以被多个容器共享或独占。 常见命令:
docker volume ls # 查看所有数据卷
docker volume create myvol # 创建数据卷
docker volume rm myvol # 删除数据卷
挂载示例:
docker run -v myvol:/app/data myimage
# 把名为 myvol 的卷挂载到容器的 /app/data 目录
小结对比表:#
| 类型 | 本质 | 用途 | 是否持久化 | 生命周期 |
| Image | 程序模板 | 定义应用和环境 | 是 | 除非手动删除 |
| Container | 镜像运行的实例 | 实际运行的程序 | 否(默认) | 可启动、停止、销毁 |
| Volume | 文件存储目录 | 保存和共享数据 | 是 | 容器删除也保留 |
示例演示#
下面是一个 完整示例,展示了 Docker 中 Image、Container 和 Volume 是如何协同工作的。#
我们创建一个简单的 Python Flask 应用,运行在 Docker 容器中,并将日志数据持久化到 Volume 中。#
1. 准备项目结构#
myapp/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
2. 编写代码#
app.py
from flask import Flask
import datetime
app = Flask(__name__)
@app.route("/")
def home():
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open("/logs/access.log", "a") as f:
f.write(f"Visited at {now}\n")
return f"Hello from Docker at {now}!\n"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
requirements.txt
flask
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- logs-data:/logs
container_name: my-flask-container
volumes:
logs-data: