• Docker 入门 第三部分: 服务


    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
    
  • 相关阅读:
    死锁及预防
    Java中的接口和抽象类
    Jmeter执行java脚本结束时提示:The JVM should have exited but did not.
    dubbo服务的group和version
    Dubbo-admin无法显示Group分组信息
    Python中的变量、引用、拷贝和作用域
    记一次调试python内存泄露的问题
    使用gdb调试python程序
    dstat用法;利用awk求dstat所有列每列的和;linux系统监控
    flask到底能登录多少用户?
  • 原文地址:https://www.cnblogs.com/resn/p/9582333.html
Copyright © 2020-2023  润新知