Docker Swarm 集群部署 Wordpress
1.知识预备
1.1 Docker 集群概念和优势
Docker 集群是由多个 Docker 主机组成的分布式系统,用于协同管理和运行容器化应用程序。
这个集群可以通过 Docker Swarm 或 Kubernetes 等容器编排工具来实现。
Docker 集群的几个概念
- 节点(Node): 集群中的物理或虚拟主机,可以运行 Docker 守护进程。
- 集群管理器(Cluster Manager): Docker Swarm 或 Kubernetes 等容器编排工具,用于协调和管理整个集群。
- 服务(Service): 定义容器应该如何运行的规范,包括镜像、端口映射等。集群管理器根据服务规范在节点上创建和管理容器。
- 任务(Task): 服务的实例,是在节点上运行的容器。一个服务可以有多个任务,每个任务都是服务的副本。
- 覆盖网络(Overlay Network): 允许容器在不同节点上进行通信的网络。覆盖网络使得在整个集群中容器可以直接互相访问。
Docker 集群优势
- 容器化应用部署: Docker 集群提供了一种简化和标准化应用部署的方式。可以使用相同的 Docker 镜像在集群中的不同节点上运行应用。
- 可扩展性: 集群可以轻松地扩展,向其中添加新的节点,以应对应用程序的需求增长。这种可扩展性有助于实现高可用性和负载均衡。
- 高可用性: Docker 集群具备容错能力,允许容器在集群的多个节点上运行,从而提高应用程序的可用性。如果某个节点发生故障,服务可以在其他节点上继续运行。
- 资源利用率: 集群管理器可以有效地分配和管理资源,确保集群中的容器充分利用计算资源,提高资源利用率。
- 简化运维: 集群管理器提供了集中式的管理和监控工具,简化了应用程序的部署、更新和扩展。这有助于降低运维成本。
- 自动负载均衡: Docker 集群可以自动分发流量到不同节点上的容器,从而实现负载均衡,确保应用程序的高性能和可伸缩性。
- 灵活的服务发现: Docker 集群提供了服务发现机制,容器可以通过服务名称而不是 IP 地址进行通信,这使得容器之间的相互调用更为灵活。
1.2 Docker Swarm 介绍
Docker Swarm 是 Docker 官方提供的容器编排工具,用于创建和管理 Docker 容器的集群。
它允许用户轻松地将容器化应用程序部署到分布式环境中,提供高可用性、可扩展性和自动化管理。
它的主要特性实现了以上Docker集群优势,并与 Docker 引擎完全兼容,可通过 Docker CLI 或 API 进行交互。
2.Docker Swarm 部署 Wordpress实验
2.1 实验简介
本次实验主要包含以下几个部分:
- 拉取MySQL、Wordpress等镜像;
- 准备CentOS 7 虚拟机 (2个节点);
- 创建Docker Swarm 集群;
- 创建MySQL集群服务(副本为1);
- 创建WordPress集群服务(副本为1)。
通过本次实验,可以掌握Docker Swarm部署mysql和wordpress服务的方法,以及相关的运维(排错)能力。
2.2 拉取MySQL、Wordpress等镜像
启动第1个CentOS 7 系统的虚拟机,使用SSH工具(如WindTerm)远程登录控制台,确保互联网通畅。
- 拉取 MySQL 镜像:
docker pull mysql:latest
- 拉取 WordPress 镜像:
docker pull wordpress:latest
- 查看已有的镜像:
#查看本机镜像列表
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):表示镜像的来源仓库,例如
mysql
和wordpress
。- 标签(Tag):表示镜像的版本或标识符,通常为
latest
表示最新版本。- 镜像ID(IMAGE ID):唯一标识镜像的ID。可以使用这个ID来引用镜像。
- 创建时间(CREATED):显示镜像的创建时间,例如“x weeks ago”。
- 大小(Size):显示镜像的大小,以MB为单位。
2.3 准备CentOS 7 虚拟机 (2个节点)
克隆第2个虚拟机,步骤如下:
- 打开VMware Workstation主面板。
- 选择需要克隆的虚拟机(已关机状态),鼠标右击,选择右侧菜单中的“管理”。
- 显示下一级菜单后,点击“克隆”。
- 打开克隆虚拟机向导,点击“下一步”。
- 选择克隆类型,可以选择完全克隆,也可以选择链接克隆。推荐使用链接克隆,占用的空间会比较小。选择后点击“下一步”。
- 设置虚拟机名称(如docker2)和存储路径(可以默认)。
- 克隆虚拟机向导会自动完成虚拟机克隆,完成后点击关闭即可。
克隆完成后,新生成的虚拟机与原虚拟机是完全独立的,对新虚拟机的任何操作不会影响原虚拟机。
如果使用其他虚拟化软件如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
命令中的各个参数说明如下:
-
docker service create
: Docker Swarm的命令,用于在Swarm集群中创建一个新的服务。 -
--name wordpress
: 为这个服务命名,这里的服务名被设置为wordpress
。 -
--publish 80:80
: 设置端口映射,将宿主机的80端口映射到容器的80端口。 -
-e WORDPRESS_DB_NAME=wordpress
: 设置环境变量,指定WordPress数据库的名称为wordpress
。 -
-e WORDPRESS_DB_USER=root
: 设置环境变量,指定WordPress数据库的用户名为root
。 -
-e WORDPRESS_DB_PASSWORD=123
: 设置环境变量,指定WordPress数据库的密码为123
。 -
-e WORDPRESS_DB_HOST=192.168.152.128:3306
: 设置环境变量,指定WordPress数据库的主机地址为192.168.152.128
,端口号为3306
。这意味着WordPress服务将通过该地址和端口连接到数据库,可以使用 ss -ant 查看3306是否有效。 -
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中运行的服务的相关信息。
相关参数说明如下:
-
ID: 这是服务的唯一标识符,由Docker自动生成。例如,
mexx0zegxnaw
是MySQL服务的ID,sv733bnjqwxv
是WordPress服务的ID。 -
NAME: 这是服务的名称,由用户在创建服务时指定。在这个例子中,有两个服务,分别是名为
mysql
的MySQL服务和名为wordpress
的WordPress服务。 -
MODE: 这显示了服务的运行模式。在这个例子中,两个服务都运行在
replicated
模式下,这意味着它们都在Swarm集群中的多个节点上运行,以实现高可用性。 -
REPLICAS: 这显示了服务的副本数。
1/1
表示期望的副本数和实际运行的副本数都是1。这意味着每个服务都有一个副本在运行。 -
IMAGE: 这显示了服务使用的Docker镜像。在这个例子中,MySQL服务使用的是
mysql:latest
镜像,而WordPress服务使用的是wordpress:latest
镜像。 - 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 docke
r解决。
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数据库就不见了!文章来源:https://www.toymoban.com/news/detail-762227.html
我们思考一下为什么,然后我们又该如何解决呢?文章来源地址https://www.toymoban.com/news/detail-762227.html
如有疑问、问题请留言。祝好运!
到了这里,关于【大白学Docker】Docker Swarm 集群部署 Wordpress【实验】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!