docker 自用手册

问题

用id删除镜像,报错Error response from daemon: No such image: 15e:latest

原因就在于,我也不知道。其他镜像并没有以15e开头,反正不知道为什么。

但是解决办法就是,多输几位ID,实在不行就直接名称删除。我反正是多加了两位,就可以删除了。

顶级volumes挂载,但配置不正确

volumes:
  mediawiki-db:/home/MediaWiki/mariadb

我本来以为是将mediawiki本地的目录作为路径添加到mediawiki-db,然后服务进行引用。但结果配置不通过。

原因:
卷名: 卷配置(键值对映射),顶级volumes是直接映射到容器之中,并不是将路径赋值到mediawiki-db。
也就是格式不正确!

修改:
方案一:修改顶级volumes,定义绑定到主机目录,格式等同数据卷配置跳转

方案二:修改服务机volumes
services:
  db:
    # ...其他配置...
    # 直接绑定挂载主机目录到容器路径(无需顶级 volumes)
    volumes:
      - type: bind  # 挂载类型为绑定
        source: /home/MediaWiki/mariadb  # 主机目录(需提前创建)
        target: /var/lib/mysql  # 容器内路径
        read_only: false  # 可选:是否只读(默认 false)

note:如果需要自定义目录,需要提前创建。当然通过命令卷,可交由docker自动管理存储,位置/var/lib/docker/volumes/mediawiki-db

数据库 Installation of system tables failed! 解决失败!!!

结论:基本上就是docker-compose.yml healthcheck 和depends_on 多余的问题,当然除了mysql uid和gid是999,删除数据库服务的user配置外。

✘ Container mediawiki-db Error

dependency failed to start: container mediawiki-db is unhealthy

错误日志
2025-11-20 12:39:23+00:00 [Note] [Entrypoint]: Entrypoint script for MariaDB Server 1:11.2.6+maria~ubu2204 started.
2025-11-20 12:39:23+00:00 [Note] [Entrypoint]: Initializing database files
2025-11-20 12:39:23 0 [Warning] Can't create test file '/var/lib/mysql/190180286ed9.lower-test' (Errcode: 13 "Permission denied")
2025-11-20 12:39:23 0 [ERROR] mariadbd: Can't create/write to file './ddl_recovery.log' (Errcode: 13 "Permission denied")
2025-11-20 12:39:23 0 [ERROR] DDL_LOG: Failed to create ddl log file: ./ddl_recovery.log
2025-11-20 12:39:23 0 [ERROR] Aborting

Installation of system tables failed!  Examine the logs in
/var/lib/mysql/ for more information.

解决办法:
确认.env文件中的MW_DOCKER_UID=1000,MW_DOCKER_GID=1000 是否与主机的用户权限一致。
确认挂载的目录文件夹是否拥有读写权限,执行

# 修改目录所有者为容器用户(UID=1000,GID=1000)
sudo chown -R 1000:1000 /home/MediaWiki/mariadb

# 设置目录权限为可读写执行(容器需要写入权限)
sudo chmod -R 755 /home/MediaWiki/mariadb

十分重要:
docker ps 查看之前的容器id和名称
然后docker rm -f id
然后重新启动 docker compose up -d

mariadbd: Can't create/write to file './ddl_recovery.log' (Errcode: 13 "Permission denied")

紧接上一个错误,

点击查看代码
2025-11-20 13:18:28 0 [Note] Starting MariaDB 11.2.6-MariaDB-ubu2204 source revision 67c0fd2a41034eae1ea04b81cace6a154783aedd server_uid ueAbA3cm/S9Osbbrt4Q4IKX4nDg= as process 1
2025-11-20 13:18:28 0 [ERROR] mariadbd: Can't create/write to file './ddl_recovery.log' (Errcode: 13 "Permission denied")
2025-11-20 13:18:28 0 [ERROR] DDL_LOG: Failed to create ddl log file: ./ddl_recovery.log
sudo rm -rf /home/mediaWiki/mariadb # 因为先前的尝试过程中,里面已经写入了文件。删除重建
mkdir /home/mediaWiki/mariadb
# 1. 停止并删除旧容器(避免残留进程占用目录)
docker compose down -v  # 清理旧卷(谨慎!会删除数据)
# 或仅删除容器(保留数据):docker rm -f mediawiki-db

# 2. 重置主机目录权限(关键!)
sudo chown -R 1000:1000 /home/mediaWiki/mariadb  # 假设容器用户是 1000:1000
sudo chmod -R 775 /home/mediaWiki/mariadb       # 开放读写执行权限(组可写)

# 3. 验证目录权限(需 root 权限查看)
ls -ld /home/mediaWiki/mariadb
# 预期输出:drwxrwxr-x 2 1000 1000 4096 Nov 20 13:00 /home/mediaWiki/mariadb
又报错
Installation of system tables failed!  Examine the logs in
/var/lib/mysql/ for more information.

The problem could be conflicting information in an external
my.cnf files. You can ignore these by doing:

    shell> /usr/bin/mariadb-install-db --defaults-file=~/.my.cnf

You can also try to start the mariadbd daemon with:

    shell> /usr/sbin/mariadbd --skip-grant-tables --general-log &

and use the command line tool /usr/bin/mariadb
to connect to the mysql database and look at the grant tables:

    shell> /usr/bin/mariadb -u root mysql
    MariaDB> show tables;

Try '/usr/sbin/mariadbd --help' if you have problems with paths.  Using
--general-log gives you a log in /var/lib/mysql/ that may be helpful.

The latest information about mariadb-install-db is available at
https://mariadb.com/kb/en/installing-system-tables-mysql_install_db
You can find the latest source at https://downloads.mariadb.org and
the maria-discuss email list at https://launchpad.net/~maria-discuss

Please check all of the above before submitting a bug report
at https://mariadb.org/jira

换方案了!放弃自定义目录,然而还是报同样的错误

不得不继续搞啊!
解决办法:
移除数据库服务的user,删除类似于下面的一行。
user: "${MW_DOCKER_UID:-1000}:${MW_DOCKER_GID:-1000}" # 与 MediaWiki 服务用户一致(避免权限问题)
因为MariaDB镜像默认以mysql用户(UID 999)运行,与自定义UID冲突。

继续报错

但查询AI后,表示创建成功,只是healthcheck没有通过,docker ps后,又只是上了一个mariadb,其他容器都是created状态,说明启动失败了。

说明healthcheck有问题,而且depends_on也莫名奇妙。这ai写的yml配置文件智障了。早知道还不如直接pull mediawiki了,还用得着docker compose搞!

删除healthcheck,和无关的depends_on后,启动成功。

备忘录

ubuntu安装

依照docker官网的步骤,安装docker engine,docker compose也会被安装。

Docker Compose YAML

数组/列表:使用短横线
字符串:通常不需要引号,除非包含特殊字符,包括空格

yml结构

点击查看代码
# 版本声明(新版本已逐渐弃用,但建议保留)
version: '3.8'

# 服务定义 - 核心部分
services:
  web-service:
    # 服务配置...

  database:
    # 服务配置...

# 网络配置
networks:
  custom-network:
    # 网络配置...

# 数据卷配置
volumes:
  db-data:
    # 卷配置...

# 配置项(高级功能)
configs:
  app-config:
    # 配置内容...

# 密钥管理(敏感信息)
secrets:
  db-password:
    # 密钥配置...

服务定义

点击查看代码
services:
  app:
    # 方式1:直接使用镜像
    image: nginx:1.25-alpine

    # 方式2:从 Dockerfile 构建
    build:
      context: .                    # 构建上下文路径
      dockerfile: Dockerfile.prod   # 指定 Dockerfile
      args:                         # 构建参数
        BUILD_ENV: production
      labels:                       # 构建时标签
        - "version=1.0"

    # 方式3:使用现有镜像并指定平台
    image: mysql:8.0
    platform: linux/amd64

app是自定义的名称,一般采取项目名称,例如web 和 database这种。

容器配置

点击查看代码
services:
  web:
    image: nginx
    container_name: my-nginx        # 自定义容器名(否则自动生成)
    hostname: web-server           # 容器主机名
    domainname: example.local      # 域名
    restart: unless-stopped        # 重启策略:no, always, on-failure, unless-stopped
    
    # 特权模式和安全配置
    privileged: false              # 特权容器(谨慎使用)
    cap_add:                       # 添加 Linux 能力
      - NET_ADMIN
    cap_drop:                      # 移除 Linux 能力
      - SYS_ADMIN
    security_opt:                  # 安全选项
      - seccomp:unconfined

restart:no, always, on-failure, unless-stopped

no 默认值,容器退出后不会自动重启。
always 无论容器因何退出(包括手动停止),都会无限次尝试重启。(除非使用 docker stop 停止容器,否则会一直重启)
on-failure 仅在容器以非零状态码退出时重启。可指定最大重试次数(如 on-failure:3 表示最多尝试重启3次)。
unless-stopped 类似always,但如果容器被手动停止(docker stop),则不会自动重启,直到 Docker 服务重启(如宿主机重启后)。

端口映射

点击查看代码
services:
  web:
    image: nginx
    ports:
      # 基础格式:主机端口:容器端口
      - "80:80"
      - "443:443"
      
      # 高级格式
      - "8080-8090:8000-8010"     # 端口范围映射
      - "9000:80/udp"             # UDP 端口
      - "127.0.0.1:3000:3000"     # 绑定特定 IP
      - "8443:443"                # 只绑定主机端口,容器端口自动选择
      
      # 长格式(Compose 2.2+)
      - target: 80                # 容器端口
        published: 8080           # 主机端口
        protocol: tcp             # 协议
        mode: host                # 模式:host 或 ingress

环境变量配置

点击查看代码
services:
  app:
    image: node:18
    environment:
      # 方式1:键值对
      NODE_ENV: production
      DATABASE_URL: postgresql://user:pass@db:5432/app
      
      # 方式2:数组格式
      - DEBUG=1
      - API_KEY=secret123
      
    # 方式3:从文件加载(推荐用于敏感信息)
    env_file:
      - .env                      # 默认加载 .env 文件
      - database.env             # 指定多个环境文件
      
    # 方式4:使用 shell 环境变量
    environment:
      - HOST_IP=${HOST_IP:-localhost}  # 默认值语法
环境变量传递​ 配置信息,将原本硬编码在应用中的参数(如数据库地址、管理员密码)提取为外部变量,通过 Docker 统一管理并注入容器。让不同容器/服务知晓如何连接、协作或初始化。其核心逻辑是:将关键参数(如数据库密码、端口、语言)以环境变量的形式注入容器,应用程序读取这些变量来配置自身行为。

Docker 环境变量的本质是:将配置信息以环境变量的形式注入容器,应用程序读取这些变量来调整自身行为。

.env文件内容(存储敏感/通用配置)
MW_DOCKER_UID=1000
MW_DOCKER_GID=986

数据卷和挂载

点击查看代码
services:
  app:
    image: nginx
    volumes:
      # 类型1:绑定挂载(主机路径:容器路径)
      - ./html:/usr/share/nginx/html:ro  # :ro 只读,:rw 读写
      - /var/log/nginx:/var/log/nginx

      # 类型2:命名卷(自动创建)
      - db_data:/var/lib/mysql
      - app_logs:/app/logs

      # 类型3:匿名卷(临时)
      - /tmp

      # 类型4:只读配置文件
      - type: bind
        source: ./config/nginx.conf
        target: /etc/nginx/nginx.conf
        read_only: true

      # 类型5:tmpfs(内存文件系统)
      - type: tmpfs
        target: /tmp
        tmpfs:
          size: 100000000  # 100MB

Docker 挂载卷是容器数据持久化和共享的核心机制,属于容器间数据交换的方式之一, 跳转到Docker协作机制

类型 说明 适用场景
绑定挂载(Bind Mount) 将宿主机目录/文件直接挂载到容器 开发环境、配置文件
命名卷(Named Volume) Docker 管理的持久化数据卷 生产环境、数据库数据
匿名卷(Anonymous Volume) 自动创建的临时卷 缓存、临时数据

note:
绑定挂载(如 ./host/path:/container/path):需手动创建主机目录

# 绑定挂载
docker run -v /宿主机路径:/容器路径:选项 镜像名

# 命名卷
docker run -v 卷名:/容器路径:选项 镜像名

# 匿名卷
docker run -v /容器路径 镜像名

选项:
# Z: 共享挂载 (SELinux)
# z: 私有挂载 (SELinux)
# delegated: 委托挂载 (性能优化)
# cached: 缓存挂载 (性能优化)
# consistent: 一致性挂载 (macOS/Windows)
# :ro 只读,:rw 读写
# :driver=local指定卷驱动

资源限制

点击查看代码
services:
  app:
    image: node:18
    deploy:  # 适用于 swarm 模式
      resources:
        limits:
          cpus: '0.50'          # CPU 限制(0.5 核)
          memory: 512M          # 内存限制
        reservations:
          cpus: '0.25'
          memory: 128M
    
    # 非 swarm 模式的资源限制
    cpus: 0.5
    mem_limit: 512m
    mem_reservation: 128m

扩展配置(Swarm 模式)

点击查看代码
services:
  web:
    image: nginx
    deploy:
      mode: replicated           # 或 global(每个节点一个实例)
      replicas: 3               # 副本数量
      placement:
        constraints:
          - node.role == manager
      update_config:
        parallelism: 2          # 同时更新的容器数
        delay: 10s              # 更新间隔
        order: start-first      # 或 stop-first
      rollback_config:
        parallelism: 1
        delay: 5s
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
      endpoint_mode: vip        # 或 dnsrr

健康检查

点击查看代码
services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]  # 检查命令
      # test: ["CMD-SHELL", "pg_isready -U postgres"]  # PostgreSQL 示例
      interval: 30s        # 检查间隔
      timeout: 10s        # 超时时间
      retries: 3          # 重试次数
      start_period: 40s   # 启动等待时间
      start_interval: 5s  # 启动期间检查间隔

健康检查(Healthcheck)可以取消,尤其是healthcheck编写的有问题时,明明正确启动了,但是因为healthcheck没有通过,导致其他服务没有启动。

依赖关系和启动顺序

点击查看代码
services:
  web:
    image: nginx
    depends_on:
      - database
      - cache
    # 条件依赖(Compose 2.1+)
    depends_on:
      database:
        condition: service_healthy  # 等待健康检查通过
      cache:
        condition: service_started  # 等待服务启动

condition: service_healthy,名称service_healthy是固定的。

日志配置

点击查看代码
services:
  app:
    image: node:18
    logging:
      driver: json-file          # 日志驱动:json-file, syslog, journald, none
      options:
        max-size: 10m           # 单个日志文件最大大小
        max-file: 3             # 保留的日志文件数
      # syslog 示例
      # driver: syslog
      # options:
      #   syslog-address: "tcp://192.168.0.42:123"

网络配置

可以为容器单独设置网络,也可以为所有的容器设置默认网络。

点击查看代码
services:
  web:
    image: nginx
    networks:
      # 连接到默认网络
      - default
      
      # 连接到自定义网络
      - frontend
      - backend
      
      # 高级网络配置
      frontend:
        aliases:                 # 网络别名(DNS)
          - webapp
          - www.example.com
        ipv4_address: 172.20.0.10  # 固定 IP

networks:
  # 默认网络配置
  default:
    driver: bridge
    
  # 自定义网络
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 1500
    ipam:
      config:
        - subnet: 172.20.0.0/24
          gateway: 172.20.0.1
          
  backend:
    external: true              # 使用外部网络
    name: production-backend

配置和密钥管理

点击查看代码
services:
  app:
    image: nginx
    configs:
      - nginx-config            # 使用配置
    secrets:
      - db-password             # 使用密钥

configs:
  nginx-config:
    file: ./nginx.conf          # 从文件创建
    # 或直接定义内容
    # content: |
    #   server {
    #     listen 80;
    #   }

secrets:
  db-password:
    file: ./db_password.txt     # 从文件读取
    # 或直接定义(不推荐,会暴露在文件中)
    # environment: DB_PASSWORD

数据卷配置

顶级volumes

# 顶级 volumes:定义命名卷(绑定到主机目录)
volumes:
  mediawiki-db:  # 卷名
    driver: local  # 使用本地存储驱动
    driver_opts:
      type: none    # 绑定挂载类型(直接映射主机目录)
      o: bind       # 绑定选项
      device: /home/MediaWiki/mariadb  # 主机目录(需提前创建)

在 Docker 的顶级 volumes配置中,o(options的缩写)仅支持 bind这一个值,用于明确挂载类型为“绑定挂载”(直接映射主机目录到容器路径)。

系统管理命令

docker system df​

查看 Docker 磁盘使用情况
docker system df

docker system prune​

清理无用数据
-a:包括所有未使用的镜像
--volumes:包括数据卷
-f:强制清理
docker system prune -a --volumes -f

docker info​

显示 Docker 系统信息
docker info

包括版本、compose、插件等等的信息,某种意义上可以直接取代version命令

docker version​

显示 Docker 版本信息
docker version

docker login​

登录到 Docker 仓库
docker login

docker logout​

从 Docker 仓库登出
docker logout

镜像管理

docker images

列出本地镜像
-a:显示所有镜像(包括中间层)
-q:只显示镜像ID

从 Docker Hub 搜索镜像
--limit:限制结果数量
--filter:过滤结果

docker tag​

给镜像打标签

docker history​

查看镜像构建历史

docker pull

下载镜像
-a:下载所有标签的镜像

docker push​

上传镜像到仓库

docker build​

从 Dockerfile 构建镜像
-t:给镜像打标签
-f:指定 Dockerfile 路径

docker save​

将镜像保存为 tar 文件
-o:输出文件
docker save -o nginx.tar nginx

docker load​

从 tar 文件加载镜像
-i:输入文件
docker load -i nginx.tar

docker rmi​

删除镜像
-f:强制删除

docker Compose 命令

Docker 的核心命令之一,用于管理和编排多容器应用。它通过读取 docker-compose.yml文件来定义和运行一组服务。

docker compose up​

创建并启动所有服务
-d:后台运行
--build:重新构建镜像
docker compose up -d

docker compose down​

停止并删除所有容器
-v:同时删除数据卷
--rmi all:删除镜像

# 默认情况下,它不会删除数据卷(Volume)和数据镜像(Image)。这意味着你的数据库数据、配置文件等会被保留,下次执行 docker compose up时会重新使用。
docker compose down

# 停止并删除容器、网络,同时删除 Compose 文件在 ‘volumes’ 部分声明的所有数据卷
# 这个操作是毁灭性的!所有数据库数据、应用程序生成的文件等都会被永久删除,无法恢复。
docker compose down -v

docker compose ps​

列出所有服务的容器状态
docker compose ps

docker compose logs​

查看所有服务的日志
-f:实时跟踪
docker compose logs -f

docker compose exec​

在服务容器中执行命令
docker compose exec web bash

docker compose build​

构建或重新构建服务镜像

docker compose restart​

重启服务

docker compose stop​

停止服务

docker compose config

检查docker-compose.yml是否正确

容器生命周期管理

docker run​

创建并启动容器
-d:后台运行
-p:端口映射
-v:数据卷挂载
--name:容器命名
-it:交互式终端

docker run -d -p 80:80 --name webserver nginx

docker create​

创建容器但不启动
同 docker run
docker create --name mycontainer nginx

docker start​

启动已停止的容器

docker stop​

停止运行中的容器
-t:超时时间(秒)

docker restart​

重启容器

docker pause​

暂停容器所有进程

docker unpause​

恢复暂停的容器

docker rm​

删除容器
-f:强制删除运行中的容器
-v:同时删除关联卷

docker exec​

在运行中的容器内执行命令
-it:交互式终端
-e:设置环境变量
docker exec -it mycontainer bash

docker attach​

连接到运行中的容器
docker attach mycontainer

容器信息查看

docker ps​

列出容器
-a:显示所有容器
-q:只显示容器ID
docker ps -a

docker logs​

查看容器日志
-f:实时跟踪
--tail:显示最后几行
-t:显示时间戳
docker logs -f mycontainer

docker inspect​

查看容器/镜像的详细信息
docker inspect mycontainer

docker stats​

实时显示容器资源使用情况

查看容器资源使用情况

docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

docker top​

查看容器内运行的进程
docker top mycontainer

docker diff​

查看容器文件系统变化
docker diff mycontainer

docker port​

查看容器端口映射
docker port mycontainer

数据管理

docker volume create​

创建数据卷
docker volume create myvolume

docker volume ls​

列出数据卷
docker volume ls

docker volume inspect​

查看数据卷详细信息
docker volume inspect myvolume

docker volume rm​

删除数据卷
docker volume rm myvolume

docker volume prune​

删除所有未使用的数据卷
docker volume prune

docker cp​

在容器和宿主机间复制文件
docker cp file.txt mycontainer:/path/

网络管理

docker network ls​

列出网络
docker network ls

docker network create​

创建网络
--driver:网络驱动
docker network create mynetwork

docker network connect​

将容器连接到网络
docker network connect mynetwork mycontainer

docker network disconnect​

将容器从网络断开
docker network disconnect mynetwork mycontainer

docker network inspect​

查看网络详细信息
docker network inspect mynetwork

docker network prune​

删除所有未使用的网络
docker network prune

实用命令组合示例

清理容器

一键清理所有无用资源
docker system prune -a --volumes -f

批量停止所有容器
docker stop $(docker ps -aq)

批量删除所有容器
docker rm -f $(docker ps -aq)

批量删除所有镜像
docker rmi -f $(docker images -aq)

清理旧卷
docker compose down -v

更新yml文件,重启容器

docker compose config 检查yml配置是否正确

仅修改配置(环境变量、端口、卷等,未改镜像)
docker compose up -d --force-recreate
或者
docker compose down 停止并删除旧容器(保留卷和网络)
docker compose up -d 用新配置重新创建并启动容器

修改了镜像(如升级基础镜像或应用镜像)
docker compose pull 拉取所有服务的最新镜像(根据 yml 中的 image 字段)
docker compose up -d --force-recreate

其他配置

无需sudo使用 配置

# 如果不存在,创建 docker 组
sudo groupadd docker
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 方法2:使用 newgrp 命令(立即生效,但只对当前会话有效)
newgrp docker

logout  # 然后重新登录,彻底生效
# 或者重启
sudo reboot

辨析

docker与虚拟机的区别

docker共享linux内核,而不是单独的内核。

容器内的bin中的命令是复制还是共享吗?

容器采取了写时复制(Copy-on-Write)机制:
读操作:共享(不复制)
写操作:复制(只在修改时复制)
删除操作:标记隐藏(不实际删除)

既然是共享,那是否是共享了宿主机的源文件?

答案既是也不是,共享的镜像层的文件,但镜像层是宿主机的文件,位于

/var/lib/docker/                    # Docker 数据根目录
├── image/                          # 镜像元数据和配置
│   └── overlay2/                   # 存储驱动特定信息
├── overlay2/                       # 实际文件存储(主要区域)
│   ├── l/                         # 链接目录(硬链接优化)
│   ├── [layer-id]/                 # 各个镜像层
│   │   ├── diff/                  # 该层的实际文件内容
│   │   │   ├── bin/               # 容器内的 /bin
│   │   │   ├── etc/               # 容器内的 /etc  
│   │   │   └── ...
│   │   └── link                   # 短标识符
├── containers/                     # 容器运行时数据
│   └── [container-id]/
│       ├── mounts/                 # 挂载信息
│       └── [container-id]-json.log # 容器日志
└── volumes/                       # 数据卷存储

镜像image,容器container、compose、卷volume,网络network

镜像(Image)是静态的模板,而容器(Container)是动态的实例。
容器,一个容器在任意时刻都直接基于一个(且仅一个)镜像启动,但一个容器是由一个“顶层镜像”和其下的多个“父镜像层”共同构成的。也就是一个容器在运行时基于一组镜像层(一个镜像栈)。

单个运行的服务实例(如 Nginx、MySQL)

Docker Compose:定义多个容器如何协同工作的编排工具

mediawiki一个容器可能用到了多个镜像,那这些镜像是如何连接数据和通信?

首先搞清楚docker的两种使用方式,下列说明。
判断为模式二,也就是三个镜像是独立的。

它们通过 网络通信、共享卷 和 环境配置 连接起来,形成一个完整的 MediaWiki 应用栈。它们不是“内置连接”的,而是像微服务一样,通过 Docker 的容器编排机制协作。


具体连接流程(以 MediaWiki 为例):
Apache2 ↔ PHP-FPM:
	Apache2 接收 HTTP 请求(端口 80)。
	当遇到 PHP 文件时,Apache 通过 FastCGI 协议(Unix socket 或 TCP)转发给 PHP-FPM。
	PHP-FPM 执行 PHP 代码,返回结果给 Apache。
连接细节:
	1.在同一 Docker 网络中,Apache 配置 proxy_fcgi://php-fpm:9000(PHP-FPM 默认监听 9000 端口)。
	2.或用 Unix socket:共享卷挂载 /var/run/php/,Apache 配置 unix:/var/run/php/php8.3-fpm.sock。

PHP-FPM ↔ JobRunner:
	PHP-FPM 处理前端请求时,如果需要后台任务(如页面更新),会将“作业”(jobs)写入数据库的 job 队列。
	JobRunner 容器轮询数据库,取出作业执行(使用 MediaWiki 的 runJobs.php 脚本)。
连接细节:两者都连接同一个 MariaDB 数据库,通过数据库表(如 job_queue)通信。JobRunner 用 cron 或 supervisor 定时运行任务。

所有服务 ↔ 数据库:
	所有容器都通过环境变量配置数据库连接(host、user、password),指向 MariaDB 容器。

共享 MediaWiki 代码:
	所有容器挂载同一个卷(如 ./mediawiki:/var/www/html),确保代码一致。

连接方式:在 Docker 中,通过以下机制让它们“协作”:

Docker 网络(Network):容器间通过虚拟网络通信,使用容器名或 IP 作为主机名。

共享卷(Volumes):挂载相同的宿主机目录,让所有容器访问 MediaWiki 代码和配置。

环境变量和配置:通过环境变量传递数据库连接信息、API 端点等。

服务发现:容器启动后,可以通过服务名(如 php-fpm)互相调用。

docker的两种使用方式

模式一:单容器多服务

在这种模式下,一个 Docker 容器内部运行多个进程/服务。
用Dockerfile自定义一个包含多个服务的容器,属于自己定制,或者别人已经定制好了。
例如:

# 基础镜像层1: 操作系统
FROM debian:bullseye

# 镜像层2: 安装 Apache
RUN apt-get update && apt-get install -y apache2

# 镜像层3: 安装 PHP
RUN apt-get install -y php php-mysql

# 镜像层4: 安装 MediaWiki
COPY mediawiki /var/www/html

# 最终得到一个完整的镜像:my-mediawiki

模式二:多容器单服务(更常见的生产模式)

使用 Docker Compose 管理多个服务。用docker-compose.yml定义多个服务容器,再但通过 docker-compose up启动时,再作为作为一个应用栈运行。

Dockerfile和docker compose yaml的关系?

Dockerfile 用于定义单个容器的“内容”,而 Docker Compose 用于定义多个容器如何共同协作运行。

docker compose是否也包含了dockerfile的功能,定义多个容器中的一个容器的内容?

在 Docker Compose 中,你有两种方式为服务指定容器内容:

  1. 使用 build指令 - 指向 Dockerfile
services:
  webapp:
    build: .  # 使用当前目录下的 Dockerfile 来构建镜像
    ports:
      - "80:80"

Dockerfile​ 定义了容器的内容(安装什么软件、复制什么文件等)
docker-compose.yml​ 只是告诉 Compose:"请先用这个 Dockerfile 构建镜像,然后用这个镜像启动容器"

  1. 使用 image指令 - 使用现有镜像
services:
  database:
    image: postgres:13  # 直接使用现有的 PostgreSQL 镜像
    environment:
      POSTGRES_PASSWORD: example

镜像的内容是由别人已经定义好的 Dockerfile​ 创建的
docker-compose.yml​ 只是说:"请拉取并使用这个现成的镜像

posted @ 2025-11-19 21:06  no_no  阅读(33)  评论(0)    收藏  举报