[Docker#11] 容器编排 | .yml | up | 实验: 部署WordPress
目录
1. 什么是 Docker Compose
生活案例
2. 为什么要使用 Docker Compose
Docker Compose 的安装
Docker Compose 的功能
使用步骤
核心功能
Docker Compose 使用场景
Docker Compose 文件(docker-compose.yml)
模仿示例
文件基本结构及常见指令
Docker Compose 命令清单
官网参考地址
命令清单
命令格式
常见选项说明
常见命令说明
⭕up
down
run(局部测试)
示例
总结
实验
1. 创建 compose 目录
2. 进入 base 目录,创建 docker-compose.yml 文件
3. 输入以下内容
4. 输入 docker compose config 会做检查
部署 WordPress
1. 什么是 WordPress
2. 部署 WordPress
3. 常见问题
3.1 up、run 和 start 之间有什么区别
3.2 如何在同一主机上运行 Compose 文件的多个副本
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 的功能
使用步骤
- 定义服务:在
docker-compose.yml
文件中定义构成应用程序的服务。- 启动应用:使用
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 官方文档
命令清单
命令 | 功能 |
| 构建服务 |
| 规范的格式来显示服务配置 |
| 在本地系统和服务容器之间拷贝文件 |
| 创建服务的容器 |
| 停止所有容器,并删除容器 |
| 从服务器获取实时事件 |
| 在容器中执行命令 |
| 列出所有容器使用的镜像 |
| 强制停止服务的容器 |
| 显示日志 |
| 显示所有项目 |
| 暂停服务 |
| 列出所有的端口映射 |
| 列出项目中目前的所有容器 |
| 拉取服务镜像 |
| 推送服务镜像 |
| 重启或者重启某个服务 |
| 删除服务停止的容器 |
| 在指定服务容器上执行相关的命令 |
| 启动当前停止的某个容器 |
| 停止当前运行的某个容器 |
| 显示运行的进程 |
| 恢复服务 |
| 构建、(重新)创建、启动并链接一个服务相关的容器 默认情况下如果容器已经存在,将会停止并尝试重新创建他们。并使用之前挂载的卷。 |
| 查看版本 |
命令格式
对于 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
6. 创建首页目录,编辑首页内容
mkdir -p ./mynginxhome
cd ./mynginxhome/
echo "Hello bit" > index.html
7. 启动服务
8. 通过页面访问
- 打开浏览器,访问
http://localhost:8979
,应能看到 "Hello bit"。
9. 服务 部署测试
docker compose stop
docker compose start
11. 删除服务
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 up
、run
和 start
之间有什么区别
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中对类的编排调用~