01:Docker 概述

1.1 Docker 概述

1.1.1 Docker 的概念

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中,然后可以在任何支持 Docker 的环境中运行。

三大核心组件:

  1. 镜像 (Image)

    • 只读的模板,包含运行容器所需的文件系统
    • 类似于面向对象编程中的"类"
    • 采用分层存储结构
  2. 容器 (Container)

    • 镜像的运行实例
    • 类似于面向对象编程中的"对象"
    • 可以被创建、启动、停止、删除、暂停
  3. 仓库 (Registry)

    • 集中存储和分发镜像的服务
    • Docker Hub 是最大的公共仓库
    • 可以搭建私有仓库

关系类比:

复制代码
镜像 : 容器 = 程序 : 进程 = 类 : 对象

1.2 Docker 安装

1.2.1 Windows 安装

系统要求:

  • Windows 10 64位:专业版、企业版或教育版(Build 19041或更高版本)
  • Windows 11 64位
  • 启用 Hyper-V 和 WSL 2

安装步骤:

  1. 下载 Docker Desktop

  2. 启用 WSL 2(推荐)

    powershell 复制代码
    # 以管理员身份运行 PowerShell
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    
    # 重启电脑后,设置 WSL 2 为默认版本
    wsl --set-default-version 2
  3. 安装 Docker Desktop

    • 双击安装包,按照向导安装
    • 勾选"Use WSL 2 instead of Hyper-V"
    • 重启电脑
  4. 验证安装

    powershell 复制代码
    docker --version
    docker run hello-world

1.2.2 Linux 安装(以 Ubuntu 为例)

安装步骤:

bash 复制代码
# 1. 更新软件包索引
sudo apt-get update

# 2. 安装依赖包
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. 设置仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.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-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 6. 验证安装
sudo docker --version
sudo docker run hello-world

配置非 root 用户运行 Docker:

bash 复制代码
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER

# 重新登录或执行
newgrp docker

# 现在可以不用 sudo 运行 docker 命令
docker ps

1.2.3 MacOS 安装

安装步骤:

  1. 下载 Docker Desktop for Mac

  2. 双击 .dmg 文件,将 Docker 拖到 Applications 文件夹

  3. 启动 Docker Desktop,按照向导完成设置

  4. 验证安装:

    bash 复制代码
    docker --version
    docker run hello-world

1.2.4 配置国内镜像加速器

为什么需要镜像加速?

  • Docker Hub 在国外,下载镜像速度慢
  • 使用国内镜像源可以大幅提升速度

常用国内镜像源:

配置方法(Docker Desktop):

  1. 打开 Docker Desktop
  2. 进入 Settings → Docker Engine
  3. 修改配置文件:
json 复制代码
{
  "registry-mirrors": [
    "https://your-mirror-url.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ]
}
  1. 点击 "Apply & Restart"

Linux 配置方法:

bash 复制代码
# 编辑配置文件
sudo nano /etc/docker/daemon.json

# 添加以下内容
{
  "registry-mirrors": [
    "https://your-mirror-url.com"
  ]
}

# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证配置
docker info | grep -A 1 "Registry Mirrors"

1.3 Docker 命令行基础

1.3.1 命令结构

Docker 命令的基本格式:

bash 复制代码
docker [OPTIONS] COMMAND [ARG...]

示例:

bash 复制代码
docker run -d -p 80:80 nginx:latest
│     │  │  │      │    └── 参数:镜像名和标签
│     │  │  │      └── 命令参数:端口映射
│     │  │  └── 命令参数:后台运行
│     │  └── 选项:-d 和 -p
│     └── 命令:run
└── Docker CLI

1.3.2 获取帮助

bash 复制代码
# 查看 Docker 版本
docker --version
docker version  # 详细版本信息

# 查看 Docker 系统信息
docker info

# 查看所有可用命令
docker --help

# 查看具体命令的帮助
docker run --help
docker ps --help

1.3.3 常用命令分类

镜像相关:

bash 复制代码
docker pull      # 拉取镜像
docker images    # 列出本地镜像
docker rmi       # 删除镜像
docker build     # 构建镜像
docker tag       # 标记镜像

容器相关:

bash 复制代码
docker run       # 创建并启动容器
docker ps        # 列出运行中的容器
docker start     # 启动容器
docker stop      # 停止容器
docker restart   # 重启容器
docker rm        # 删除容器
docker exec      # 在运行的容器中执行命令
docker logs      # 查看容器日志

系统相关:

bash 复制代码
docker info      # 显示系统信息
docker version   # 显示版本信息
docker stats     # 显示容器资源使用统计
docker system df # 显示磁盘使用情况

1.4 运行第一个容器

1.4.1 Hello World

bash 复制代码
# 运行 hello-world 容器
docker run hello-world

执行过程分析:

  1. Docker客户端联系Docker守护进程
  2. Docker守护进程从Docker Hub拉取"hello-world"镜像
  3. Docker守护进程从该镜像创建一个新容器
  4. 容器运行可执行文件产生输出
  5. Docker守护进程将输出流式传输到Docker客户端
  6. 容器执行完毕自动停止

输出示例:

复制代码
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image...

1.4.2 运行 NGINX Web 服务器

bash 复制代码
# 运行 nginx 容器,映射端口到主机
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 命令参数说明:
# -d              后台运行容器
# -p 8080:80      将容器的 80 端口映射到主机的 8080 端口
# --name my-nginx 给容器命名为 my-nginx
# nginx:latest    使用 nginx 的最新版本镜像

验证运行:

bash 复制代码
# 查看运行中的容器
docker ps

# 访问 Web 服务
# 在浏览器打开:http://localhost:8080
# 或使用 curl
curl http://localhost:8080

查看容器日志:

bash 复制代码
docker logs my-nginx

# 实时查看日志(类似 tail -f)
docker logs -f my-nginx

停止和删除容器:

bash 复制代码
# 停止容器
docker stop my-nginx

# 删除容器
docker rm my-nginx

# 强制删除运行中的容器
docker rm -f my-nginx

1.4.3 交互式运行容器

bash 复制代码
# 运行 Ubuntu 容器并进入交互式终端
docker run -it ubuntu:22.04 /bin/bash

# 命令参数说明:
# -i    保持标准输入打开
# -t    分配一个伪终端
# /bin/bash  在容器中执行的命令

在容器内操作:

bash 复制代码
# 现在你在容器内部
root@container-id:/# ls
root@container-id:/# pwd
root@container-id:/# apt-get update
root@container-id:/# apt-get install -y curl

# 退出容器(容器会停止)
root@container-id:/# exit

# 或使用快捷键 Ctrl+D

进入运行中的容器:

bash 复制代码
# 先启动一个后台运行的容器
docker run -d --name my-ubuntu ubuntu:22.04 sleep 3600

# 进入运行中的容器
docker exec -it my-ubuntu /bin/bash

# 退出但不停止容器:使用 exit 或 Ctrl+D

1.5 Docker 基础实践

实践 1:部署一个静态网站

**目标:**使用 NGINX 部署自己的静态网站

bash 复制代码
# 1. 创建本地网站目录
mkdir -p ~/my-website
cd ~/my-website

# 2. 创建 index.html
cat > index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>My Docker Website</title>
</head>
<body>
    <h1>Hello from Docker!</h1>
    <p>This is my first Dockerized website.</p>
</body>
</html>
EOF

# 3. 运行 NGINX 容器,挂载本地目录
docker run -d \
  --name my-website \
  -p 8080:80 \
  -v ~/my-website:/usr/share/nginx/html:ro \
  nginx:alpine

# 4. 访问网站
curl http://localhost:8080

参数说明:

  • -v ~/my-website:/usr/share/nginx/html:ro:挂载本地目录到容器(只读)
  • nginx:alpine:使用基于 Alpine Linux 的轻量级 NGINX 镜像

实践 2:运行 MySQL 数据库

bash 复制代码
# 运行 MySQL 容器
docker run -d \
  --name my-mysql \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  mysql:8.0

# 参数说明:
# -e MYSQL_ROOT_PASSWORD   设置 root 密码
# -e MYSQL_DATABASE        创建数据库
# -p 3306:3306            映射 MySQL 端口

# 查看容器日志,等待启动完成
docker logs -f my-mysql

# 进入 MySQL 容器
docker exec -it my-mysql mysql -uroot -pmy-secret-pw

# 在 MySQL 中执行命令
mysql> SHOW DATABASES;
mysql> USE mydb;
mysql> CREATE TABLE users (id INT, name VARCHAR(50));
mysql> INSERT INTO users VALUES (1, 'Docker User');
mysql> SELECT * FROM users;
mysql> EXIT;

实践 3:容器生命周期管理

bash 复制代码
# 创建容器但不启动
docker create --name my-container nginx:alpine

# 启动容器
docker start my-container

# 查看容器状态
docker ps -a

# 暂停容器
docker pause my-container

# 恢复容器
docker unpause my-container

# 重启容器
docker restart my-container

# 停止容器(优雅关闭,等待10秒)
docker stop my-container

# 立即杀死容器
docker kill my-container

# 删除容器
docker rm my-container

# 一次性运行后自动删除(常用于测试)
docker run --rm nginx:alpine echo "Hello Docker"

1.6 常见问题排查

问题 1:Docker 命令需要 sudo

**原因:**当前用户不在 docker 组中

解决方案:

bash 复制代码
# 将用户添加到 docker 组
sudo usermod -aG docker $USER

# 重新登录或执行
newgrp docker

问题 2:端口已被占用

错误信息:

复制代码
Error response from daemon: driver failed programming external connectivity
on endpoint: Bind for 0.0.0.0:8080 failed: port is already allocated

解决方案:

bash 复制代码
# 方案1:使用其他端口
docker run -d -p 8081:80 nginx

# 方案2:查找并停止占用端口的进程
# Linux/Mac
sudo lsof -i :8080
sudo kill -9 <PID>

# Windows
netstat -ano | findstr :8080
taskkill /PID <PID> /F

问题 3:镜像拉取速度慢

解决方案:

  • 配置国内镜像加速器(见 1.2.4 节)
  • 使用阿里云、腾讯云等提供的镜像服务

问题 4:容器启动后立即退出

排查步骤:

bash 复制代码
# 查看所有容器(包括已停止的)
docker ps -a

# 查看容器日志
docker logs <container-id>

# 查看容器详细信息
docker inspect <container-id>

常见原因:

  • 容器中的主进程执行完毕
  • 应用程序启动失败
  • 配置错误

1.7 关键命令回顾

bash 复制代码
docker run          # 创建并启动容器
docker ps           # 查看运行中的容器
docker ps -a        # 查看所有容器
docker logs         # 查看容器日志
docker exec -it     # 进入容器
docker stop         # 停止容器
docker rm           # 删除容器
docker images       # 查看本地镜像
相关推荐
zfj3212 小时前
Linux内核和发行版的的区别、职责
linux·运维·服务器·内核·linux发行版
qq_317620313 小时前
04:Docker-Compose完全指南
docker·容器编排·服务配置·依赖管理·多环境部署
我可以将你更新哟3 小时前
【docker】Dockerfile的编写
docker·容器
石像鬼₧魂石3 小时前
服务器安全配置自查清单(可打印版)
运维·服务器·安全
行初心3 小时前
uos基础 应用商店 查看应用程序的包名
运维
xiucai_cs4 小时前
实战:用 Claude Code 打造 AI 运维工程师
运维·人工智能
阿干tkl4 小时前
基于nginx服务文件上传及下载
运维·nginx
❀͜͡傀儡师4 小时前
docker部署orion-ops一站式智能运维管理平台
运维·docker·容器·orion-ops
闻道且行之4 小时前
Ubuntu 20.04 下 NVIDIA Tesla P40 驱动安装指南(核显桌面 + 计算卡分离方案)
linux·运维·ubuntu·nvidia·p40