🐳 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 | # 基础镜像 |
构建与运行
在Dockerfile中,COPY命令用于将宿主机上的文件复制到镜像中,CMD命令用于设置容器启动后执行的命令。
1 | # 构建镜像 |
构建完成后,就可以在浏览器中访问localhost:5000,看到Flask的欢迎页面。
三种挂载方式对比
类型 | 存储位置 | 生命周期性 | 适用场景 |
---|---|---|---|
Volume | Docker管理目录 | 独立于容器 | 生产环境数据库 |
Bind Mount | 主机指定路径 | 跟随主机文件系统 | 开发环境代码挂载 |
tmpfs | 内存 | 容器停止即消失 | 敏感临时数据 |
Docker Desktop的应用
我们通过docker desktop可以很方便的管理docker容器,比如可以查看容器列表,可以启动容器,可以停止容器,可以删除容器,可以查看容器日志,可以查看容器状态,可以查看容器的端口映射,可以查看容器的资源使用情况,可以查看容器的日志,可以查看容器的配置,可以查看容器的运行状态,可以查看容器的运行命令,可以查看容器的运行参数,可以查看容器的运行环境变量,可以查看容器的运行目录,可以查看容器的运行文件,可以查看容器的运行日志,可以查看容器的运行。
常见命令
1 | # 列举所有的容器 |
volumes的介绍
需要注意的是,容器删除时,会删除容器的镜像,但是不会删除容器所使用的镜像。之前所做的操作,都是基于一个镜像的,所以,当容器删除后,镜像依然存在。但新添加的数据会丢失,这时我们可以使用volumes 来保存数据。
在docker中,volumes 是一个持久化数据的存储容器。你可以把Volumes 当作一个持久化数据的存储容器。
比如你在某个容器中修改了某个volumes 中的文件,当这个容器被删除后,这个volumes 中的文件也会被修改。
我们可以通过docker volmes create 命令来创建一个volumes。
1 | docker volume create my-volumes |
随后在启动容器的时候,使用volumes-from 来指定这个volumes。
1 | docker run -it --name my-container --volumes-from my-volumes ubuntu /bin/bash |
这里可以看到我们将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 | version: '3.8' |
这个时候我们可以使用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所做的事情是:
- 容器编排:kubernetes使用容器编排工具来管理容器化应用,包括自动扩展和负载均衡。
- 服务发现和负载均衡:kubernetes使用服务发现和负载均衡来管理容器化应用,包括自动扩展和负载均衡。
- 自动化部署:kubernetes使用自动化部署来管理容器化应用,包括自动扩展和负载均衡。
- 监控和日志:kubernetes使用监控和日志来管理容器化应用,包括自动扩展和负载均衡。
🔍 常见问题排查
1 | # 端口冲突: |