Docker 学习
一、Docker 是什么?
Docker 是一个容器化平台,允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。
-
类比:就像集装箱将货物标准化运输一样,Docker 将应用标准化运行在任何环境中。
-
核心目标:解决“在我机器上能跑,线上为什么不行?”的环境一致性问题
二、核心概念
1. 镜像(Image)
-
是什么:一个只读的模板,包含运行应用所需的代码、库、环境等。
-
比如:Ubuntu 镜像、MySQL 镜像、你的 Python 应用镜像。
-
-
特点:镜像可以分层复用(类似洋葱,一层层叠加)。
2. 容器(Container)
-
是什么:镜像的运行实例(类似“类”和“对象”的关系)。
-
容器是轻量级的,共享主机操作系统内核,启动秒级完成。
-
-
特点:容器是临时的,默认随命令结束而销毁(除非主动保存)。
3. 仓库(Registry)
-
是什么:存放镜像的地方。
-
Docker Hub:官方公共仓库(类似 GitHub)。
-
私有仓库:如阿里云容器镜像服务。
-
三、Docker 工作流程
-
开发阶段:编写Dockerfile→ 构建镜像(docker build)。
-
分发阶段:推送镜像到仓库(docker push)。
-
运行阶段:从仓库拉取镜像(docker pull)→ 启动容器(docker run)。
四、基本操作
1. 镜像操作
bashdocker pull nginx:latest # 拉取镜像docker images # 查看本地镜像docker rmi nginx # 删除镜像
2. 容器操作
bashdocker run -d -p 80:80 nginx # 启动容器(-d后台运行,-p端口映射)docker ps # 查看运行中的容器docker stop # 停止容器docker rm # 删除容器
3. 其他常用命令
bashdocker logs # 查看容器日志docker exec -it bash # 进入容器内部
五、Dockerfile 是什么?
-
作用:一个文本文件,包含一组指令(Instructions),告诉 Docker 如何自动构建镜像。
-
类比:就像做菜的食谱,Dockerfile 是“镜像的食谱”,docker build是“按食谱做菜”。
-
关键点:
-
每一条指令都会生成一个镜像层(Layer),层是堆叠的,复用可加速构建。
-
最终生成一个完整的、可运行的镜像。
-
六、Dockerfile 核心指令
以下是常用的指令(按构建顺序排列):
FROM
FROM ubuntu:22.04
RUN
RUN apt-get update && apt-get install -y curl
COPY
COPY ./app /app
ADD
COPY
,但支持自动解压或从 URL 下载ADD https://example.com/file.tar.gz /data
WORKDIR
cd
)WORKDIR /app
ENV
ENV NODE_ENV=production
EXPOSE
-p
映射)EXPOSE 80
CMD
docker run
覆盖)CMD [\"python\", \"app.py\"]
ENTRYPOINT
CMD
,但不可被覆盖(通常用于固定入口命令)ENTRYPOINT [\"nginx\", \"-g\", \"daemon off;\"]
VOLUME
VOLUME /data
七、实战:编写一个 Python 应用的 Dockerfile
假设有一个 Python Flask 应用,目录结构如下:
/myapp ├── app.py # Flask 代码 ├── requirements.txt # 依赖列表 └── Dockerfile # Dockerfile
1. 编写 Dockerfile
# 基础镜像(Python 官方镜像)FROM python:3.9-slim# 设置工作目录WORKDIR /app# 复制依赖文件并安装COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码COPY . .# 声明暴露的端口EXPOSE 5000# 启动命令CMD [\"python\", \"app.py\"]
2. 构建镜像
docker build -t my-flask-app:1.0 .
3. 运行容器
docker run -d -p 5000:5000 my-flask-app:1.0
八、学习心得
本周主要是跟着训练营那边进行docker相关知识的学习,由于本人愚钝,课上的内容未能及时消化,因此有部分内容未能完全理解,因此借助deepseek,chatgpt等大模型进行了进一步的学习。进度较慢,目前完成的内容为基础阶段的练习一与练习二。下周我将投入更多的学习时间,将此内容学懂学精。