(2)创建revprox_cert、revprox_key以及postgress_password密钥 。
$ docker secret create revprox_cert domain.crtcqblzfpyv5cxb5wbvtrbpvrrj$ docker secret create revprox_key domain.keyjqd1ramk2x7g0s2e9ynhdyl4p$ docker secret create postgres_password domain.keynjpdklhjcg8noy64aileyod6l
(3)创建stage_token密钥 。
$ echo staging | docker secret create staging_token -sqy21qep9w17h04k3600o6qsj
(4)列出所有密钥 。
$ docker secret lsIDNAMECREATEDUPDATEDnjp...d6lpostgres_password47 seconds ago47 seconds agocqb...rrjrevprox_certAbout a minute agoAbout a minute agojqd...l4prevprox_keyAbout a minute agoAbout a minute agosqy...qsjstaging_token23 seconds ago23 seconds ago
上面已经完成了全部的前置准备 。是时候开始部署应用了!
2.部署示例应用如果还没有代码,请先复制应用的GitHub仓库到Swarm管理节点 。
$ git clone https://github.com/dockersamples/atsea-sample-shop-app.gitCloning into 'atsea-sample-shop-app'...remote: Counting objects: 636, done.Receiving objects: 100% (636/636), 7.23 MiB | 3.30 MiB/s, done. remote:Total 636 (delta 0), reused 0 (delta 0), pack-reused 636 Resolvingdeltas: 100% (197/197), done.Checking connectivity... done.$ cd atsea-sample-shop-app
现在已经拥有了源码,可以开始部署应用了 。
Stack通过docker stack deploy命令完成部署 。基础格式下,该命令允许传入两个参数 。
- Stack文件的名称 。
- Stack的名称 。
在Swarm管理节点的atsea-sample-shop-app目录下运行下面的命令 。
部署Stack(应用) 。
$ docker stack deploy -c docker-stack.yml seastackCreating network seastack_defaultCreating network seastack_back-tierCreating network seastack_front-tierCreating network seastack_paymentCreating service seastack_databaseCreating service seastack_appserverCreating service seastack_visualizerCreating service seastack_payment_gatewayCreating service seastack_reverse_proxy
读者可以运行docker network ls以及docker service ls命令来查看应用的网络和服务情况 。下面是命令输出中几个需要注意的地方 。
网络是先于服务创建的 。这是因为服务依赖于网络,所以网络需要在服务启动前创建 。
Docker将Stack名称附加到由他创建的任何资源名称前作为前缀 。在本例中,Stack名为seastack,所以所有资源名称的格式都如:seastack_<resource> 。例如,payment网络的名称是seastack_payment 。而在部署之前创建的资源则没有被重命名,比如密钥 。
另一个需要注意的点是出现了新的名为seastack_default的网络 。该网络并未在Stack文件中定义,那为什么会创建呢?每个服务都需要连接到网络,但是visualizer服务并没有指定具体的网络 。因此,Docker创建了名为seastack_default的网络,并将visualizer连接到该网络 。
读者可以通过两个命令来确认当前Stack的状态 。docker stack ls列出了系统中全部Stack,包括每个Stack下面包含多少服务 。docker stack ps <stack-name>针对某个指定Stack展示了更详细的信息,例如期望状态以及当前状态 。下面一起来了解下这两条命令 。
$ docker stack lsNAMESERVICESSeastack5$ docker stack ps seastackNAMENODEDESIRED STATECURRENT STATEseastack_reverse_proxy.1wrk-2RunningRunning 7 minutes agoseastack_payment_gateway.1wrk-1RunningRunning 7 minutes agoseastack_visualizer.1mgr-1RunningRunning 7 minutes agoseastack_appserver.1wrk-2RunningRunning 7 minutes agoseastack_database.1wrk-2RunningRunning 7 minutes agoseastack_appserver.2wrk-1RunningRunning 7 minutes ago
在服务启动失败时,docker stack ps命令是首选的问题定位方式 。该命令展示了Stack中每个服务的概况,包括服务副本所在节点、当前状态、期望状态以及异常信息 。从下面的输出信息中能看出reverse_proxy服务在wrk-2节点上两次尝试启动副本失败 。$ docker stack ps seastackNAMENODEDESIREDCURRENT ERRORSTATESTATEreverse_proxy.1wrk-2ShutdownFailed"task: non-zero exit (1)"_reverse_proxy.1wrk-2ShutdownFailed"task: non-zero exit (1)"
如果想查看具体某个服务的详细信息,可以使用docker service logs命令 。读者需要将服务名称/ID或者副本ID作为参数传入 。如果传入服务名称或ID,读者可以看到所有服务副本的日志信息 。如果传入的是副本ID,读者只会看到对应副本的日志信息 。下面的docker service logs命令展示了seastack_reverse_proxy服务的全部副本日志,其中包含了前面输出中的两次副本启动失败的日志 。
推荐阅读
- Mac使用Socket报错
- 如何使用Python执行js代码
- 使用Swoole协程实现 WebRTC 信令服务器
- 利用docker部署solo并升级为https
- Mybaits中Like 的使用方式以及一些注意点
- 人马该怎样玩?
- 使用 Go 语言实现凯撒加密
- 对讲机电池原理和使用注意事项
- 学会这些,操作docker image镜像就够了
- 使用cors完成跨域请求处理