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 环境变量的本质是:将配置信息以环境变量的形式注入容器,应用程序读取这些变量来调整自身行为。
.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 search
从 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 中,你有两种方式为服务指定容器内容:
- 使用 build指令 - 指向 Dockerfile
services:
webapp:
build: . # 使用当前目录下的 Dockerfile 来构建镜像
ports:
- "80:80"
Dockerfile 定义了容器的内容(安装什么软件、复制什么文件等)
docker-compose.yml 只是告诉 Compose:"请先用这个 Dockerfile 构建镜像,然后用这个镜像启动容器"
- 使用 image指令 - 使用现有镜像
services:
database:
image: postgres:13 # 直接使用现有的 PostgreSQL 镜像
environment:
POSTGRES_PASSWORD: example
镜像的内容是由别人已经定义好的 Dockerfile 创建的
docker-compose.yml 只是说:"请拉取并使用这个现成的镜像

浙公网安备 33010602011771号