2024-09-04-Wed-T-Docker
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指令。 |
# 基础镜像阶段:使用官方 Python 轻量版本作为构建和运行基础
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
# 复制依赖文件清单(优先复制以利用 Docker 缓存层)
COPY requirements.txt .
# 安装系统依赖和 Python 依赖(合并 RUN 指令减少层数)
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
# 切换用户(从 root 切换到非特权用户)
USER appuser
# 声明容器运行时暴露的端口(仅为文档说明作用)
EXPOSE 8000
# 健康检查(定期检测应用是否健康)
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
# 容器启动命令(使用 exec 格式)
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app.wsgi:application"]
# 可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
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 系统上,可以通过包管理器安装:
# 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. 项目结构
创建一个项目目录,其文件结构如下:
flask-redis-counter/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
2. 编写应用代码 (app.py)
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)
flask
redis
4. 编写 Dockerfile
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。
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文件的目录中,执行以下命令:
# 启动所有服务(前台运行,便于查看日志)
docker compose up
# 或,启动所有服务并进入后台运行
docker compose up -d

浙公网安备 33010602011771号