【大白学Docker】Docker Swarm 集群部署 Wordpress【实验】

Docker Swarm 集群部署 Wordpress

1.知识预备

1.1 Docker 集群概念和优势

Docker 集群是由多个 Docker 主机组成的分布式系统,用于协同管理和运行容器化应用程序。

这个集群可以通过 Docker Swarm 或 Kubernetes 等容器编排工具来实现。

Docker 集群的几个概念
  1. 节点(Node): 集群中的物理或虚拟主机,可以运行 Docker 守护进程。
  2. 集群管理器(Cluster Manager): Docker Swarm 或 Kubernetes 等容器编排工具,用于协调和管理整个集群。
  3. 服务(Service): 定义容器应该如何运行的规范,包括镜像、端口映射等。集群管理器根据服务规范在节点上创建和管理容器。
  4. 任务(Task): 服务的实例,是在节点上运行的容器。一个服务可以有多个任务,每个任务都是服务的副本。
  5. 覆盖网络(Overlay Network): 允许容器在不同节点上进行通信的网络。覆盖网络使得在整个集群中容器可以直接互相访问。
Docker 集群优势
  1. 容器化应用部署: Docker 集群提供了一种简化和标准化应用部署的方式。可以使用相同的 Docker 镜像在集群中的不同节点上运行应用。
  2. 可扩展性: 集群可以轻松地扩展,向其中添加新的节点,以应对应用程序的需求增长。这种可扩展性有助于实现高可用性和负载均衡。
  3. 高可用性: Docker 集群具备容错能力,允许容器在集群的多个节点上运行,从而提高应用程序的可用性。如果某个节点发生故障,服务可以在其他节点上继续运行。
  4. 资源利用率: 集群管理器可以有效地分配和管理资源,确保集群中的容器充分利用计算资源,提高资源利用率。
  5. 简化运维: 集群管理器提供了集中式的管理和监控工具,简化了应用程序的部署、更新和扩展。这有助于降低运维成本。
  6. 自动负载均衡: Docker 集群可以自动分发流量到不同节点上的容器,从而实现负载均衡,确保应用程序的高性能和可伸缩性。
  7. 灵活的服务发现: Docker 集群提供了服务发现机制,容器可以通过服务名称而不是 IP 地址进行通信,这使得容器之间的相互调用更为灵活。

1.2 Docker Swarm 介绍

Docker Swarm 是 Docker 官方提供的容器编排工具,用于创建和管理 Docker 容器的集群。

它允许用户轻松地将容器化应用程序部署到分布式环境中,提供高可用性、可扩展性和自动化管理。

它的主要特性实现了以上Docker集群优势,并与 Docker 引擎完全兼容,可通过 Docker CLI 或 API 进行交互。

2.Docker Swarm 部署 Wordpress实验

2.1 实验简介

本次实验主要包含以下几个部分:

  1. 拉取MySQL、Wordpress等镜像;
  2. 准备CentOS 7 虚拟机 (2个节点);
  3. 创建Docker Swarm 集群;
  4. 创建MySQL集群服务(副本为1);
  5. 创建WordPress集群服务(副本为1)。

通过本次实验,可以掌握Docker Swarm部署mysql和wordpress服务的方法,以及相关的运维(排错)能力。

2.2 拉取MySQL、Wordpress等镜像

启动第1个CentOS 7 系统的虚拟机,使用SSH工具(如WindTerm)远程登录控制台,确保互联网通畅。

  1. 拉取 MySQL 镜像:
docker pull mysql:latest
  1. 拉取 WordPress 镜像:
docker pull wordpress:latest
  1. 查看已有的镜像:
#查看本机镜像列表
docker images

#返回结果
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
wordpress    latest    c3c92cc3dcb1   23 months ago   616MB
mysql        latest    3218b38490ce   23 months ago   516MB
centos       7         eeb6ee3f44bd   2 years ago     204MB

说明:

  • 仓库名(Repository):表示镜像的来源仓库,例如mysqlwordpress
  • 标签(Tag):表示镜像的版本或标识符,通常为latest表示最新版本。
  • 镜像ID(IMAGE ID):唯一标识镜像的ID。可以使用这个ID来引用镜像。
  • 创建时间(CREATED):显示镜像的创建时间,例如“x weeks ago”。
  • 大小(Size):显示镜像的大小,以MB为单位。

2.3 准备CentOS 7 虚拟机 (2个节点)

克隆第2个虚拟机,步骤如下:

  1. 打开VMware Workstation主面板。
  2. 选择需要克隆的虚拟机(已关机状态),鼠标右击,选择右侧菜单中的“管理”。
  3. 显示下一级菜单后,点击“克隆”。
  4. 打开克隆虚拟机向导,点击“下一步”。
  5. 选择克隆类型,可以选择完全克隆,也可以选择链接克隆。推荐使用链接克隆,占用的空间会比较小。选择后点击“下一步”。
  6. 设置虚拟机名称(如docker2)和存储路径(可以默认)。
  7. 克隆虚拟机向导会自动完成虚拟机克隆,完成后点击关闭即可。

克隆完成后,新生成的虚拟机与原虚拟机是完全独立的,对新虚拟机的任何操作不会影响原虚拟机。

如果使用其他虚拟化软件如VirtualBox,请参考相关文档。

注意:需先开启第2个虚拟机,可以使用nmtui工具,修改它的IP(如果静态IP设置,同时克隆了第1个虚拟机的IP),然后再启动两个虚拟机。使用SSH工具登录控制台。

2.4 创建Docker Swarm 集群

1.初始化Swarm集群,将第1台虚拟机设置为Swarm管理器。

docker swarm init --advertise-addr 192.168.152.128

返回信息:

Swarm initialized: current node (y7bycpskgtr6myv511fxdt9an) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-1twll168at0nih6v9144sogmn9e370i2uuk5pj2l5nu7ly6ly8-cjukx19qqpx59nda8kg6sk29t
192.168.152.128:2377 

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2.在第2台虚拟机(docker2)上,运行

docker swarm join --token SWMTKN-1-1twll168at0nih6v9144sogmn9e370i2uuk5pj2l5nu7ly6ly8-cjukx19qqpx59nda8kg6sk29t 192.168.152.128:2377

返回信息:

This node joined a swarm as a worker.

表示成功。

3.查看节点清单

docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
y7bycpskgtr6myv511fxdt9an *   docker1    Ready     Active         Leader           24.0.6
wui6nf1gy0f7prcht40u2s53g     docker2    Ready     Active                          24.0.6

2.5 创建MySQL集群服务(副本为1)

1.创建MySQL服务
在 Docker Swarm 集群中创建一个新的MySQL 服务。
docker service create --name mysql --publish 3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql:latest

命令中的各个参数说明如下:

  • docker service create: 这是 Docker Swarm 的命令,用于在 Swarm 集群中创建一个新的服务。
  • --name mysql: 这部分是为这个服务命名,这里的服务名被设置为 mysql
  • --publish 3306:3306: 这部分是端口映射的设置。它将宿主机的 3306 端口映射到容器的 3306 端口。
  • -e MYSQL_ROOT_PASSWORD=123: 这部分是设置环境变量,设置的是 MySQL 的 root 用户的密码为 123
  • mysql:latest: 这部分指定了要使用的 Docker 镜像,这里是 MySQL 的最新版本的 Docker 镜像。

所以,总的来说,这个命令是在 Docker Swarm 集群中创建一个新的 MySQL 服务,使用最新的 MySQL Docker 镜像,将宿主机的 3306 端口映射到容器的 3306 端口,并设置 MySQL 的 root 密码为 123

检查端口是否启动
 ss -ant | grep 3306

#返回结果

LISTEN 0 128 [::]:3306 [::]:*

查看 mysql服务
docker service mysql

ID             NAME          IMAGE          NODE      DESIRED STATE   CURRENT STATE             ERROR     PORTS
ws73osxnel5u   mysql.1       mysql:latest   docker1   Running         Running 22 minutes ago      

#可以看出 mysql容器运行在 docker1主机。

2.准备Wordpress数据库

这里MySQL还没有Wordpress需要的数据库,我们需要手动创建。

进入到MySQL控制台创建数据库

docker exec -it 0eb mysql -uroot -p123

#这里 0eb 是通过 docker ps 发现的 mysql 容器的ID前3位。

执行命令

#创建数据库wordpress

create database wordpress;

#验证数据库

show databases;

#返回结果

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress |
+--------------------+
5 rows in set (0.00 sec)

#退出数据库

exit;

2.6 创建WordPress集群服务(副本为1)

在Docker Swarm集群中创建一个新的WordPress服务。
 docker service create --name wordpress --publish 80:80 -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_HOST=192.168.152.128:3306 wordpress:latest

命令中的各个参数说明如下:

  1. docker service create: Docker Swarm的命令,用于在Swarm集群中创建一个新的服务。
  2. --name wordpress: 为这个服务命名,这里的服务名被设置为wordpress
  3. --publish 80:80: 设置端口映射,将宿主机的80端口映射到容器的80端口。
  4. -e WORDPRESS_DB_NAME=wordpress: 设置环境变量,指定WordPress数据库的名称为wordpress
  5. -e WORDPRESS_DB_USER=root: 设置环境变量,指定WordPress数据库的用户名为root
  6. -e WORDPRESS_DB_PASSWORD=123: 设置环境变量,指定WordPress数据库的密码为123
  7. -e WORDPRESS_DB_HOST=192.168.152.128:3306: 设置环境变量,指定WordPress数据库的主机地址为192.168.152.128,端口号为3306。这意味着WordPress服务将通过该地址和端口连接到数据库,可以使用 ss -ant 查看3306是否有效。
  8. wordpress:latest: 指定要使用的Docker镜像,这里是WordPress的最新版本的Docker镜像。
验证服务

1.使用 ss -ant 查看两个主机,会发现,虽然MySQL、Wordpress容器各自运行在不同主机,但2个主机都存在 80、3306端口(这是集群)

2.docker service ls 查看服务状态

ID             NAME        MODE         REPLICAS   IMAGE              PORTS
mexx0zegxnaw   mysql       replicated   1/1        mysql:latest       *:3306->3306/tcp
sv733bnjqwxv   wordpress   replicated   1/1        wordpress:latest   *:80->80/tcp

这个信息显示了Swarm中运行的服务的相关信息。

相关参数说明如下:

  1. ID: 这是服务的唯一标识符,由Docker自动生成。例如,mexx0zegxnaw是MySQL服务的ID,sv733bnjqwxv是WordPress服务的ID。
  2. NAME: 这是服务的名称,由用户在创建服务时指定。在这个例子中,有两个服务,分别是名为mysql的MySQL服务和名为wordpress的WordPress服务。
  3. MODE: 这显示了服务的运行模式。在这个例子中,两个服务都运行在replicated模式下,这意味着它们都在Swarm集群中的多个节点上运行,以实现高可用性。
  4. REPLICAS: 这显示了服务的副本数。1/1表示期望的副本数和实际运行的副本数都是1。这意味着每个服务都有一个副本在运行。
  5. IMAGE: 这显示了服务使用的Docker镜像。在这个例子中,MySQL服务使用的是mysql:latest镜像,而WordPress服务使用的是wordpress:latest镜像。
  6. PORTS: 这显示了服务的端口映射情况。对于MySQL服务,宿主机的3306端口映射到容器的3306端口;对于WordPress服务,宿主机的80端口映射到容器的80端口。
访问网页

使用浏览器访问192.168.152.128(swarm管理者),可以看到Wordpress的安装界面,根据提示一路操作,Wordpress就能用起来!

在这里插入图片描述

3 问题与解决

3.1 报错:Is the docker daemon running?

一般是docker 服务没有启动,可以使用 systemctl start docker解决。

3.2 报错 error while validating Root CA Certificate

docker swarm join --token SWMTKN-1-1twll***t 192.168.152.128:2377
Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid: current time 2023-11-29T04:02:21-05:00 is before 2023-11-29T10:14:00Z

解决:是两个虚拟机时间同步问题,可以安装chrony,进行ntp同步解决。

3.3 报错:数据库连不上或网页不能访问(404)

如果通过 ss -ant 没有查看到 3306、80端口开着,说明服务启动不成功。

解决:关闭所有服务,使用 docker service rm <服务名称>, 然后重启docker服务,再逐个启动服务并验证。

3.4 报错:Wordpress 提示 Error establishing a database connection

解决:登录到MySQL容器的MySQL控制台(有点绕口),创建wordpress数据库。

4 疑问

你有没有发现 MySQL服务一旦停止 docker service rm mysql , 再次创建时,里面的wordpress数据库就不见了!

我们思考一下为什么,然后我们又该如何解决呢?

如有疑问、问题请留言。祝好运!

  • 50
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值