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. 其他系统安装

三、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

六、常见问题排查

  1. Docker 服务启动失败

    • 检查是否开启虚拟化(Windows 需 WSL2,Linux 需 grep -E '(vmx|svm)' /proc/cpuinfo 验证);
    • 重启 Docker 服务:sudo systemctl restart docker(Linux)或重启 Docker Desktop(Windows/macOS)。
  2. 端口被占用

    • 报错 port is already allocated,更换主机端口(如 -p 8081:80);
    • 查看端口占用:netstat -tulpn | grep 80(Linux)或 netstat -ano | findstr 80(Windows)。
  3. 容器启动后立即退出

    • 后台运行容器需确保有前台进程(如 Nginx、MySQL 自带前台进程,而 Ubuntu 需 -it 交互式运行);
    • 查看日志排查:docker logs 容器ID
  4. 无法拉取镜像

    • 国内用户可配置 Docker 镜像加速器(如阿里云、网易云);
    • 编辑 /etc/docker/daemon.json(Linux)或在 Docker Desktop 中配置:
      {
        "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]  // 替换为你的加速器地址
      }
      
    • 重启 Docker 服务:sudo systemctl daemon-reload && sudo systemctl restart docker

七、进阶方向

入门后可继续学习:

  1. Docker Compose:多容器编排(如同时运行前端、后端、数据库容器);
  2. Docker Swarm/Kubernetes:容器集群管理(大规模部署);
  3. 镜像优化:减小镜像体积(如使用 Alpine 基础镜像、多阶段构建);
  4. 私有仓库:搭建 Harbor 私有镜像仓库(企业内部使用)。

通过以上基础内容,你已经能完成 Docker 日常开发/测试中的核心操作(拉取镜像、运行容器、构建自定义镜像、数据持久化)。多动手实践(比如用 Docker 运行 Redis、MongoDB 等常用服务),就能快速熟练掌握!

更多推荐