返回文章列表

文章

Docker基础概念解析

Containers(容器)、Images(镜像) 和 Volumes(数据卷) 是 Docker 的三个核心概念,它们在容器化应用的开发和部署中扮演着不同的角色

目录
  1. Docker中,Containers(容器)、Images(镜像) 和 Volumes(数据卷) 是 Docker 的三个核心概念,它们在容器化应用的开发和部署中扮演着不同的角色。下面是它们的详细解释和区别:
  2. 基本概念
  3. 1. Containers(容器)
  4. 2. Images(镜像)
  5. 3. Volumes(数据卷)
  6. 小结对比表:
  7. 示例演示
  8. 下面是一个 完整示例,展示了 Docker 中 Image、Container 和 Volume 是如何协同工作的。
  9. 我们创建一个简单的 Python Flask 应用,运行在 Docker 容器中,并将日志数据持久化到 Volume 中。
  10. 1. 准备项目结构
  11. 2. 编写代码

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 中 ImageContainerVolume 是如何协同工作的。#

我们创建一个简单的 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: