Docker 入门基础:从概念到实战(视频教程)
Docker 入门基础:从概念到实战
- Docker 是一款开源的容器化平台,核心价值是「将应用及其依赖打包成标准化容器,实现“一次构建,到处运行”」,解决了传统开发/运维中“环境不一致”“部署复杂”等痛点。本文从核心概念、安装、常用命令到实战案例,带你快速入门 Docker。
- 视频教程:
https://pan.quark.cn/s/ffa93407d6e3
一、核心概念:3个核心组件
Docker 的核心是「容器」,但需先理解支撑容器的3个关键概念:
| 组件 | 通俗理解 | 核心作用 | 类比关系 |
|---|---|---|---|
| 镜像(Image) | 容器的“模板”/“安装包” | 包含运行应用所需的代码、依赖、环境配置 | 类似:ISO镜像文件 |
| 容器(Container) | 镜像的“运行实例” | 镜像加载后在内存中运行的独立进程,隔离环境 | 类似:虚拟机实例 |
| 仓库(Registry) | 存储镜像的“云端仓库” | 分享/下载镜像(公开/私有) | 类似:GitHub |
关键区别:容器 vs 虚拟机(VM)
很多人会把容器和虚拟机混淆,核心差异在于「隔离粒度」:
- 虚拟机:虚拟整个操作系统(内核+应用),体积大(GB级)、启动慢(分钟级)、资源占用高;
- 容器:共享宿主机内核,仅隔离应用运行环境(进程、网络、文件系统),体积小(MB级)、启动快(秒级)、资源高效。
二、安装 Docker
Docker 支持 Windows、macOS、Linux,推荐在 Linux 或 WSL2(Windows子系统)中使用(兼容性最好)。
1. 环境要求
- Windows:需开启 WSL2 + 硬件虚拟化(BIOS中开启);
- macOS:macOS 10.15+(Intel/Apple Silicon 均可);
- Linux:Ubuntu 18.04+、CentOS 7+ 等,需 64位系统 + 内核 3.10+。
2. 快速安装(以 Ubuntu 为例)
# 1. 更新系统包
sudo apt update && sudo apt upgrade -y
# 2. 安装依赖工具
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 3. 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker Engine
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
# 6. 验证安装(查看版本)
docker --version # 输出 Docker version 20.10.x 即成功
# 7. (可选)配置免 sudo 运行 Docker(避免每次输入 sudo)
sudo usermod -aG docker $USER # 将当前用户加入 docker 组
newgrp docker # 立即生效(无需重启)
3. 其他系统安装
- Windows/macOS:直接下载 Docker Desktop,安装后启动(会自动启动 Docker 后台服务);
- CentOS:参考 Docker 官方文档。
三、Docker 核心命令(必背)
Docker 命令格式:docker [命令] [选项] [对象](对象可是镜像名、容器ID等)。
1. 镜像相关命令
(1)拉取镜像(从仓库下载)
格式:docker pull 镜像名:标签(标签默认 latest,即最新版)
# 拉取官方 Nginx 镜像(最新版)
docker pull nginx
# 拉取指定版本(如 Nginx 1.24)
docker pull nginx:1.24
# 拉取私有仓库镜像(需先登录)
docker login 私有仓库地址 # 输入用户名密码
docker pull 私有仓库地址/镜像名:标签
(2)查看本地镜像
docker images # 简写:docker img
# 查看详细信息(含镜像ID、创建时间等)
docker images --digests --no-trunc
(3)删除镜像
格式:docker rmi 镜像名:标签 或 docker rmi 镜像ID(镜像ID可通过 docker images 查看,支持前3位简写)
# 通过镜像名删除
docker rmi nginx:1.24
# 通过镜像ID删除(假设ID是 abc123)
docker rmi abc123
# 强制删除(镜像被容器占用时)
docker rmi -f nginx:latest
(4)构建自定义镜像(关键!后续实战详解)
通过 Dockerfile 构建镜像,格式:docker build -t 镜像名:标签 构建上下文路径
2. 容器相关命令
(1)创建并启动容器(最常用)
格式:docker run [选项] 镜像名 [容器内命令]
核心选项:
-d:后台运行(守护态);-p 主机端口:容器端口:端口映射(如-p 8080:80表示主机8080端口映射容器80端口);--name 容器名:指定容器名称(避免随机名称);-v 主机目录:容器目录:数据卷挂载(持久化数据,避免容器删除后数据丢失);-it:交互式运行(前台,可进入容器命令行);--rm:容器停止后自动删除(测试场景常用)。
示例:
# 1. 前台运行 Nginx(可直接看到日志,按 Ctrl+C 停止)
docker run --name mynginx -p 80:80 nginx
# 2. 后台运行 Nginx(推荐生产环境)
docker run -d --name mynginx -p 80:80 nginx
# 3. 交互式运行 Ubuntu(进入容器命令行)
docker run -it --name myubuntu ubuntu /bin/bash # 进入后可执行 ls、apt 等命令
# 退出容器(不停止):按 Ctrl+P+Q;退出并停止:按 Ctrl+C 或 exit
# 4. 挂载数据卷(持久化 Nginx 配置和网站文件)
mkdir -p /home/user/nginx/conf /home/user/nginx/html
echo "Hello Docker" > /home/user/nginx/html/index.html
docker run -d --name mynginx -p 80:80 \
-v /home/user/nginx/conf:/etc/nginx/conf.d \
-v /home/user/nginx/html:/usr/share/nginx/html \
nginx
(2)查看容器状态
# 查看运行中的容器
docker ps # 简写:docker ps
# 查看所有容器(运行中+停止的)
docker ps -a
# 查看容器详细信息(如IP、挂载、端口等)
docker inspect 容器名/容器ID
(3)启动/停止/重启容器
# 启动已停止的容器
docker start 容器名/容器ID
# 停止运行中的容器
docker stop 容器名/容器ID
# 强制停止(类似 kill -9)
docker kill 容器名/容器ID
# 重启容器
docker restart 容器名/容器ID
(4)进入运行中的容器(调试用)
# 方式1:exec(推荐,不影响容器主进程)
docker exec -it 容器名/容器ID /bin/bash # Ubuntu/Debian 用 bash
docker exec -it 容器名/容器ID /bin/sh # 精简镜像(如 Alpine)用 sh
# 方式2:attach(会进入容器主进程,退出可能导致容器停止)
docker attach 容器名/容器ID
(5)删除容器
# 删除停止的容器
docker rm 容器名/容器ID
# 强制删除运行中的容器
docker rm -f 容器名/容器ID
# 批量删除所有停止的容器
docker rm $(docker ps -a -q)
(6)查看容器日志/资源占用
# 查看容器日志(实时滚动)
docker logs -f 容器名/容器ID
# 查看容器CPU/内存/网络占用
docker stats 容器名/容器ID
3. 仓库相关命令
# 登录仓库(Docker Hub/私有仓库)
docker login # 登录 Docker Hub(默认)
docker login 私有仓库地址 # 登录私有仓库
# 退出仓库
docker logout
# 推送镜像到仓库(需先给镜像打标签)
docker tag 本地镜像名:标签 仓库地址/镜像名:标签 # 打标签
docker push 仓库地址/镜像名:标签 # 推送
四、实战:构建并运行自定义 Nginx 镜像
通过 Dockerfile 构建一个“自定义首页”的 Nginx 镜像,步骤如下:
1. 准备工作
创建工作目录并编写文件:
# 1. 创建目录
mkdir -p ~/docker-demo && cd ~/docker-demo
# 2. 编写自定义首页(index.html)
echo "<h1>Hello Docker! 这是我的自定义镜像</h1>" > index.html
# 3. 编写 Dockerfile(核心文件,命名必须是 Dockerfile)
cat > Dockerfile << EOF
# 基础镜像(从官方 Nginx 1.24 继承)
FROM nginx:1.24
# 作者信息(可选)
LABEL maintainer="your-name <your-email>"
# 将本地 index.html 复制到容器的 Nginx 网站根目录
COPY index.html /usr/share/nginx/html/
# 暴露容器端口(文档说明,不实际映射)
EXPOSE 80
# 容器启动时执行的命令(继承基础镜像的命令,可省略)
CMD ["nginx", "-g", "daemon off;"]
EOF
2. 构建镜像
# -t 给镜像打标签(名称:my-nginx,标签:v1)
# . 表示构建上下文路径(当前目录,Docker 会读取该目录下的文件)
docker build -t my-nginx:v1 .
3. 运行自定义镜像
docker run -d --name my-custom-nginx -p 8080:80 my-nginx:v1
4. 验证效果
打开浏览器访问 http://主机IP:8080,即可看到自定义首页“Hello Docker! 这是我的自定义镜像”。
五、数据持久化:数据卷(Volume)
容器默认是“临时存储”,删除容器后数据会丢失。通过「数据卷」可将容器内的目录挂载到主机,实现数据持久化。
1. 两种挂载方式
(1)绑定挂载(Bind Mount)
直接挂载主机目录到容器,适合开发环境(主机文件修改后容器内实时生效):
# 主机 /home/user/data 挂载到容器 /app/data
docker run -d -v /home/user/data:/app/data --name myapp 镜像名
(2)Docker 管理卷(Named Volume)
由 Docker 统一管理卷目录(默认在 /var/lib/docker/volumes/),适合生产环境(无需关心主机目录路径):
# 1. 创建命名卷
docker volume create mydata
# 2. 挂载命名卷到容器
docker run -d -v mydata:/app/data --name myapp 镜像名
# 3. 查看卷信息
docker volume inspect mydata
2. 实战:持久化 MySQL 数据
# 1. 创建命名卷(存储 MySQL 数据)
docker volume create mysql-data
# 2. 运行 MySQL 容器(挂载卷+设置密码)
docker run -d --name mymysql -p 3306:3306 \
-v mysql-data:/var/lib/mysql \ # 挂载数据目录
-e MYSQL_ROOT_PASSWORD=123456 \ # 设置 root 密码
mysql:8.0
# 3. 验证:删除容器后重新运行,数据仍存在
docker rm -f mymysql
docker run -d --name mymysql -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
六、常见问题排查
-
Docker 服务启动失败:
- 检查是否开启虚拟化(Windows 需 WSL2,Linux 需
grep -E '(vmx|svm)' /proc/cpuinfo验证); - 重启 Docker 服务:
sudo systemctl restart docker(Linux)或重启 Docker Desktop(Windows/macOS)。
- 检查是否开启虚拟化(Windows 需 WSL2,Linux 需
-
端口被占用:
- 报错
port is already allocated,更换主机端口(如-p 8081:80); - 查看端口占用:
netstat -tulpn | grep 80(Linux)或netstat -ano | findstr 80(Windows)。
- 报错
-
容器启动后立即退出:
- 后台运行容器需确保有前台进程(如 Nginx、MySQL 自带前台进程,而 Ubuntu 需
-it交互式运行); - 查看日志排查:
docker logs 容器ID。
- 后台运行容器需确保有前台进程(如 Nginx、MySQL 自带前台进程,而 Ubuntu 需
-
无法拉取镜像:
- 国内用户可配置 Docker 镜像加速器(如阿里云、网易云);
- 编辑
/etc/docker/daemon.json(Linux)或在 Docker Desktop 中配置:{ "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] // 替换为你的加速器地址 } - 重启 Docker 服务:
sudo systemctl daemon-reload && sudo systemctl restart docker。
七、进阶方向
入门后可继续学习:
- Docker Compose:多容器编排(如同时运行前端、后端、数据库容器);
- Docker Swarm/Kubernetes:容器集群管理(大规模部署);
- 镜像优化:减小镜像体积(如使用 Alpine 基础镜像、多阶段构建);
- 私有仓库:搭建 Harbor 私有镜像仓库(企业内部使用)。
通过以上基础内容,你已经能完成 Docker 日常开发/测试中的核心操作(拉取镜像、运行容器、构建自定义镜像、数据持久化)。多动手实践(比如用 Docker 运行 Redis、MongoDB 等常用服务),就能快速熟练掌握!
更多推荐
所有评论(0)