Docker零基础入门到精通
第一章:理解 Docker 的核心价值1. Docker 解决了什么问题?
您可能听过软件开发中最常见的一句话:“在我的电脑上运行得好好的啊!”

Docker 就是用来终结这句话的工具。
传统问题: 您的应用需要特定的操作系统、Python 版本、数据库驱动等。将应用部署到新环境(如测试服务器或生产服务器)时,环境不一致经常导致程序崩溃。Docker 解决方案: Docker 将应用程序及其所有依赖项(运行时环境、库、配置等)打包到一个独立的、可移植的 容器(Container) 中。无论容器在哪台机器上运行,它的内部环境都是完全一致的。2. 核心概念三件套要入门 Docker,您必须理解以下三个核心概念之间的关系:
术语
中文解释
概念对标(类比)
特点
Image (镜像)
静态的模板
烘焙蛋糕的 食谱或模具
只读,包含了运行应用所需的一切。
Container (容器)
镜像的运行实例
食谱做出来的 蛋糕
可读可写,运行中的应用程序实例。
Dockerfile
构建镜像的指令集
编写食谱的 说明书
文本文件,定义如何从头构建一个 Image。
总结: 我们根据 Dockerfile 创建 Image (镜像),然后运行 Image (镜像) 得到 Container (容器)。
第二章:安装与环境准备1. 安装 Docker Desktop对于 Windows 和 macOS 用户,最简单、最推荐的入门方式是安装 Docker Desktop。
- 访问 Docker 官方网站下载适用于您操作系统的 Docker Desktop 安装包。
- 双击安装包,按照提示完成安装。
- 重要: 在 Windows 上,Docker 通常需要启用 WSL 2(Windows Subsystem for Linux) 或 Hyper-V 功能,请根据安装程序的提示或官方文档进行配置。
- 安装完成后,启动 Docker Desktop。当您在系统托盘看到 Docker 鲸鱼图标处于稳定状态时,表示安装成功。
2. 验证安装
打开您的命令行工具(CMD, PowerShell 或 Terminal),输入以下命令:
docker --versiondocker run hello-world如果 docker --version 输出了版本号,说明客户端安装成功。如果 docker run hello-world 运行成功并输出了一段祝贺信息,恭喜您,您的第一个容器已经成功运行!

第三章:核心操作命令实战
现在我们开始学习 Docker 最常用的命令。
1. 下载镜像 (Image)在运行容器之前,我们需要下载它的蓝图。pull 命令就是从 Docker Hub(官方镜像仓库)下载镜像。
docker pull nginx:latestnginx: 镜像的名称(这里是高性能 Web 服务器)。latest: 标签/版本号。2. 运行容器 (Container)
run 是 Docker 中最重要的命令,它负责创建并启动一个容器。
示例 1: 运行一个 Web 服务器运行一个 Nginx 容器,并将容器的 80 端口映射到本地的 8080 端口。
docker run -d --name my-webserver -p 8080:80 nginx
参数
含义
-d
Detached mode,后台运行,容器启动后不会占用当前终端。
--name
为容器指定一个易记的名称 (my-webserver
)。
-p
Port mapping,端口映射。格式为 宿主机端口:容器端口
。
nginx
基于哪个镜像启动容器。
验证: 打开浏览器,访问 您应该能看到 Nginx 的欢迎页面。
3. 查看容器查看正在运行的容器: docker ps查看所有容器(包括已停止的):
docker ps -a4. 停止与删除停止容器(但保留其数据):
docker stop my-webserver启动已停止的容器:
docker start my-webserver删除容器(容器必须先停止):
docker rm my-webserver删除镜像:
docker rmi nginx:latest
注意: 删除镜像是 rmi,删除容器是 rm。
第四章:构建您自己的镜像 (Dockerfile)到现在为止,我们只使用了别人制作好的镜像。现在,我们学习如何将自己的应用打包成镜像。
1. 什么是 Dockerfile?Dockerfile 是一个没有扩展名的纯文本文件,它包含了一系列指令,告诉 Docker 引擎如何一步一步地构建镜像。
Dockerfile 核心指令详解
指令
作用
深度解释 (分层机制)
FROM
指定基础镜像
必须是 Dockerfile 的第一条指令。它决定了你的镜像从哪一层开始堆叠。
WORKDIR
设置工作目录
设置后续所有指令(如 COPY
、RUN
、CMD
)的默认运行目录。
COPY
拷贝文件
将宿主机文件复制到镜像中,这会形成一个新层。
RUN
执行命令
在构建过程中执行 shell 命令(如安装依赖)。每一条 RUN
命令都会创建一个新的镜像层。
EXPOSE
暴露端口
仅是文档声明,告诉使用者容器内应用监听哪个端口,并不会自动进行端口映射。
CMD
容器启动命令
容器启动时(而非构建时)要执行的命令。一个 Dockerfile 中只能有一个有效的 CMD
。
2. 编写一个简单的 Python 应用 Dockerfile假设您有一个简单的 Python Web 应用 (app.py):
from http.server import BaseHTTPRequestHandler, HTTPServerimport timeclass MyHandler(BaseHTTPRequestHandler):def do_GET(self):self.send_response(200)self.send_header('Content-type', 'text/html')self.end_headers()self.wfile.write(bytes("Hello from Docker! Current time: %s" % time.ctime(), "utf-8"))if __name__ == "__main__":webServer = HTTPServer(("0.0.0.0", 8080), MyHandler)webServer.serve_forever()
创建文件名为 Dockerfile (无后缀) 的文件,并写入以下内容:
Dockerfile
# 1. 指定基础镜像:我们基于官方的 Python 3.9 轻量版FROM python:3.9-slim# 2. 设置工作目录:后续的指令都将在 /app 目录下执行WORKDIR /app# 3. 将当前目录下的 app.py 拷贝到容器内的 /app 目录COPY app.py .# 4. 暴露端口:声明容器内的 8080 端口需要被外部访问EXPOSE 8080# 5. 定义容器启动时执行的命令CMD ["python", "app.py"]3. 构建和运行
在 Dockerfile 和 app.py 所在的目录下执行以下命令:
A. 构建镜像 docker build -t my-python-app:v1 .build: 执行构建操作。-t: Tag,给新镜像命名和打标签 (my-python-app:v1)。.: 上下文路径,告诉 Docker 在当前目录寻找 Dockerfile 和其他文件。B. 运行容器
docker run -d --name my-python-instance -p 5000:8080 my-python-app:v1
验证: 访问 您将看到 Python 应用的输出 "Hello from Docker!..."。您已成功容器化您的第一个应用!
第五章:下一步进阶方向 (从入门到实战)完成前面章节的学习,您已经掌握了 Docker 的核心操作。要将 Docker 应用于实际项目,您需要学习以下关键的高级主题:
1. 数据持久化:卷 (Volumes)还记得容器的“用完即弃”特性吗?它运行在可写的顶层,一旦删除,数据就没了。卷(Volume)就是用来安全地保存这些数据的“保险柜”。
核心作用: 保证数据库数据、日志文件、用户上传文件等关键数据的持久性。常用命令:使用 -v 参数进行挂载。命名卷 Docker 自动管理存储位置。
docker run -v my-data:/app/data ...
绑定挂载 :将宿主机上的某个特定目录直接映射到容器内,常用于开发调试。
docker run -v $(pwd)/src:/app/src ...2. 多容器管理:Docker Compose
实际项目往往不止一个容器(例如:Web 应用容器 + 数据库容器 + 缓存容器)。Docker Compose 允许您通过一个 YAML 配置文件 来定义和管理多容器应用。
核心作用: 简化复杂应用的启动、停止和管理。配置文件:docker-compose.yml。常用命令:一键启动所有服务:docker compose up -d一键停止并删除服务:docker compose down当项目复杂到需要多个服务(例如 Web、数据库、缓存)时,您会发现:
- 需要运行三条复杂的 docker run 命令。
- 必须手动创建网络和卷。
- 容器之间不知道如何互相通信。
Docker Compose 就是解决这些问题的“项目启动器”,它使用一个 YAML 文件定义整个应用栈。
核心结构:docker-compose.ymlCompose 文件主要包含三个顶级键:
顶级键
作用
对应 Docker 概念
services
定义您的应用包含哪些服务(容器),如 web
或 db
。
对应 docker run
的配置。
volumes
定义您的应用需要的卷(持久化存储)。
对应 docker volume create
。
networks
定义容器间通信的网络。
对应 docker network create
。
Web 应用 + PostgreSQL 数据库这个例子展示了如何用一个文件启动两个容器,并确保数据库数据持久化。
version: '3.8'services:web:# 1. 告诉 Compose 如何获取镜像:从本地构建build: . # 2. 端口映射:外部的 5000 转发给容器的 8080ports:- "5000:8080"# 3. 依赖关系:确保数据库启动后再启动 Web 服务depends_on:- db# 4. 环境变量:配置数据库连接信息environment:DATABASE_HOST: db # 关键:使用服务名 'db' 作为主机名DATABASE_NAME: myapp_dbdb:# 1. 基础镜像image: postgres:14-alpine# 2. 数据库配置environment:POSTGRES_DB: myapp_dbPOSTGRES_USER: userPOSTGRES_PASSWORD: password# 3. 数据持久化:将 db_data 卷挂载到 PostgreSQL 的数据目录volumes:- db_data:/var/lib/postgresql/data# 顶级卷定义:告诉 Docker 创建名为 db_data 的命名卷volumes:db_data:# 这是一个命名卷,用于持久化数据库数据# 顶级网络定义:默认情况下,Compose 会自动创建一个网络,并将所有服务加入# networks:# default:# driver: bridge3. 创建和使用自定义网络
默认情况下,Docker 会为容器创建隔离的网络。理解容器网络有助于服务发现和安全隔离。
步骤 A: 创建网络 docker network create my_custom_network步骤 B: 连接第一个容器 (数据库)
docker run -d \--name my_database \--network my_custom_network \postgres:14-alpine步骤 C: 连接第二个容器 (Web 服务)
Web 服务现在可以直接使用 my_database 作为主机名连接。
docker run -d \--name my_web \--network my_custom_network \-e DATABASE_HOST=my_database \my-python-app:v1查看和检查网络
使用 docker network 命令族来管理和调试网络:
命令
作用
示例输出 (重点)
docker network ls
列出所有网络
列出 bridge
、host
、以及您创建的 my_custom_network
。
docker network inspect
查看网络配置详情
显示该网络下的 IP 范围、驱动,以及 哪些容器连接了进来(及其 IP)。
4. 镜像推送像制作完毕并优化后,下一步就是将其上传到一个镜像仓库(Registry),供其他环境或团队成员使用。最常用的是 Docker Hub。
登录 Registry您需要先登录您的 Docker Hub 账户或私有 Registry。
docker login# 提示输入用户名和密码/访问令牌标记镜像
Docker Hub 要求镜像名称带有您的用户名(或组织名)。您需要为本地镜像打上新的标签。
# 格式: docker tag <本地镜像名> <用户名>/<仓库名>:<标签>docker tag my-python-app:v1 yourusername/my-app-repo:v1.0.03. 推送镜像
将标记好的镜像上传到远程仓库。
docker push yourusername/my-app-repo:v1.0.0
上传成功后,任何拥有访问权限的人都可以在任何地方通过 docker pull yourusername/my-app-repo:v1.0.0 下载并运行您的应用。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
