1.1 Docker 概述
1.1.1 Docker 的概念
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项打包到一个轻量级、可移植的容器中,然后可以在任何支持 Docker 的环境中运行。
三大核心组件:
-
镜像 (Image)
- 只读的模板,包含运行容器所需的文件系统
- 类似于面向对象编程中的"类"
- 采用分层存储结构
-
容器 (Container)
- 镜像的运行实例
- 类似于面向对象编程中的"对象"
- 可以被创建、启动、停止、删除、暂停
-
仓库 (Registry)
- 集中存储和分发镜像的服务
- Docker Hub 是最大的公共仓库
- 可以搭建私有仓库
关系类比:
镜像 : 容器 = 程序 : 进程 = 类 : 对象
1.2 Docker 安装
1.2.1 Windows 安装
系统要求:
- Windows 10 64位:专业版、企业版或教育版(Build 19041或更高版本)
- Windows 11 64位
- 启用 Hyper-V 和 WSL 2
安装步骤:
-
下载 Docker Desktop
- 访问:https://www.docker.com/products/docker-desktop
- 下载 Windows 版本
-
启用 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 -
安装 Docker Desktop
- 双击安装包,按照向导安装
- 勾选"Use WSL 2 instead of Hyper-V"
- 重启电脑
-
验证安装
powershelldocker --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 安装
安装步骤:
-
下载 Docker Desktop for Mac
-
双击
.dmg文件,将 Docker 拖到 Applications 文件夹 -
启动 Docker Desktop,按照向导完成设置
-
验证安装:
bashdocker --version docker run hello-world
1.2.4 配置国内镜像加速器
为什么需要镜像加速?
- Docker Hub 在国外,下载镜像速度慢
- 使用国内镜像源可以大幅提升速度
常用国内镜像源:
- 阿里云:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
- 腾讯云:https://mirror.ccs.tencentyun.com
- 网易云:http://hub-mirror.c.163.com
- Docker中国:https://registry.docker-cn.com
配置方法(Docker Desktop):
- 打开 Docker Desktop
- 进入 Settings → Docker Engine
- 修改配置文件:
json
{
"registry-mirrors": [
"https://your-mirror-url.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
- 点击 "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
执行过程分析:
- Docker客户端联系Docker守护进程
- Docker守护进程从Docker Hub拉取"hello-world"镜像
- Docker守护进程从该镜像创建一个新容器
- 容器运行可执行文件产生输出
- Docker守护进程将输出流式传输到Docker客户端
- 容器执行完毕自动停止
输出示例:
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 # 查看本地镜像