Docker架构图

🌟 Docker 核心价值

传统应用部署面临的挑战:

  • 🚫 ​环境差异​:开发/测试/生产环境不一致
  • 🐌 ​启动缓慢​:虚拟机启动需分钟级
  • 📦 ​臃肿体积​:包含完整操作系统镜像
  • 🔧 ​复杂配置​:依赖库版本冲突

Docker的解决方案:

  • ✅ ​标准化封装​:将应用+依赖打包成镜像
  • ⚡ ​秒级启动​:容器直接运行于宿主内核
  • 🪶 ​轻量级​:共享OS内核,镜像仅MB级
  • 🔄 ​可移植性​:Build once, run anywhere

💡 类比:虚拟机是整栋房子,容器是公寓里的独立房间

🧩 核心概念解析

概念 比喻 关键特性
Dockerfile 施工蓝图 文本文件,包含构建指令
Image 房屋设计图 只读模板,包含完整应用环境
Container 建好的房子 镜像的运行实例
Registry 设计图仓库(如Docker Hub) 镜像存储分发中心

🛠️ 安装指南(各平台)

如果你使用的是windows和mac,那么你可以在官网直接下载docker desktop,然后安装即可。
并且在windows10以上系统可以使用wsl2,在wsl2中安装docker desktop,然后就可以在wsl2中运行docker了。
在linux中我们可以直接使用包管理工具安装文档安装。
详细步骤参考Docker 安装全平台指南

🚀 实战:部署Python应用

项目结构

/flask-demo
├── Dockerfile
├── app.py
└── requirements.txt

Dockerfile

首先在应用的根目录下创建dockerfile文件,然后编写dockerfile文件内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt /app

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

构建与运行

在Dockerfile中,COPY命令用于将宿主机上的文件复制到镜像中,CMD命令用于设置容器启动后执行的命令。

1
2
3
4
5
6
7
8
# 构建镜像
docker build -t flask-demo .

# 运行容器
docker run -dp 5000:5000 flask-demo

# 查看运行中容器
docker ps

构建完成后,就可以在浏览器中访问localhost:5000,看到Flask的欢迎页面。

三种挂载方式对比

类型 存储位置 生命周期性 适用场景
​Volume​ Docker管理目录 独立于容器 生产环境数据库
​Bind Mount 主机指定路径 跟随主机文件系统 开发环境代码挂载
​tmpfs​ 内存 容器停止即消失 敏感临时数据

Docker Desktop的应用

我们通过docker desktop可以很方便的管理docker容器,比如可以查看容器列表,可以启动容器,可以停止容器,可以删除容器,可以查看容器日志,可以查看容器状态,可以查看容器的端口映射,可以查看容器的资源使用情况,可以查看容器的日志,可以查看容器的配置,可以查看容器的运行状态,可以查看容器的运行命令,可以查看容器的运行参数,可以查看容器的运行环境变量,可以查看容器的运行目录,可以查看容器的运行文件,可以查看容器的运行日志,可以查看容器的运行。

常见命令

1
2
3
4
5
6
7
8
9
10
# 列举所有的容器
docker ps -a
# 停止容器
docker stop <container_id>
# 重启容器
docker restart <container_id>
# 删除容器
docker rm <container_id>
# 启动一个远程shell
docker exec -it <container_id> /bin/bash

volumes的介绍

需要注意的是,容器删除时,会删除容器的镜像,但是不会删除容器所使用的镜像。之前所做的操作,都是基于一个镜像的,所以,当容器删除后,镜像依然存在。但新添加的数据会丢失,这时我们可以使用volumes 来保存数据。
在docker中,volumes 是一个持久化数据的存储容器。你可以把Volumes 当作一个持久化数据的存储容器。
比如你在某个容器中修改了某个volumes 中的文件,当这个容器被删除后,这个volumes 中的文件也会被修改。
我们可以通过docker volmes create 命令来创建一个volumes。

1
docker volume create my-volumes

随后在启动容器的时候,使用volumes-from 来指定这个volumes。

1
2
3
4
docker run -it --name my-container --volumes-from my-volumes ubuntu /bin/bash

# 示例
docker run -dp 80:5000 -v my-finance-data:/etc/finance my-finance

这里可以看到我们将my-finance-data 这个volumes 挂载到了这个路径下/etc/finance的my-finance 这个容器中。
向这个路径中写入的任何数据,都会被保存在这个数据卷中。

容器的使用

之前的例子中都只涉及单个容器,但在实际使用中,我们的应用程序可能会用到多个容器共同协作。
比如我们可以使用一个容器来运行web应用,另一个容器来运行数据库,第三个容器来运行缓存,第四个容器来运行日志收集。
这样可以做到数据和应用逻辑的分离,提高系统的可用性。
比如当web程序宕机了,其他容器还可以继续运行。这时只需要修复web程序,其他容器不会受到影响。
而docker-compose可以让多个容器一起运行,并且可以方便的管理多个容器。
我们可以创建一个docker-compose.yml文件,然后使用docker-compose up命令来启动多个容器。
在这个文件下面,我们定义了四个容器,分别是web、db、cache和log。
我们在web容器中,设置了一个环境变量,这个环境变量的值是db容器的IP地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
web:
build: .
ports:
- "8000:5000"
volumes:
- ./:/code
depends_on:
- redis

redis:
image: "redis:alpine"
volumes:
- redis-data:/data

volumes:
redis-data:

这个时候我们可以使用docker-compose up命令来启动我们的容器,
运行docker-compose up命令后,Docker Compose 会自动创建并启动三个容器,分别是db、cache和log。
容器db和cache的日志会保存在my-finance-data目录下,而容器log的日志会保存在/var/log/nginx目录下。

与这个命令对应的是docker-compose down命令,这个命令会停止并删除所有容器,并删除所有相关联的镜像和卷。

这些操作也可以在图形化界面中完成,可以帮助我们在Docker中管理多个容器,并实现容器之间的数据共享和日志记录。

☸️ Docker与Kubernetes关系

Docker和Kubernetes都是用于容器化应用管理的开源平台。
Docker是一个开源的容器引擎,它允许开发者打包他们的应用以及依赖库到一个轻量级、可移植的容器中,然后发布到任何流行的主机上。Docker容器可以运行在任何支持Linux的机器上,并且可以轻松地部署和分发。
Kubernetes是一个开源的容器集群管理系统,它提供了一种简单的方式来管理容器化应用,包括自动扩展和负载均衡。Kubernetes使用容器化应用来构建和运行容器化应用,并使用容器组来管理容器化应用。
实际上kubernetes和docker并不是同一个层面的,docker是一个容器引擎,而kubernetes是一个容器编排工具,它使用docker作为容器引擎。
kubernetes所做的事情是:

  1. 容器编排:kubernetes使用容器编排工具来管理容器化应用,包括自动扩展和负载均衡。
  2. 服务发现和负载均衡:kubernetes使用服务发现和负载均衡来管理容器化应用,包括自动扩展和负载均衡。
  3. 自动化部署:kubernetes使用自动化部署来管理容器化应用,包括自动扩展和负载均衡。
  4. 监控和日志:kubernetes使用监控和日志来管理容器化应用,包括自动扩展和负载均衡。

🔍 常见问题排查

1
2
3
4
5
6
7
8
# 端口冲突:
netstat -tuln | grep 5000
# 查看容器日志:
docker logs -f <container_id>
# 进入运行中容器:
docker exec -it <container_id> bash
# 清理无用资源:
docker system prune -a

📚 ​延伸阅读​

官方文档
Docker最佳实践
Kubernetes入门