Docker入门
发表于更新于
Docker 实战笔记
视频来源:40分钟的Docker实战攻略,一期视频精通Docker
一、Docker 简介
1.1 什么是 Docker?
Docker 是目前最成熟高效的软件部署技术,通过容器化技术给应用程序封装独立的运行环境,每个运行环境就是一个容器。
运行容器的计算机被称为 宿主机(Host)。
1 2 3 4 5 6 7 8 9 10 11
| ┌─────────────────────────────────────────────────────────┐ │ 宿主机 (Host) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ Docker 引擎 │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 容器 A │ │ 容器 B │ │ 容器 C │ │ │ │ │ │ (Nginx) │ │ (MySQL) │ │ (Redis) │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ │ 共享操作系统内核 │ └─────────────────────────────────────────────────────────┘
|
1.2 Docker vs 虚拟机
| 特性 |
Docker 容器 |
虚拟机 (VM) |
| 系统内核 |
共享宿主机内核 |
每个 VM 独立内核 |
| 启动速度 |
秒级 |
分钟级 |
| 资源占用 |
轻量(MB级) |
重量级(GB级) |
| 性能 |
接近原生 |
有虚拟化开销 |
| 隔离性 |
进程级隔离 |
系统级隔离 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Docker 架构: 虚拟机架构: ┌─────────────┐ ┌─────────────┐ │ 容器 A │ │ VM A │ │ 容器 B │ │ ┌───────┐ │ │ 容器 C │ │ │ 应用A │ │ ├─────────────┤ │ ├───────┤ │ │ Docker引擎 │ │ │ 系统A │ │ ├─────────────┤ │ └───────┘ │ │ 宿主机OS │ └─────────────┘ ├─────────────┤ ┌─────────────┐ │ 宿主机硬件 │ │ VM B │ └─────────────┘ │ ┌───────┐ │ │ │ 应用B │ │ │ ├───────┤ │ │ │ 系统B │ │ │ └───────┘ │ └─────────────┘ ┌─────────────┐ │ Hypervisor │ ├─────────────┤ │ 宿主机OS │ └─────────────┘
|
二、Docker 核心概念
2.1 镜像(Image)
镜像是容器的模板,可以理解为:
- 📦 软件安装包 → 容器就是安装出来的软件
- 🍰 模具 → 容器就是用模具做出来的糕点
- 🧬 类(Class) → 容器就是对象(Object)
1 2 3 4 5 6 7 8 9 10
| 镜像层次结构: ┌─────────────────┐ │ 应用层 │ ← 你的应用程序代码 ├─────────────────┤ │ 运行时层 │ ← Python/Node/Java ├─────────────────┤ │ 系统工具层 │ ← 依赖库、工具 ├─────────────────┤ │ 基础镜像层 │ ← Alpine/Ubuntu/CentOS └─────────────────┘
|
2.2 容器(Container)
容器是镜像的运行实例,是一个独立的运行环境。
1 2 3 4 5 6 7 8 9 10
| 同一个镜像 → 多个容器:
nginx:latest 镜像 │ ┌────┼────┐ ↓ ↓ ↓ ┌─────┐┌─────┐┌─────┐ │Web-1││Web-2││Web-3│ │:80 ││:81 ││:82 │ └─────┘└─────┘└─────┘
|
2.3 镜像仓库(Registry)
Docker 仓库是用来存放和分享镜像的地方。
1 2 3 4 5 6 7 8 9 10
| Docker Hub 工作流程:
开发者A Docker Hub 开发者B │ │ │ │ 推送镜像 │ │ │ ──────────────> │ │ │ │ │ │ │ 拉取镜像 │ │ │ <────────────── │ │ │ │
|
三、Docker 安装
3.1 Linux 安装(Ubuntu/Debian)
1 2 3 4 5 6 7 8
| curl -fsSL https://get.docker.com -o install-docker.sh
sudo sh install-docker.sh
docker --version
|
3.2 配置国内镜像源
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| sudo vi /etc/docker/daemon.json
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }
sudo service docker restart
|
3.3 Windows/Mac 安装
- 下载 Docker Desktop
- 安装并启动
- 设置 → Docker Engine → 添加镜像源配置
四、Docker 常用命令
4.1 镜像命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| docker search nginx
docker pull nginx:latest docker pull nginx:alpine
docker images
docker rmi nginx:latest
docker inspect nginx
|
4.2 容器生命周期命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
docker run nginx
docker run -d --name web -p 80:80 nginx:alpine
docker run -e MYSQL_ROOT_PASSWORD=123456 mysql
docker stop web
docker kill web
docker rm web
docker rm -f web
docker pause web
docker unpause web
|
4.3 容器操作与监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| docker ps
docker ps -a
docker ps -q
docker logs -f --tail 100 web
docker top web
docker inspect web
docker stats
docker exec -it web /bin/sh docker exec -it web /bin/bash
|
4.4 实用运维命令
1 2 3 4 5 6 7 8 9 10 11
| docker system prune -f
docker system df
docker cp web:/usr/share/nginx/html/index.html ./
docker cp ./index.html web:/usr/share/nginx/html/
|
五、Docker 网络
5.1 网络类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ┌─────────────────────────────────────────────────────────┐ │ 宿主机 │ │ ┌─────────────────────────────────────────────────┐ │ │ │ Docker 网络 │ │ │ │ │ │ │ │ ┌─────────┐ ┌─────────┐ │ │ │ │ │ bridge │ │ host │ │ │ │ │ │ (默认) │ │ (主机) │ │ │ │ │ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ │ │ ┌────┴────┐ ┌────┴────┐ │ │ │ │ │容器A │ │容器B │ │ │ │ │ │172.17.0│ │宿主机IP │ │ │ │ │ └─────────┘ └─────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘
|
| 网络类型 |
说明 |
| bridge |
默认模式,容器通过 Docker 网桥通信 |
| host |
容器使用宿主机网络栈 |
| none |
容器没有网络接口 |
| 自定义bridge |
用户创建的桥接网络,支持DNS服务发现 |
5.2 端口映射
1 2 3 4 5 6 7 8 9 10
|
docker run -d -p 8080:80 nginx
docker run -d -p 80 nginx
docker run -d -p 127.0.0.1:8080:80 nginx
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 端口映射示意图:
外部用户 │ ↓ http://宿主机IP:8080 ┌─────────────┐ │ 宿主机 │ │ 端口:8080 │ └──────┬──────┘ │ Docker 转发 ↓ ┌─────────────┐ │ 容器 │ │ 端口:80 │ │ (Nginx) │ └─────────────┘
|
5.3 自定义网络(推荐)
1 2 3 4 5 6 7 8 9 10 11 12
| docker network create my-app-network
docker network ls
docker run -d --name web --network my-app-network -p 80:80 nginx docker run -d --name db --network my-app-network mysql
docker exec -it web ping db
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 自定义网络优势:
默认 bridge 网络: 自定义 bridge 网络: ┌─────────┐ ┌─────────┐ │ 容器A │ │ 容器A │ │ IP: 172 │ │ 名称:web │◄────┐ └────┬────┘ └────┬────┘ │ │ │ │ 通过名称访问 │ 只能通过IP │ │ web → db ↓ ↓ │ ┌─────────┐ ┌─────────┐ │ │ 容器B │ │ 容器B │◄────┘ │ IP: 173 │ │ 名称:db │ └─────────┘ └─────────┘
|
六、Docker 数据持久化
6.1 数据卷(Volume)
容器是临时的,数据需要持久化保存!
1 2 3 4 5 6 7 8 9 10
| 数据卷原理:
┌─────────────┐ ┌─────────────┐ │ 容器 │ │ 宿主机 │ │ ┌───────┐ │ 挂载 │ ┌───────┐ │ │ │/data │◄─┼─────────────┼──┤/host/ │ │ │ │(临时) │ │ │ │data │ │ │ └───────┘ │ │ │(持久) │ │ └─────────────┘ │ └───────┘ │ └─────────────┘
|
6.2 挂载方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| docker run -v /host/path:/container/path nginx
docker run -d -p 80:80 -v /home/user/website:/usr/share/nginx/html nginx
docker volume create mydata
docker run -v mydata:/data mysql
docker volume ls
docker run -v /container/path nginx
|
6.3 MySQL 数据持久化实战
1 2 3 4 5 6 7 8 9 10 11 12 13
| mkdir -p /home/mysql/conf /home/mysql/data
docker run -d \ -p 3306:3306 \ -v /home/mysql/conf:/etc/mysql/conf.d \ -v /home/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --name mysql01 \ mysql:5.7
|
七、Dockerfile 构建镜像
7.1 Dockerfile 指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
FROM ubuntu:22.04
LABEL maintainer="yourname@example.com"
WORKDIR /app
RUN apt-get update && apt-get install -y python3
COPY . /app
ADD https://example.com/file.tar.gz /app/
ENV NODE_ENV=production ENV PORT=3000
EXPOSE 3000
VOLUME ["/data"]
CMD ["python3", "app.py"]
ENTRYPOINT ["python3"] CMD ["app.py"]
|
7.2 Dockerfile 示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| FROM node:18-alpine
WORKDIR /app
COPY package*.json ./ RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
|
7.3 构建镜像
1 2 3 4 5 6 7 8
| docker build -t myapp:v1 .
docker build -t myapp:v1 -f /path/to/Dockerfile .
docker history myapp:v1
|
八、Docker Compose 多容器管理
8.1 什么是 Docker Compose?
Docker Compose 用于定义和运行多容器应用,通过一个 YAML 文件配置所有服务。
1 2 3 4 5 6 7 8 9 10
| Docker Compose 架构:
docker-compose.yml │ ┌─────────┼─────────┐ ↓ ↓ ↓ ┌───────┐ ┌───────┐ ┌───────┐ │ Web │ │ DB │ │ Cache │ │(Nginx)│ │(MySQL)│ │(Redis)│ └───────┘ └───────┘ └───────┘
|
8.2 docker-compose.yml 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| version: '3.8'
services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html depends_on: - api networks: - my-network
api: build: ./api ports: - "3000:3000" environment: - NODE_ENV=production - DB_HOST=db depends_on: - db networks: - my-network
db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: myapp volumes: - db_data:/var/lib/mysql networks: - my-network
redis: image: redis:alpine networks: - my-network
volumes: db_data:
networks: my-network: driver: bridge
|
8.3 Docker Compose 命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| docker-compose up -d
docker-compose stop
docker-compose down
docker-compose down -v
docker-compose ps
docker-compose logs -f
docker-compose restart
docker-compose build
docker-compose pull
|
九、实战案例
9.1 部署 Nginx 静态网站
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| mkdir -p ~/docker/nginx/html cd ~/docker/nginx
echo "<h1>Hello Docker!</h1>" > html/index.html
docker run -d \ --name my-nginx \ -p 8080:80 \ -v $(pwd)/html:/usr/share/nginx/html \ nginx:alpine
|
9.2 部署 WordPress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| version: '3.8'
services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress
wordpress: image: wordpress:latest ports: - "8000:80" environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: - wp_data:/var/www/html depends_on: - db
volumes: db_data: wp_data:
|
十、常见问题排查
10.1 容器启动失败
1 2 3 4 5 6 7 8
| docker logs <container_id>
netstat -tuln | grep 80
docker inspect <container_id>
|
10.2 网络连接问题
1 2 3 4 5 6 7 8
| docker exec -it web ping database
docker run --dns 8.8.8.8 alpine
docker network inspect my-app-network
|
10.3 权限问题
1 2 3 4
| sudo usermod -aG docker $USER
|
十一、学习路线图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Docker 学习路线:
入门阶段 进阶阶段 高级阶段 ──────── ──────── ──────── │ │ │ ▼ ▼ ▼ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 理解核心概念 │ │ Dockerfile │ │ Docker │ │ 镜像/容器/仓库│ → │ 构建镜像 │ → │ Swarm │ ├─────────────┤ ├─────────────┤ ├─────────────┤ │ 安装 Docker │ │ Docker │ │ Kubernetes │ ├─────────────┤ │ Compose │ ├─────────────┤ │ 基础命令 │ ├─────────────┤ │ CI/CD 集成 │ │ pull/run/ps │ │ 网络配置 │ ├─────────────┤ ├─────────────┤ │ 数据卷管理 │ │ 镜像安全扫描│ │ 端口映射 │ ├─────────────┤ └─────────────┘ │ 环境变量 │ │ 多容器编排 │ └─────────────┘ └─────────────┘
|
十二、常用命令速查表
| 命令 |
说明 |
docker pull <image> |
拉取镜像 |
docker images |
查看本地镜像 |
docker rmi <image> |
删除镜像 |
docker run <image> |
运行容器 |
docker ps |
查看运行中的容器 |
docker ps -a |
查看所有容器 |
docker stop <container> |
停止容器 |
docker start <container> |
启动容器 |
docker rm <container> |
删除容器 |
docker logs <container> |
查看日志 |
docker exec -it <container> /bin/sh |
进入容器 |
docker build -t <name> . |
构建镜像 |
docker-compose up -d |
启动所有服务 |
docker-compose down |
停止并删除服务 |
参考资料
💡 提示: 本笔记基于 B站视频《40分钟的Docker实战攻略,一期视频精通Docker》整理,建议配合视频学习效果更佳!