https://liaoxuefeng.com/blogs/all/2022-05-24-docker
尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili
一 基础篇
1. Docker简介
2. Docker安装
3. Docker常用命令
4. Docker镜像
5. 本地镜像发布到公有云
6. 本地镜像发布到私有库
7. Docker容器数据卷
| 操作类型 |
核心命令 |
关键参数/说明 |
| 创建数据卷 |
docker volume create [卷名] |
创建命名的数据卷,便于管理 |
| 挂载数据卷 |
docker run -v [卷名]:[容器路径] ... |
将数据卷挂载到容器内指定路径 |
| 查看数据卷 |
docker volume ls, docker volume inspect [卷名] |
列出所有卷或查看详细信息 |
| 删除数据卷 |
docker volume rm [卷名] |
删除指定的数据卷 |
| 清理无用卷 |
docker volume prune |
清理所有未被容器引用的数据卷 |
| 创建方式 |
命令示例 |
特点与适用场景 |
| 创建命名卷 |
docker volume create my-data |
标准做法,便于管理和引用。Docker 会在 /var/lib/docker/volumes/下创建目录 。 |
| 运行容器时自动创建 |
docker run -v my-log:/app/logs nginx |
若 my-log卷不存在,Docker 会自动创建它 。 |
8. Docker常规安装简介
二 高级篇
1. Docker复杂安装详解
2. Dockerfile详解
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
| Dockerfile 指令 |
说明 |
| FROM |
指定基础镜像,用于后续的指令构建。 |
| MAINTAINER |
指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令) |
| LABEL |
添加镜像的元数据,使用键值对的形式。 |
| RUN |
在构建过程中在镜像中执行命令。 |
| CMD |
指定容器创建时的默认命令。(可以被覆盖) |
| ENTRYPOINT |
设置容器创建时的主要命令。(不可被覆盖) |
| EXPOSE |
声明容器运行时监听的特定网络端口。 |
| ENV |
在容器内部设置环境变量。 |
| ADD |
将文件、目录或远程URL复制到镜像中。 |
| COPY |
将文件或目录复制到镜像中。 |
| VOLUME |
为容器创建挂载点或声明卷。 |
| WORKDIR |
设置后续指令的工作目录。 |
| USER |
指定后续指令的用户上下文。 |
| ARG |
定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。 |
| ONBUILD |
当该镜像被用作另一个构建过程的基础时,添加触发器。 |
| STOPSIGNAL |
设置发送给容器以退出的系统调用信号。 |
| HEALTHCHECK |
定义周期性检查容器健康状态的命令。 |
| SHELL |
覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。 |
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 54 55 56 57 58 59 60 61 62 63 64 65 66
| FROM python:3.11-slim AS builder
LABEL maintainer="your-email@example.com" \ version="1.0" \ description="示例 Dockerfile"
ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=on
WORKDIR /app
COPY requirements.txt .
RUN apt-get update && \ apt-get install -y --no-install-recommends gcc libpq-dev && \ pip install --user -r requirements.txt && \ apt-get remove -y gcc && \ apt-get autoremove -y && \ rm -rf /var/lib/apt/lists/*
FROM python:3.11-slim AS production
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
WORKDIR /app
COPY --from=builder /root/.local /root/.local
ENV PATH="/root/.local/bin:${PATH}"
COPY . .
RUN chown -R appuser:appuser /app
USER appuser
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app.wsgi:application"]
示例: ENTRYPOINT ["nginx", "-c"] CMD ["/etc/nginx/nginx.conf"]
|
3. Docker微服务实战
4. Docker网络
5. Docker Compose容器编排
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个单独的 docker-compose.yml文件来配置应用的所有服务,使得容器编排变得简单高效。
下面我用一个表格汇总 Docker Compose 的核心概念,帮你快速建立整体认知:
| 核心概念 |
说明 |
| 服务 (Service) |
一个应用容器,实际上可以包括若干运行相同镜像的容器实例(如一个 Web 服务、一个数据库服务)。 |
| 项目 (Project) |
由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml文件中定义。 |
| 网络 (Network) |
允许你定义自定义网络,服务可以通过网络相互通信,确保容器间的隔离与连通性。 |
| 卷 (Volume) |
提供数据持久化或共享的能力,即使容器被删除,数据也会保留。 |
5.1 安装 Docker Compose
Docker Compose 可以通过多种方式安装。如果你使用的是 Docker Desktop for Mac/Windows,它已经内置了 Docker Compose。在 Linux 系统上,可以通过包管理器安装:
1 2 3 4 5 6 7 8 9
| # Ubuntu sudo apt-get update sudo apt-get install docker-compose-plugin -y[1](@ref)
# CentOS sudo yum install docker-compose-plugin -y[1](@ref)
# 验证安装 docker compose version[1](@ref)
|
5.2 实战案例
1. 项目结构
创建一个项目目录,其文件结构如下:
1 2 3 4 5
| flask-redis-counter/ ├── app.py ├── requirements.txt ├── Dockerfile └── docker-compose.yml
|
2. 编写应用代码 (app.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from flask import Flask import redis import os
app = Flask(__name__) redis_host = os.environ.get('REDIS_HOST', 'redis') redis_port = 6379 cache = redis.Redis(host=redis_host, port=redis_port)
@app.route('/') def hello(): count = cache.incr('hits') return f'Hello World! This page has been viewed {count} times.\n'
if __name__ == '__main__': app.run(host="0.0.0.0", debug=True)
|
3. 创建依赖文件 (requirements.txt)
4. 编写 Dockerfile
1 2 3 4 5 6 7
| 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"]
|
5. 编写 docker-compose.yml
这是最核心的配置文件,它定义了两个服务:web(Flask应用) 和 redis。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| version: '3.8' # 指定 Compose 文件格式版本
services: web: build: . # 使用当前目录下的 Dockerfile 构建镜像 ports: - "5000:5000" # 将容器的5000端口映射到主机的5000端口 environment: - REDIS_HOST=redis # 设置环境变量,告诉Flask应用Redis的主机名 depends_on: - redis # 表明此服务依赖于 redis 服务,会在其后启动 restart: unless-stopped # 定义容器退出时的重启策略
redis: image: "redis:alpine" # 直接使用官方的 Redis Alpine 镜像 restart: unless-stopped # 默认情况下,Redis 会在其内部使用6379端口,无需映射到主机即可被 web 服务访问
|
6. 构建并运行
在包含 docker-compose.yml文件的目录中,执行以下命令:
1 2 3 4 5
| # 启动所有服务(前台运行,便于查看日志) docker compose up
# 或,启动所有服务并进入后台运行 docker compose up -d
|
6. Docker轻量级可视化工具Portainer
7. Docker容器监控