撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>

本次我们部署一个稍微负复杂的application--wordpress。

之前我们使用docker run分别创建了两个容器,一个是wordpress,一个是mysql。因为他们是连接到同一个network中,所以他们可以相互通信。

这一节我们用service的形式部署到cluster中。

首先我们创建的service会部署在哪个节点中我们事先是不知道的。而一个mysqlservice和wordpress service很有可能不在一个节点上,如何通信?

我们可以通过overlay的方式,将两个service都连接到一个overlay上,这样不管是否在同一台节点中都可以进行通信。

创建overlay网络

vincent@swarm-manager:~$ docker network create -d overlay demo
3jgzsg1gt3gxb1u1i3l7rgqdi

查看一下确实添加上了demo的overlay网络:

vincent@swarm-manager:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1273b71b09c8        bridge              bridge              local
3jgzsg1gt3gx        demo                overlay             swarm
0d41041dafaa        docker_gwbridge     bridge              local
8212167bd2d1        host                host                local
mu4mlqqsl2a3        ingress             overlay             swarm
089cabdcfa5a        none                null                local

我们在swarm-worker1中查看一下网络:

vincent@swarm-worker-1:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
16524b38199c        bridge              bridge              local
727b01e93cc6        docker_gwbridge     bridge              local
d156bf01fbb9        host                host                local
mu4mlqqsl2a3        ingress             overlay             swarm
27d89fbc2a96        none                null                local

现在在swarm-worker1中还未发现demo的网络,先不用着急,继续往下走。

在swarm manager上创建mysql service,命令如下:

vincent@swarm-manager:~$ docker service create --name mysql --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7

在创建service时与之前的创建container稍微有点不同,之前使用-v选项,替换为--mount type= ,source ,destination, 之前使用-e,现在替换为--env。

docker service create 和 docker run 的命令基本是一致的。在swarm下就不在使用docker run了,docker run 是在本地创建一个容器。我们在cluster下创建的docker 容器不一定是运行在那个机器下。所以docker run 基本不用了。

vincent@swarm-manager:~$ docker service create --name mysql --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7
s4rgbf3mfyifbobpzf1zhnm1o
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

第一次运行有点慢,需要耐心等。

查看刚创建的mysql service:

vincent@swarm-manager:~$ docker service ps mysql
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
tslzqwo3t7ag        mysql.1             mysql:5.7           swarm-worker1          Running             Running about a minute ago 

可以看到mysql服务运行在swarm-worker1节点上,在swarm-worker1上确认:

vincent@swarm-worker1:~$ docker container ls
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                  PORTS                                                          NAMES
57ec905ddae0        mysql:5.7                 "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes            3306/tcp, 33060/tcp                                            mysql.1.tslzqwo3t7ag9kppit3wv3ixi

可以看到确实在swarm-worker1上有这个服务。

在swarm manager上创建wordpress service,命令如下:

vincent@swarm-manager:~$ docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=123456 --env WORDPRESS_DB_HOST=mysql --network demo wordpress

需要将wordpress的web服务的80端口映射到外面环境的80端口:

vincent@swarm-manager:~$ docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_PASSWORD=123456 --env WORDPRESS_DB_HOST=mysql --network demo wordpress
6o6q9bz3da7gll63syhsuudq6
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
vincent@swarm-manager:~$ docker service ps wordpress
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
qclnrwt9aj7v        wordpress.1         wordpress:latest    swarm-manager          Running             Running 39 seconds ago
iie4bu@hostdocker:~$

可以看到wordpress最终运行在swarm-manager节点上:

vincent@swarm-manager:~$ docker container ls
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                PORTS                                     NAMES
615f80f418e7        wordpress:latest                         "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes          80/tcp                                    wordpress.1.qclnrwt9aj7voog129juf1kss

接下来我们准备访问wordpress服务,我们已经将端口暴露到80端口上,查看swarm-manager的IP地址是192.168.152.45

访问192.168.152.45可以成功访问!

查看swarm-manager上的demo网络,container中的内容如下:

        "Containers": {"b2a8fc394934297364b0f4468e83928d914f0b154ac1dbb027d7c787def6bb8b": {"Name": "wordpress.1.2qaocpzdv0kg0v59nd1img2hk","EndpointID": "422acc517ee8ddafed7a6a439aefd867a54d896f609327eb2d53e348e9510d30","MacAddress": "02:42:0a:00:01:13","IPv4Address": "10.0.1.19/24","IPv6Address": ""}},

查看swarm-worker1上的demo网络,container中的内容如下:

            "2a21ab0bfd6afb1d8b850660eccf68f8b8728d4fb72f6a40572d3c87b9618018": {"Name": "mysql.1.a4uhjsjt25sj2df39t2dfi9va","EndpointID": "2ade77f2074c5009c62fa70841dcdc999bd30c7d129d5789ac31740b44949006","MacAddress": "02:42:0a:00:01:11","IPv4Address": "10.0.1.17/24","IPv6Address": ""},

有意思的事情是:当我们访问swarm-worker1的ip是同样也出现了wordpress页面!原因我们在后面一节详细说明。

我们在创建mysql和wordpress之前我们是先在swarm-manager上创建了一个overlay的network。而在swarm-worker1和swarm-worker2上并没有看到刚刚创建的network。而我们创建完service之后,在swarm-worker2上看到了创建的network。这就是swarm的一个机制。因为当一个service被分配到一个节点之后为了保持与swarm-manager通信,overlay的网络一定要同步。

我们之前在讲docker的多机网络的时候讲过,多机overlay network使用了etcd工具,在swarm 模式下并不需要这个工具,因为swarm底层的机制是已经同步了网络的创建,因为要通过overlay网络实现多个容器的同步通信。

从零开始学习docker(十八)Swarm mode 部署wordpress相关推荐

  1. 从零开始学习docker(八)多台机器通信

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 在上一节中,我们介绍了在同一个机器里面同一个docker里面不同的容器如何进行通信的.这一节我们介绍如何在不同的 ...

  2. 从零开始学习jQuery (十) jQueryUI常用功能实战

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

  3. 从零开始学习CANoe(八)—— IG 模块

    相关文章 从零开始学习CANoe(一)-- 新建工程 从零开始学习CANoe(二)-- CANdb++ 创建 dbc文件 从零开始学习CANoe(三)-- 系统变量的创建和使用 从零开始学习CANoe ...

  4. python新手教程 从零开始-Python零基础从零开始学习Python十分钟快速入门

    原标题:Python零基础从零开始学习Python十分钟快速入门 学习Python的,都知道Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.Python是一种动态解释型的 ...

  5. Docker swarm 实战-部署wordpress

    Docker swarm 实战-部署wordpress 创建一个overlay的网络 docker network create -d overlay demo6imq8da3vcwvj2n499k4 ...

  6. 花书+吴恩达深度学习(十八)迁移学习和多任务学习

    目录 0. 前言 1. 迁移学习 2. 多任务学习 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十八)迁移学习和多任务学习 花书+吴恩达深度学习(十 ...

  7. Java学习系列(十八)Java面向对象之基于UDP协议的网络通信

    UDP协议:无需建立虚拟链路,协议是不可靠的. A节点以DatagramSocket发送数据包,数据报携带数据,数据报上还有目的目地地址,大部分情况下,数据报可以抵达:但有些情况下,数据报可能会丢失 ...

  8. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置...

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置 Download JetBrains Python IDE :: PyCharm http://ww ...

  9. windows内核开发学习笔记十八:IRP 处理的标准模式

    windows内核开发学习笔记十八:IRP 处理的标准模式 在 Windows 内核中的请求基本上是通过 I/O Request Packet 完成的. I/O manager ---> Dis ...

  10. Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件

    Polyworks脚本开发学习笔记(十八)-用SDK开发Polyworks插件 插件是由PolyWorks加载的动态链接库(DLL文件),然后查询Polyworks模块,以确定它们具有哪些功能,提供给 ...

最新文章

  1. 解释个人计算机与多用户系统之间的区别,计算机导论问答题答案
  2. “臭名昭著”的他们终于被裁了!字节宣布将精简HR团队,网友:业界毒瘤!...
  3. 彻底疯了,要给雷锋开博客?
  4. 开源java性能分析工具_Java性能监控:您应该知道的5个开源工具
  5. javascript-演练-二级联动下拉框
  6. 深度学习(四十)caffe使用点滴记录
  7. 一图看懂软件缺陷检查涉及的内容
  8. html5用户注册页面代码,HTML5注册页面示例代码_html5教程技巧
  9. vlfeat matlab怎么用,VLFeat在matlab中的使用
  10. python取绝对值fab_Python transforms.CenterCrop方法代碼示例
  11. android 抓取解析systrace
  12. C++中继承时的重载和重新定义
  13. (原創) 如何使用ModelSim-Altera對Nios II仿真? (SOC) (Nios II) (SOPC Builder) (ModelSim) (DE2)...
  14. Chrome实现独立代理
  15. Android NFC开发详解 总结和NFC读卡实例解析
  16. DSO Framer 使用介绍(ZZ)转
  17. 安卓恶意锁屏APP分析
  18. pmon下修改分辨率示范
  19. 巧用Word目录和标题
  20. 阿里巴巴 Java开发手册

热门文章

  1. 计算机主机漏电,电脑机箱漏电怎么办?机箱电源漏电原因及解决方法
  2. 阿里云可以外链mysql_案例详细说明阿里云下设置MySQL远程连接步骤
  3. Centos7 安装 Elasticsearch7.10(不错可以试试)
  4. Goland提示Unresolved reference ***错误解决
  5. CSS的clear去除清除浮动元素
  6. PHPstorm文件默认后缀
  7. Linux的Apache报错(20014)Internal error: Error retrieving pid file logs/httpd.pid
  8. java 流程控制_Java流程控制
  9. php 获取时间段 今天昨天本周上周本月上月本季度本年去年
  10. PHP深复制与浅复制