Docker 入门 第三部分: 服务

先决条件

  • 安装 Docker 1.13 或更高版本
  • 获取 Docker Compose。在Docker for MacDocker for Windows 上它已经预安装,因此你可以随时使用。在Linux系统上你需要安装一下Docker Compose。在没有Hyper-V的win10之前的系统,使用Docker Toolbox
  • 阅读第一部分的定位介绍
  • 学习第二部分:如何创建容器
  • 确保你已经将你创建的 friendlyhello 镜像发布到一个 registry。我们在这里使用该镜像。
  • 确保你的镜像已经作为一个部署的容器运行。运行一下命令,将 username、repo 和tag插入你的信息。然后浏览 http://localhost:4000/
docker run -p 4000:80 username/repo:tag

介绍

在分布式应用中,应用的不同部分被成为“服务”。例如,一个视频分享网站,它可能包含在数据库中存储应用数据的服务,用户上传视频后在后台做视频转码的服务,前端服务,等等。

实际上,服务只是“生产环境中的容器”。一个服务只运行在一个镜像中,但是它编排了镜像的运行方式——应该使用那些端口,应该运行多少个容器副本来让服务有它需要的能力,等等。扩展服务会改变该运行中的软件部分的容器实例的数量,从而在流程中为服务分配更多的计算资源。

幸运的是,使用Docker 平台定义、运行和扩展服务都非常容易——只需要编写一个docker-compose.yml文件即可。

你的第一个 docker-compose.yml 文件

docker-compose.yml是一个YAML文件,定了一Docker容器在生产环境中应该如何工作。

docker-compose.yml

将这个文件另存为 docker-compose.yml,保存到你想保存的位置,确保你在第二部分中创建的镜像已经发布到registry,通过把username/repo:tag替换为你的镜像的信息来更新这个.yml文件。

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去做以下事情:

  • 从registry中拉取我们在第二部分创建的镜像
  • 把镜像的5个实例作为名为web的服务运行,限制每个服务最多使用10%的CPU(跨所有核心)和50MB内存。
  • 如果其中一个服务失败则立刻重启容器
  • 映射主机的4000端口到web的80端口
  • 指示 web的容器通过叫做webnet的负载均衡网络来共昂80端口(在内部,容器自己在一个临时端口发布web的80湍口)
  • 使用默认设置定义webnet网络(它是一个负载覆盖网络:overlay network覆盖网络的定义可以自定搜索)

运行你新建的负载均衡应用

在我们使用docker stackdeploy命令之前,先执行:

docker swarm init

注意:我们会在第四部门介绍该命令的含义。如果你不运行docker swarm init,你会得到一个“this node is not a swarm manager”的错误消息。

现在我们运行它,你需要给你的应用起一个名字,在这里,名字是getstartedlab

docker stack deploy -c docker-compose.yml getstartedlab

现在我们的单服务堆栈在一台主机上运行了已部署镜像的5个容器实例。我们可以查看一下。

获取我们应用程序中的一个服务的服务ID:

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,查看部署的重新配置的实例,如果你扩展了副本数量,那么会启动更多的任务,也会因此启动更多的容器。

卸载应用和swarm

  • 使用 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

Docker 入门 第三部分: 服务的更多相关文章

  1. docker入门与部署微服务--学习笔记

    最近公司进一步去windows,走向 linux+云化. 原来的一大坨windows虚拟机服务器都要转向linux, 既然走向linux的话,那么docker肯定是要涉足的. 故学习了docker入门 ...

  2. Docker入门(三)使用Docker Compose

    Compose介绍   Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 ...

  3. Docker入门(三):容器(Containers)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  4. Docker 入门指南——部署常用服务示例

    MongoDB FROM centos:centos7 MAINTAINER The CentOS Project <cloud-ops@centos.org> RUN yum -y up ...

  5. docker从零开始(三)服务初体验docker compose

    决条件 安装Docker 1.13或更高版本. 获取Docker Compose.在适用于Mac的Docker和适用于Windows的Docker上,它已预先安装,因此您可以随意使用.在Linux系统 ...

  6. Docker入门实践(三) 基本操作

    Docker安装完毕.我们就能够试着来执行一些命令了.看看docker能够干什么. (一) 创建一个容器 首先.让我们执行一个最简单的容器,hello-world.假设安装没有问题.并执行正确的话,应 ...

  7. docker入门(三)

    docker容器IP"暴露"到外网(宿主机外) 首先将docker容器IP固定 Docker自身的4种网络工作方式,简略说明下: host模式,使用--net=host指定. co ...

  8. 第三章 Docker 入门

    第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...

  9. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

随机推荐

  1. centos安装图形化界面

    用下面命令查看查看是哪个模式 systemctl get-default 开机启动图形界面 systemctl set-default graphical.target(图形界面模式) reboot( ...

  2. spring 文件加载 通过listener的类获取配置文件 并加载到spring容器中

  3. BZOJ4764弹飞大爷——LCT

    题目描述 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们 决定齐心合力构造一个下面这样的序列.这个序列共有N项,每项都代表了一个小伙伴的力量值, ...

  4. java项目http变更https

    1. 创建 keystore 文件 执行keytool -genkey -v -alias tomcat -keyalg RSA   -validity 3650  -keystore c:\tomc ...

  5. Deep Learning(深度学习)学习笔记整理系列 一

    声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部 ...

  6. 自学Python1.5-Centos内python2识别中文

    自学Python之路 自学Python1.5-Centos内python2识别中文 方法一,python推荐使用utf-8编码方案 经验一:在开头声明: # -*- coding: utf-8 -*- ...

  7. 创建首个 Android 项目

    Android 项目包括构成你的 Android 应用的源代码的所有文件. 利用 Android SDK 工具可以简单的创建 默认项目目录和文件来开始一个新的 Android 项目. 本节课展示了如何 ...

  8. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)

    [LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...

  9. numpy random

    np.random.seed()用法: np.random.seed(5) print(np.random.permutation(np.array([i for i in range(9)]))) ...

  10. c c++ 混合编译

    单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 1 2 3 4 5 6 7 8 9 /* helloworld.cpp */    # ...