目录html
friendlyhello
镜像发布到一个 registry。咱们在这里使用该镜像。http://localhost:4000/
。docker run -p 4000:80 username/repo:tag
在分布式应用中,应用的不一样部分被成为“服务”。例如,一个视频分享网站,它可能包含在数据库中存储应用数据的服务,用户上传视频后在后台作视频转码的服务,前端服务,等等。
实际上,服务只是“生产环境中的容器”。一个服务只运行在一个镜像中,可是它编排了镜像的运行方式——应该使用那些端口,应该运行多少个容器副原本让服务有它须要的能力,等等。扩展服务会改变该运行中的软件部分的容器实例的数量,从而在流程中为服务分配更多的计算资源。前端
幸运的是,使用Docker 平台定义、运行和扩展服务都很是容易——只须要编写一个docker-compose.yml
文件便可。node
docker-compose.yml
文件docker-compose.yml
是一个YAML文件,定了一Docker容器在生产环境中应该如何工做。python
将这个文件另存为 docker-compose.yml
,保存到你想保存的位置,确保你在第二部分中建立的镜像已经发布到registry,经过把username/repo:tag
替换为你的镜像的信息来更新这个.yml
文件。git
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet:
这个 docker-compose.yml
文件告诉Docker去作如下事情:github
在咱们使用docker stackdeploy
命令以前,先执行:web
docker swarm init
注意:咱们会在第四部门介绍该命令的含义。若是你不运行
docker swarm init
,你会获得一个“this node is not a swarm manager”的错误消息。redis
如今咱们运行它,你须要给你的应用起一个名字,在这里,名字是getstartedlab
:docker
docker stack deploy -c docker-compose.yml getstartedlab
如今咱们的单服务堆栈在一台主机上运行了已部署镜像的5个容器实例。咱们能够查看一下。
获取咱们应用程序中的一个服务的服务ID:shell
docker service ls
在输出中找到以你的应用名字为前缀的输出。若是你命名的可本例中的同样。那它的名字就是getstartedlab_web
。还列出了服务ID,以及副本数量、镜像名称和暴露的端口。
在服务中运行的单个容器叫作task(任务)。任务被赋予递增的数字做为ID,副本运行的最大数量为你在docker-compose.yml
中定义的数量。列出你的服务中的任务:
docker service ps getstartedlab_web
若是你只列出你的系统上的容器,则任务也会被列出,虽然任务不会被服务过滤:
docker container ls -q
你能够运行几回 curl -4 http://localhost:4000
或者在你的浏览器中访问这个URL并刷新几回。
不管哪一种方式,容器ID都会改变,这说明负载均衡在起做用;对于每个请求,都会从5个任务中选一个,以轮询的方式来响应。容器ID和上一个命令的输出相匹配(docker container ls -q)。
在Win10中运行?
Win10的 powershell中默认应该可使用curl,若是没有,你能够安装一个相似 GIT BASH 的终端模拟器或者 下载与之相似的wget for Windows
响应时间慢?
依赖于你的环境的网络配置,容器响应HTTP请求最多可能须要30秒。这并不能代表Docker 或swarm的性能很差,而是一个未知足的redis依赖问题,稍后咱们会在本章讨论。如今,由于相同的缘由,访客计数也不能正常工做,咱们还没添加保存数据的服务。
你能够经过修改docker-compose.yml
中的副本值来扩展应用,保存配置并从新运行docker stack deploy
命令:
docker stack deploy -c docker-compose.yml getstartedlab
Docker执行原地更新,不须要提早关闭服务栈或杀死任何容器。
如今从新运行docker container ls -q
,查看部署的从新配置的实例,若是你扩展了副本数量,那么会启动更多的任务,也会所以启动更多的容器。
使用 docker stack rm
来卸载应用
docker stack rm getstartedlab
卸载swarm
docker swarm leave --force
使用Docker 会很是容器启动和扩展你的应用,你已经向着如何在生产环境运行容器迈出了一大步。接下来,你会学会如何在docker集群上以集群的方式运行这个应用。
注意:Compose文件用于定义Docker 的应用程序,而且可使用 Docker Cloud上传到云服务商,或任何硬件,或你选择的Docker Enterprise Edition 的云服务商。
下面会有一个本页终端操做视频
bash-3.2$ ls docker-compose.yml bash-3.2$ cat docker-compose.yml version: "3" services: web: image: johndmulhausen/get-started:part1 deploy: replicas: 5 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M ports: - "80:80" networks: - webnet networks: webnet: bash-3.2$ docker stack deploy -c docker-compose.yml getstartedlab Creating network getstartedlab_webnet Creating service getstartedlab_web bash-3.2$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b429f44ecb54 johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 2 seconds 80/tcp getstartedlab_web.1.bwvqyil6v2friys3stu1c2rdy 2c4cec03073c johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.2.wefoq9ql6p81kf14fpdixalc6 6fb8a01ff40f johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.4.xn5kvu19hvrri8zuvshwwed8v 206a434234ed johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 2 seconds 80/tcp getstartedlab_web.3.rhg9v9mn05otfwh3zx6lp9gww 3ec2903b7cf7 johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.5.qp8nuzn37oddpmxqry1ssyb7a 3ec2903b7cf7 johndmulhausen/get-started:part1 "python app.py" 6 seconds ago Up 3 seconds 80/tcp getstartedlab_web.5.qp8nuzn37oddpmxqry1ssyb7a bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 206a434234ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> b429f44ecb54<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 2c4cec03073c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 6fb8a01ff40f<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 3ec2903b7cf7<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 206a434234ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> b429f44ecb54<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$ curl http://localhost/ <h3>Hello World!</h3><b>Hostname:</b> 2c4cec03073c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i> bash-3.2$
回顾一下,输入docker run
很简单,在生产环境中容器的真正实现是将其做为一个服务运行,服务在Compose文件中指定容器的行为,而且这个文件能够被用于扩展、限制、重部署咱们的app。使用和启动服务相同的命令,能够在服务运行时,对其进行适当的更改。
在这里须要了解的一些命令以下:
docker stack ls # List stacks or apps docker stack deploy -c <composefile> <appname> # Run the specified Compose file docker service ls # List running services associated with an app docker service ps <service> # List tasks associated with an app docker inspect <task or container> # Inspect task or container docker container ls -q # List container IDs docker stack rm <appname> # Tear down an application docker swarm leave --force # Take down a single node swarm from the manager