Docker 完整教程 | 从基础到实战 (1-2)

Docker 完整教程

本教程侧重于命令实践和理解,提供可在本地环境测试的实例,每章结束都有总结要点。

目录

  1. [Docker 基础概念和安装](#Docker 基础概念和安装)
  2. [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

本章总结

在本章中,我们学习了:

  1. Docker 基本概念:了解了镜像、容器、仓库的概念和 Docker 与虚拟机的区别
  2. 安装 Docker:在不同操作系统上安装 Docker 的方法
  3. 验证安装:通过运行 hello-world 容器验证 Docker 正常工作
  4. Docker 架构:理解客户端-服务器架构模式
  5. 基础实践:运行第一个容器,体验 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 的常用命令:

  1. 镜像管理:掌握了镜像的拉取、查看、删除等操作
  2. 容器生命周期:学会了容器的创建、启动、停止、删除
  3. 容器交互:了解了如何进入容器、查看日志、复制文件
  4. 实践应用:通过 Web 服务器、数据库、Python 应用的部署加深理解
  5. 高级技巧:掌握了批量操作、资源限制、网络配置等高级用法

关键命令总结

  • docker run:创建并运行容器
  • docker ps:查看容器状态
  • docker exec:在容器中执行命令
  • docker logs:查看容器日志
  • docker stop/start/restart:控制容器状态

最佳实践

  • 为容器指定有意义的名称
  • 合理使用端口映射和数据卷
  • 定期清理未使用的容器和镜像
  • 使用资源限制防止容器占用过多资源

下一章我们将学习 Docker 网络机制,了解容器间如何通信。


相关推荐
東雪蓮☆2 小时前
Dockerfile 镜像构建实战
linux·运维·docker
未来之窗软件服务3 小时前
操作系统应用开发(十四)RustDesk服务器配置——东方仙盟筑基期
运维·服务器·远程桌面·rustdesk·仙盟创梦ide·东方仙盟
東雪蓮☆4 小时前
Docker 资源限制与性能优化(CPU / 内存 / IO 管控实战)
linux·运维·docker
爱码社长4 小时前
centos8安装docker【新】
运维·docker·容器
ms72wx5 小时前
拥抱终端:Linux 新手命令行入门指南
linux·运维·服务器
東雪蓮☆5 小时前
容器生命周期与管理策略
linux·运维·docker
wheeldown6 小时前
【Linux】Linux管道与进程池深度解析:从原理到实战
linux·运维·服务器
数字化顾问7 小时前
探索 Docker/K8s 部署 MySQL 的创新实践与优化技巧——容器化部署深度解析
docker
熙客7 小时前
DevOps简介
运维·devops