
Docker 完整教程
本教程侧重于命令实践和理解,提供可在本地环境测试的实例,每章结束都有总结要点。
目录
- [Docker 基础概念和安装](#Docker 基础概念和安装)
- [Docker 常用命令实践](#Docker 常用命令实践)
本篇介绍 Docker 的基础概念和常用命令,在 csdn 侧边栏根据需要点击目录进行跳转。
第1章:Docker 基础概念和安装
1.1 什么是 Docker
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个轻量级、可移植的容器中。
核心概念
- 镜像 (Image):只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件
- 容器 (Container):镜像的运行实例,是一个独立的进程
- 仓库 (Repository):存储镜像的地方,如 Docker Hub
Docker vs 虚拟机
特性 | Docker 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
资源占用 | 低 | 高 |
隔离级别 | 进程级 | 操作系统级 |
移植性 | 高 | 中等 |
1.2 Docker 安装
方法1:进入官网,下载 Docker Desktop。
macOS 可以使用 Homebrew 安装:
bash
brew install --cask docker
Linux (Ubuntu) 安装
bash
# 更新包索引
sudo apt-get update
sudo apt install docker.io -y
# 将当前用户添加到 docker 组(避免每次使用 sudo)
sudo usermod -aG docker $USER
1.3 验证安装
bash
# 检查 Docker 版本
docker --version
# 查看 Docker 系统信息
docker info
# 运行 Hello World 容器
# docker run hello-world
1.4 Docker 架构
Docker 使用客户端-服务器架构:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Docker │ │ Docker │ │ Docker │
│ Client │───▶│ Daemon │───▶│ Registry │
│ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
- Docker Client:用户与 Docker 交互的主要方式
- Docker Daemon:监听 Docker API 请求并管理 Docker 对象
- Docker Registry:存储 Docker 镜像的服务
1.5 实践练习
练习1:检查 Docker 状态
bash
# 查看 Docker 服务状态
docker version
# 查看当前运行的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 查看本地镜像
docker images
练习2:运行第一个容器
bash
# 运行一个简单的 Ubuntu 容器
docker run -it ubuntu:20.04 /bin/bash
# 在容器内执行命令
echo "Hello from inside Docker container!"
cat /etc/os-release
# 退出容器
exit
练习3:后台运行容器
bash
# 后台运行一个 nginx 服务器
docker run -d --name my-nginx -p 8080:80 nginx
# 检查容器状态
docker ps
# 在浏览器中访问 http://localhost:8080
# 停止容器
docker stop my-nginx
# 删除容器
docker rm my-nginx
1.6 常见问题排查
权限问题:
bash
# 如果遇到权限错误,确保用户在 docker 组中
groups $USER
# 如果没有 docker 组,重新登录或执行
newgrp docker
服务未启动:
bash
# Linux 系统启动 Docker 服务
sudo systemctl start docker
# 检查服务状态
sudo systemctl status docker
本章总结
在本章中,我们学习了:
- Docker 基本概念:了解了镜像、容器、仓库的概念和 Docker 与虚拟机的区别
- 安装 Docker:在不同操作系统上安装 Docker 的方法
- 验证安装:通过运行 hello-world 容器验证 Docker 正常工作
- Docker 架构:理解客户端-服务器架构模式
- 基础实践:运行第一个容器,体验 Docker 的基本操作
关键要点:
- Docker 容器比虚拟机更轻量、启动更快
- 容器是镜像的运行实例
- 通过
docker run
命令可以快速启动容器 - 容器具有良好的隔离性和可移植性
下一章我们将深入学习 Docker 的常用命令,掌握容器的生命周期管理。
第2章:Docker 常用命令实践
2.1 镜像管理命令
拉取镜像
bash
# 拉取最新版本镜像
docker pull nginx
# 拉取指定版本镜像
docker pull nginx:1.21
# 从指定仓库拉取
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx
查看镜像
bash
# 列出本地所有镜像
docker images
# 查看镜像详细信息
docker inspect nginx
# 查看镜像历史
docker history nginx
# 搜索镜像
docker search python
删除镜像
bash
# 删除指定镜像
docker rmi nginx:latest
# 删除多个镜像
docker rmi nginx redis mysql
# 强制删除镜像
docker rmi -f nginx
# 删除所有未使用的镜像
docker image prune
2.2 容器生命周期管理
创建和启动容器
bash
# 运行容器(如果镜像不存在会自动拉取)
docker run nginx
# 后台运行容器
docker run -d nginx
# 指定容器名称
docker run -d --name my-nginx nginx
# 端口映射
docker run -d -p 8080:80 --name web-server nginx
# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql
# 交互式运行
docker run -it ubuntu:20.04 /bin/bash
查看容器
bash
# 查看运行中的容器
docker ps
# 查看所有容器(包括停止的)
docker ps -a
# 查看容器详细信息
docker inspect container_name
# 查看容器资源使用情况
docker stats # [container_name]
# 查看容器进程
docker top container_name
停止和删除容器
bash
# 停止容器
docker stop container_name
# 强制停止容器
docker kill container_name
# 重启容器
docker restart container_name
# 删除容器
docker rm container_name
# 强制删除运行中的容器
docker rm -f container_name
# 删除所有停止的容器
docker container prune
2.3 容器交互命令
进入容器
bash
# 在运行的容器中执行命令
docker exec -it container_name /bin/bash
# 执行单个命令
docker exec container_name ls -la
# 以 root 用户身份进入
docker exec -it --user root container_name /bin/bash
文件操作
bash
# 从容器复制文件到主机
docker cp container_name:/path/to/file /host/path/
# 从主机复制文件到容器
docker cp /host/path/file container_name:/path/to/
# 查看容器文件系统变化
docker diff container_name
日志查看
bash
# 查看容器日志
docker logs container_name
# 实时查看日志
docker logs -f container_name
# 查看最近的日志
docker logs --tail 100 container_name
# 查看指定时间的日志
docker logs --since "2023-01-01" container_name
2.4 实践练习
练习1:部署 Web 服务器
bash
# 创建一个临时目录用于练习
mkdir -p /tmp/docker-tutorial
cd /tmp/docker-tutorial
# 创建一个简单的 HTML 文件
cat > index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<title>My Docker Web Server</title>
</head>
<body>
<h1>Hello from Docker!</h1>
<p>This is served by nginx running in a Docker container.</p>
</body>
</html>
EOF
# 运行 nginx 容器并挂载 HTML 文件
docker run -d \
--name my-web-server \
-p 8080:80 \
-v $(pwd):/usr/share/nginx/html \
nginx
# 测试访问
curl http://localhost:8080
# 查看容器状态
docker ps
# 查看日志
docker logs my-web-server
# 清理
docker stop my-web-server
docker rm my-web-server
练习2:数据库容器
bash
# 运行 MySQL 容器
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
mysql:8.0
# 等待数据库启动
sleep 30
# 连接到数据库
docker exec -it mysql-db mysql -uroot -pmypassword
# 在 MySQL 中执行命令
# SHOW DATABASES;
# USE testdb;
# CREATE TABLE users (id INT, name VARCHAR(50));
# INSERT INTO users VALUES (1, 'Alice');
# SELECT * FROM users;
# EXIT;
# 从外部连接数据库(如果安装了 mysql 客户端)
# mysql -h 127.0.0.1 -P 3306 -uroot -pmypassword
# 清理
docker stop mysql-db
docker rm mysql-db
练习3:Python 应用容器
bash
# 创建 Python 应用目录
mkdir python-app
cd python-app
# 创建 Python 应用
cat > app.py << 'EOF'
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f"Hello from Python app running in Docker!<br>Container ID: {os.uname().nodename}"
@app.route('/health')
def health():
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
# 创建 requirements.txt
echo "Flask==2.3.3" > requirements.txt
# 运行 Python 容器
docker run -d \
--name python-app \
-p 5000:5000 \
-v $(pwd):/app \
-w /app \
python:3.11-slim \
bash -c "pip install -r requirements.txt && python app.py"
# 等待应用启动
sleep 10
# 测试应用
curl http://localhost:5000
curl http://localhost:5000/health
# 查看日志
docker logs python-app
# 清理
docker stop python-app
docker rm python-app
cd ..
2.5 高级命令技巧
批量操作
bash
# 停止所有运行的容器
docker stop $(docker ps -q)
# 删除所有停止的容器
docker rm $(docker ps -aq)
# 删除所有镜像
docker rmi $(docker images -q)
# 系统清理(删除未使用的容器、网络、镜像)
docker system prune
# 完全清理(包括数据卷)
docker system prune -a --volumes
资源限制
bash
# 限制内存使用
docker run -d --memory="512m" nginx
# 限制 CPU 使用
docker run -d --cpus="1.5" nginx
# 限制 CPU 和内存
docker run -d --memory="1g" --cpus="2" nginx
# 查看资源使用情况
docker stats
网络配置
bash
# 指定网络模式
docker run -d --network host nginx
# 创建自定义网络
docker network create my-network
# 在自定义网络中运行容器
docker run -d --network my-network --name app1 nginx
docker run -d --network my-network --name app2 nginx
# 容器间可以通过名称通信
docker exec app1 ping app2
关于网络机制,这里有很多细节需要展开,我们在 第3章 中详细讲解。
2.6 常见问题和解决方案
端口冲突
bash
# 查看端口占用
sudo netstat -tulpn | grep :8080
# 使用不同端口
docker run -d -p 8081:80 nginx
容器无法启动
bash
# 查看详细错误信息
docker logs container_name
# 检查容器配置
docker inspect container_name
# 以交互模式调试
docker run -it image_name /bin/bash
镜像拉取失败
bash
# 使用国内镜像源
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx
# 配置镜像加速器(编辑 /etc/docker/daemon.json)
{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com"
]
}
本章总结
在本章中,我们深入学习了 Docker 的常用命令:
- 镜像管理:掌握了镜像的拉取、查看、删除等操作
- 容器生命周期:学会了容器的创建、启动、停止、删除
- 容器交互:了解了如何进入容器、查看日志、复制文件
- 实践应用:通过 Web 服务器、数据库、Python 应用的部署加深理解
- 高级技巧:掌握了批量操作、资源限制、网络配置等高级用法
关键命令总结:
docker run
:创建并运行容器docker ps
:查看容器状态docker exec
:在容器中执行命令docker logs
:查看容器日志docker stop/start/restart
:控制容器状态
最佳实践:
- 为容器指定有意义的名称
- 合理使用端口映射和数据卷
- 定期清理未使用的容器和镜像
- 使用资源限制防止容器占用过多资源
下一章我们将学习 Docker 网络机制,了解容器间如何通信。