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

6. Docker轻量级可视化工具Portainer

7. Docker容器监控

posted @ 2025-11-23 21:18  飞↑  阅读(2)  评论(0)    收藏  举报