[Docker#11] 容器编排 | .yml | up | 实验: 部署WordPress

目录

[1. 什么是 Docker Compose](#1. 什么是 Docker Compose)

生活案例

[2. 为什么要使用 Docker Compose](#2. 为什么要使用 Docker Compose)

[Docker Compose 的安装](#Docker Compose 的安装)

[Docker Compose 的功能](#Docker Compose 的功能)

使用步骤

核心功能

[Docker Compose 使用场景](#Docker Compose 使用场景)

[Docker Compose 文件(docker-compose.yml)](#Docker Compose 文件(docker-compose.yml))

模仿示例

文件基本结构及常见指令

[Docker Compose 命令清单](#Docker Compose 命令清单)

官网参考地址

命令清单

命令格式

常见选项说明

常见命令说明

⭕up

down

[run(局部测试)](#run(局部测试))

示例

总结

实验

[1. 创建 compose 目录](#1. 创建 compose 目录)

[2. 进入 base 目录,创建 docker-compose.yml 文件](#2. 进入 base 目录,创建 docker-compose.yml 文件)

[3. 输入以下内容](#3. 输入以下内容)

[4. 输入 docker compose config 会做检查](#4. 输入 docker compose config 会做检查)

[部署 WordPress](#部署 WordPress)

[1. 什么是 WordPress](#1. 什么是 WordPress)

[2. 部署 WordPress](#2. 部署 WordPress)

[3. 常见问题](#3. 常见问题)

[3.1 up、run 和 start 之间有什么区别](#3.1 up、run 和 start 之间有什么区别)

[3.2 如何在同一主机上运行 Compose 文件的多个副本](#3.2 如何在同一主机上运行 Compose 文件的多个副本)

[3.3 可以控制服务启动顺序吗?](#3.3 可以控制服务启动顺序吗?)


1. 什么是 Docker Compose

docker-compose 是 Docker 官方提供的一个开源工具,用于定义和运行多容器的 Docker 应用程序。

它使用 Python 编写,并通过调用 Docker 服务的 API 来管理和编排容器。

docker-compose 主要有两个核心概念:

  • 服务 (service) :一个服务代表一个应用的容器,可以包含多个运行相同镜像的容器实例。
  • 项目 (project) :项目是一组相关联的服务组成的业务单元,所有服务在一个**docker-compose.yml** 文件中定义。
生活案例

可以将 docker-compose 比喻为一艘航空母舰,而舰上的战斗机和防空导弹则相当于不同的服务容器,它们共同协作完成任务。

2. 为什么要使用 Docker Compose

  • 简化管理 :对于需要多个容器协同工作的应用,使用 docker-compose 可以简化启动、停止和管理这些容器的过程。
  • 环境一致性 :确保开发、测试和生产环境的一致性,避免"在我机器上能运行"的问题。
  • 配置集中化 :将所有服务的配置集中在一个文件中,便于维护和管理。
Docker Compose 的安装

安装 Docker 时,默认已经安装了 docker-compose,安装的组件包名称为 docker-compose-plugin。可以通过以下命令检查安装是否成功:

docker compose version
Docker Compose 的功能
使用步骤
  1. 定义服务 :在 docker-compose.yml 文件中定义构成应用程序的服务。
  2. 启动应用 :使用 docker compose up 命令启动并运行整个应用程序。
核心功能
  • 启动、停止和重建服务
  • 查看服务状态
  • 流式传输服务日志
  • 多容器下 成功运行一次性命令
Docker Compose 使用场景
  • 单主机部署 :快速搭建单节点开发或测试环境。
  • 不同环境隔离 :通过指定不同的项目来运行不同的环境,实现环境隔离。

Docker Compose 文件(docker-compose.yml)

文件语法版本

目前官方支持三个主要版本:Version 1、Version 2 和 Version 3。Version 1 已被废弃,最新版本为 3.8,支持的 Docker Engine 版本不得低于 19.03.0。

版本查看:Legacy versions | Docker Docs

同时大家可以借助 官方文档 自行学习~

可以仿照如下配置 进行模仿

模仿示例

下面是详细讲解~

文件基本结构及常见指令
version: "3.8"

services:
  servicename:
    image: # 必选,镜像的名字
    command: # 可选,覆盖默认命令
    environment: # 可选,设置环境变量
    volumes: # 可选,绑定数据卷
    networks: # 可选,指定网络
    ports: # 可选,端口映射
    expose: # 可选,暴露端口
    build: # 构建目录
    depends_on: # 服务依赖配置
    env_file: # 环境变量文件

  servicename2:
    image:
    command:
    networks:
    ports:

  servicename3:
    # ...

volumes: # 可选,定义数据卷
networks: # 可选,定义网络

常见字段格式语法

  • image :指定容器运行的镜像。

    image: redis
    image: redis:5
    image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
    image: library/redis
    image: docker.io/library/redis
    image: my_private.registry:5000/redis

  • command :覆盖容器启动的默认命令。

    command: ["bundle", "exec", "thin", "-p", "3000"]
    command: bundle exec thin -p 3000

  • entrypoint:覆盖容器默认的 entrypoint。

    entrypoint: /code/entrypoint.sh
    entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

  • environment:添加环境变量。

    #map 语法
    environment:
    RACK_ENV: development
    SHOW: "true"
    USER_INPUT:

    #数组语法
    environment:

    • RACK_ENV=development
    • SHOW=true
    • USER_INPUT
  • networks:指定容器运行的网络。

    services:
    frontend:
    image: awesome/webapp
    networks:
    - front-tier
    - back-tier

    networks:
    front-tier:
    back-tier:

  • volumes:将主机的数据卷或文件挂载到容器里。

    services:
    db:
    image: postgres:latest
    volumes:
    - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
    - "/localhost/data:/var/lib/postgresql/data"

  • ports:指定端口映射。

    ports:
    - "3000"
    - "3000-3005"
    - "8000:8000"
    - "9090-9091:8080-8081"
    - "49100:22"
    - "127.0.0.1:8001:8001"
    - "127.0.0.1:5000-5010:5000-5010"
    - "6060:6060/udp"

  • expose:暴露端口,但不映射到宿主机。

    expose:
    - "3000"
    - "8000"

  • build:指定构建镜像的上下文路径。

    build: ./dir
    build:
    context: ./dir
    dockerfile: Dockerfile-alternate
    args:
    buildno: 1
    labels:
    - "com.example.description=Accounting webapp"
    - "com.example.department=Finance"
    - "com.example.label-with-empty-value"

  • depends_on :设置依赖关系。

    services:
    web:
    build: .
    depends_on:
    - db
    - redis
    redis:
    image: redis
    db:
    image: postgres

  • healthcheck :健康检查。

    healthcheck:
    test: mysql --user=root --password='bit@123' -e "SELECT 1;"
    interval: 10s
    timeout: 5s
    retries: 10

  • env_file:从文件添加环境变量。

    env_file: .env
    env_file:
    - ./common.env
    - ./apps/web.env
    - /opt/secrets.env

tip:

docker-compose 是一个强大的工具,可以帮助你更高效地管理和编排多容器应用。

建议多阅读官方文档 (Compose file reference | Docker Docs),提高自学能力,以便更好地利用 docker-compose

具体的学习 后面会有一个小项目 来详细了解~


Docker Compose 命令清单

官网参考地址
命令清单

|--------------------------|----------------------------------------------------------------------------------------------------------------|
| 命令 | 功能 |
| docker compose build | 构建服务 |
| docker compose config | 规范的格式来显示服务配置 |
| docker compose cp | 在本地系统和服务容器之间拷贝文件 |
| docker compose create | 创建服务的容器 |
| docker compose down | 停止所有容器,并删除容器 |
| docker compose events | 从服务器获取实时事件 |
| docker compose exec | 在容器中执行命令 |
| docker compose images | 列出所有容器使用的镜像 |
| docker compose kill | 强制停止服务的容器 |
| docker compose logs | 显示日志 |
| docker compose ls | 显示所有项目 |
| docker compose pause | 暂停服务 |
| docker compose port | 列出所有的端口映射 |
| docker compose ps | 列出项目中目前的所有容器 |
| docker compose pull | 拉取服务镜像 |
| docker compose push | 推送服务镜像 |
| docker compose restart | 重启或者重启某个服务 |
| docker compose rm | 删除服务停止的容器 |
| docker compose run | 在指定服务容器上执行相关的命令 |
| docker compose start | 启动当前停止的某个容器 |
| docker compose stop | 停止当前运行的某个容器 |
| docker compose top | 显示运行的进程 |
| docker compose unpause | 恢复服务 |
| docker compose up | 构建、(重新)创建、启动并链接一个服务相关的容器 默认情况下如果容器已经存在,将会停止并尝试重新创建他们。并使用之前挂载的卷。 --no-recreate 参数可以让容器不被停止或者重新创建, -d 表示后台运行 |
| docker compose version | 查看版本 |

命令格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

docker compose [OPTIONS] COMMAND [ARGS...]
常见选项说明
  • -f, --file:指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name:指定项目名称,默认将使用所在目录名称作为项目名。
常见命令说明
up

该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。

docker compose up [options] [SERVICE...]
  • -d:在后台运行服务容器,推荐在生产环境下使用该选项。
  • --force-recreate:强制重新创建容器,不能与 --no-recreate 同时使用。
  • --no-recreate:如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用。
down

停止所有容器,并删除容器和网络。

docker compose down [options] [SERVICE...]
  • -v, --volumes:删除容器同时删除目录映射。
run(局部测试)

该命令可以在指定服务容器上执行相关的命令。

docker compose run [options] SERVICE [COMMAND] [ARGS...]
  • -d:后台运行容器。
  • --name NAME:为容器指定一个名字。
  • --entrypoint CMD:覆盖默认的容器启动指令。
  • -e KEY=VAL:设置环境变量值,可多次使用选项来设置多个环境变量。
  • -u, --user="":指定运行容器的用户名或者 uid。
  • --rm:运行命令后自动删除容器。
  • -p, --publish=[]:映射容器端口到本地主机。
示例
# 启动一个 Ubuntu 服务容器,并执行 ping docker.com 命令
docker compose run ubuntu ping docker.com
总结

docker-compose 提供了一系列强大的命令,可以更高效地管理和编排多容器应用。建议多阅读官方文档,提高自学能力,以便更好地利用 docker-compose


实验

1. 创建 compose 目录
mkdir -p /data/myworkdir/compose/base
cd /data/myworkdir/compose/base 
2. 进入 base 目录,创建 docker-compose.yml 文件
cd /data/myworkdir/compose/base/
vi docker-compose.yml
3. 输入以下内容
version: "3.8"
services:
  web:
    image: nginx:1.24.0
    environment:
      TEST: 1
    ports:
      - 8979:80
    networks:
      - mytestnet
    volumes:
      - ./mynginxhome:/usr/share/nginx/html
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: "bit@123"
    networks:
      - mytestnet
    volumes:
      - /data/maxhou/mysqldata/varlib/:/var/lib/mysql
    healthcheck:
      test: mysql --user=root --password='bit@123' -e "SELECT 1;"
      interval: 10s
      timeout: 5s
      retries: 10
  redis:
    image: redis:7
    networks:
      - mytestnet
    healthcheck:
      test: redis-cli ping
      interval: 10s
      timeout: 5s
      retries: 10
networks:
  mytestnet:
4. 输入 docker compose config 会做检查
docker compose config
  1. 创建首页目录,编辑首页内容

    mkdir -p ./mynginxhome
    cd ./mynginxhome/
    echo "Hello bit" > index.html

  2. 启动服务

  1. 通过页面访问
  • 打开浏览器,访问 http://localhost:8979,应能看到 "Hello bit"。
  1. 服务 部署测试

    docker compose stop
    docker compose start

  1. 删除服务

    docker compose down

通过以上步骤,可以成功创建并管理一个包含 Nginx、MySQL 和 Redis 服务的 Docker Compose 项目

这些操作涵盖了从创建目录、编写配置文件、启动服务、访问服务到停止和删除服务的全过程。


部署 WordPress

1. 什么是 WordPress

  • WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。
  • 它也可以作为内容管理系统(CMS)使用。
  • WordPress 提供了许多免费的第三方模板和插件,安装方式简单易用。
  • 官方支持中文版,并且有第三方中文语言包可供选择。用户可以通过学习 HTML、CSS 和 PHP 等技术来自定义模板。

2. 部署 WordPress

2.1 编写 Docker Compose YAML 文件

创建一个 docker-compose.yml 文件,内容如下:

version: '3.8'

services:
  db:#服务
    image: mysql:5.7
    volumes:
      - ./db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: mywordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    healthcheck:#健康检查
      test: ["CMD", "mysql", "--user=root", "--password=mywordpress", "-e", "SELECT 1;"]
      interval: 10s
      timeout: 5s
      retries: 10

  wordpress:
    depends_on:#基于第一个服务的health
      db:
        condition: service_healthy
    image: wordpress:latest
    ports:
      - "8770:80"
    restart: always
    volumes:
      - ./wordpress:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress

2.2 运行站点

在包含 docker-compose.yml 文件的目录中,运行以下命令启动服务:

docker compose up -d

2.3 访问 Web 页面

打开浏览器,访问 http://localhost:8000,进入 WordPress 安装页面。

2.4 配置参数,点击安装

按照提示填写数据库信息和其他必要配置,点击安装按钮完成安装。

2.5 登录

使用安装过程中设置的用户名和密码登录 WordPress 后台。

2.6 进入后台

登录后,您可以进入 WordPress 后台进行进一步的配置和管理。

2.7 删除,释放空间

如果需要删除 WordPress 服务并释放空间,运行以下命令:

docker compose down

这将删除所有容器和网络,但不会删除卷。如果需要删除卷,可以使用以下命令:

docker compose down --volumes

3. 常见问题

3.1 uprunstart 之间有什么区别
  • docker compose up:用于启动或重新启动 docker-compose.yml 中定义的服务。默认情况下,它会在前台运行并显示所有容器的日志。使用 -d 参数可以在后台运行。
  • docker compose run:用于运行"一次性"或"临时"任务。它只会启动指定的服务及其依赖服务。适用于运行测试或执行管理任务。
  • docker compose start:仅用于重新启动之前创建但已停止的容器。不会创建新的容器。
3.2 如何在同一主机上运行 Compose 文件的多个副本

例如:

1. 创建 docker-compose-project1.yml****文件,并编写好

2.up

docker compose -f docker-compose-project1.yml -p project1 down

-f 选项

  • 用途:指定要使用的 docker-compose.yml 文件的路径。
  • 默认值:如果未指定 -f 选项,Docker Compose 会默认查找当前目录下的 docker-compose.yml 文件。

-p 选项

  • 用途:指定项目的名称。Docker Compose 使用项目名称为项目中的所有容器和其他资源创建唯一标识符。
  • 默认值:如果未指定 -p 选项,Docker Compose 会使用当前目录的名称作为项目名称。
3.3 可以控制服务启动顺序吗?

可以控制启动顺序,通过 depends_on 指定依赖关系,并结合 healthcheck 确保依赖服务健康后再启动当前服务。

例如,在上面的 docker-compose.yml 文件中,wordpress 服务依赖于 db 服务

并且只有当 db 服务健康时才会启动 wordpress 服务。

💡:如果说镜像和容器 vs 类和对象 ,那.yml就是main中对类的编排调用~

相关推荐
写bug写bug几秒前
探秘 Java 泛型:从类型参数到边界限制与类型擦除
java·后端
怪兽也会哭哭11 分钟前
后台运行docker compose项目,一直失败,提示:Timeout exceeded while awaiting headers?让我来看看~
docker·容器·学习笔记
凡人的AI工具箱13 分钟前
15分钟学 Go 第 59 天 :更高级的Go话题——接触微服务
开发语言·人工智能·后端·微服务·golang
vibag22 分钟前
Flink算子
java·大数据·后端·flink
小白的白是白痴的白24 分钟前
11.14 Scala的Array
开发语言·后端·scala
NiNg_1_23432 分钟前
Spring Boot实现WebSocket详解
spring boot·后端·websocket
2401_8576009537 分钟前
本草智控:中药实验管理的智能时代
java·spring boot·后端
vortex539 分钟前
Linux 下敏感文件路径总结
linux·运维·服务器
阿拉伯梳子42 分钟前
无线网络信号 6G、5G和2.4G 的一些小科普
运维·服务器
yohoo菜鸟1 小时前
kubernetes部署dashboard
云原生·容器·kubernetes