github仓库:https://github.com/azzinoths0...以及集群相关对象SWARM$dockerswarm--helpUsage:dockerswarmCOMMANDManageSwarmCommands:ca显示和旋转rootCAinit初始化swarm加入作为节点和/或管理器加入join-token管理加入令牌leave离开swarmunlock解锁swarmunlock-key管理解锁密钥更新更新swarmRun'dockerswarmCOMMAND--help'for有关命令的更多信息。创建swarm集群,启动manager:dockerswarminit--listen-addr192.168.99.200:2377--advertise-addr192.168.99.200此时会输出加入swarm集群的方式:dockerswarmjoin--tokenSWMTKN-1-0nbwp5l3wsrtvf1hhrzf7dxbabpvitzo2ssyjqhnymg7d2ypzr-b1v1t5lnabvr4ojw9xe7eugkk192.168.99.200:2377如果没有记住的话:dockerswarmjoin-tokenworker依旧会输出:dockerswarmjoin--tokenSWMTKN-1-0nbwp5l3wsrtvf1hhrzf7dxbabpvitzo2ssyjqhnymg7d2ypzr-b1v1t5lnabvr4ojw9xe7eugkk192.168.99.200:2377在另一台节点上执行dockerswarmjoin--tokenSWMTKN-1-0nbwp5l3wsrtvf1hhrzf7dxbabpvitzo2ssyjqhnymg7d2ypzr-b1v1t5lnabvr4ojw9xe7eugkk192.168.99.200:2377NODE运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点(node)$dockernode--helpUsage:dockernodeCOMMANDManageSwarmnodesCommands:demote将一个或多个节点从集群中的管理器中降级inspect显示一个或多个节点的详细信息ls列出集群中的节点promote将一个或多个节点提升为集群中的管理器ps列出在一个或多个节点上运行的任务,默认为当前节点rm从swarm更新中删除一个或多个节点dockernodelsIDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUSENGINEVERSIONv1oo73vt40hnjivnhnw78po4u*dameng-00ReadyActiveLeader18.09.8-ceyrz7drszt4hq5j8c8rbhoexqcdameng-01ReadyActive18.09.8-ceSTACKStack可以说stadockerCompose是升级版:ck--helpUsage:dockerstack[OPTIONS]COMMANDManageDockerstacksOptions:--kubeconfigstringKubernetes配置文件--orchestratorstringOrchestratortouse(swarm|kubernetes|all)Commands:deploy部署新堆栈或更新现有堆栈ls列出堆栈ps列出堆栈中的任务rm删除一个或多个堆栈服务列出堆栈中的服务部分目录:#compose:$docker-compose-fCONFIG-YAMLup#stack:$dockerstackdeploy-cCONFIG-YAMLSTACK-NAME查看:#compose:$docker-composeps$dockerps#stack:$dockernodels$dockerstackls$dockerservicels最终停止:#compose:$docker-compose-fCONFIG-YAMLdown#stack:$dockerstackrmSTACK-NAME网络:单机vs跨节注意事项:dockerstack默认使用的是swarm,但也可以对接k8s的SERVICE$dockerservice--helpUsage:dockerserviceCOMMANDManageservicesCommands:createCreateanewserviceinspectDisplaydetailedinformationononeor更多服务日志获取服务或任务的日志ls列出服务ps列出一个或多个服务的任务rm删除一个或多个服务回滚恢复对服务配置的更改scale一个或多个复制的服务update更新serviceRun'dockerserviceCOMMAND--查看:$dockerservicelsIDNAMEMODEREPLICASIMAGEPORTSoyiesfc3biiqmyapp_myappreplicated1/1friendlyhello:v3*:5000->5000/tcpxrk7kska1z76myapp_redisreplicated1/1redis:latest扩展:$dockerservicescalemyapp_myapp=2IDNAMEMODEREPLICASIMAGEPORTSoyiesfc3biiqmyapp_myappreplicated2/2friendlyhello:v3*:5000->5000/tcpxrk7kska1z76myapp_redisreplicated1/1redis:latestTRYITOUT:Deployfriendlyhello我们可以使用DockerMachine快速创建一个虚拟Docker主机,然后我们将创建2个新的Docker主机并将它们加入集群STEP1:创建一个Swarm集群-管理节点首先是一个管理节点,通过ssh创建并连接:$docker-machinecreate-dvirtualboxmanager$docker-machinesshmanager我们可以看到:然后,我们使用dockerswarminit从这个节点初始化一个蜂群。如果Docker主机有多个IP(多个网卡),必须使用--advertise-addr指定一个:$dockerswarminit--advertise-addr192.168.99.107可以看到:现在我们的Manager节点就是管理节点刚刚创建的集群,记得复制它输出的命令来添加一个工作节点。STEP2:添加项目文件接下来我们Manager节点的~/try-it-out-4里添加几个文件:app.pyDockerfiledocker-stack.yaml$mkdirtry-it-out-4$cdtry-it-out-4$viapp.py$viDockerfile$vidocker-stack.yaml$dockerbuild-tfriendlyhello.app.pyfromflaskimportFlaskfromredisimportRedis,RedisErrorimportosimportsocket#ConnecttoRedisredis=Redis(host="redis",db=0,socket_connect_timeout=2,socket_timeout=2)app=Flask(__name__)@app.route("/")defhello():try:visits=redis.incr("counter")除了RedisError:visits="无法连接到Redis,计数器已禁用"html="
Hello{name}!
"\"Hostname:{hostname}"\"Visits:{visits}"返回html.format(name=os.getenv("NAME","world"),hostname=socket.gethostname(),visits=visits)if__name__=="__main__":app.run(host='0.0.0.0',port=5000)DockerfileFROMpython:3.7-slimWORKDIR/appCOPY。/appRUNpipinstallflaskredis-ihttps://mirrors.aliyun.com/pypi/simple--trusted-hostmirrors.aliyun.comEXPOSE5000ENVNAMEWorldCMD["python","app.py"]docker-stack.yamlversion:"3"services:myapp:image:friendlyhellocontainer_name:myappports:-5000:5000environment:NAME:Worldredis:image:rediscontainer_name:webSTEP3:创建一个Swarm集群-工作节点继续,让我们创建一个工作节点:先回到宿主机:$exit然后新建一个虚拟机worker,通过上面复制的命令加入集群:$docker-machinecreate-dvirtualboxworker$docker-machinesshworker$dockerswarmjoin--tokenSWMTKN-1-3wd0vdozskitmpw5vofkjc9ie6251wuno21dmbugqk56pd97iv-eu9w5gkkmy7chvgcwt7j71iu4192.168.99.107:2377我们可以看到:STEP4:使用Stack部署服务我们先回到manager节点:$exit$docker-machinesshmanager然后使用dockerstackdeploy部署服务,其中The-c参数指定docker-stack.yaml文件:$dockerstackdeploy-c~/try-it-out/docker-stack.yamlfriendlyhelloisdeployedSTEP5:Accessfriendlyhello现在通过集群任意节点的IP访问了这个flask项目:TRYITOUT:部署postgresql,我们继续使用上一个Case的集群。进入manager节点,在try-it-out-5新建一个docker-stack.yaml:$docker-machinesshmanager$mkdirtry-it-out-5$vidocker-stack.yamldocker-stack.yamlversion:'3.1'services:db:image:postgres命令:postgres-c'shared_buffers=512MB'-c'max_connections=2000'restart:alwaysenvironment:POSTGRES_USER:damengPOSTGRES_PASSWORD:pythonicports:-5432:5432volumes:-pgdata:/var/lib/postgresql/dataadminer:image:adminerrestart:alwaysports:-8998:8080volumes:pgdata:Thendeploy:$dockerstackdeploy-cdocker-stack.yamlpostgresql然后就可以从8998端口访问GUI了: