从docker到istio之二 - 使用compose部署应用

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 这是第二篇,使用compose部署应用,同样演示都在docker2istio目录。

image.png


前言



容器化,云原生越演越烈,新概念非常之多。信息爆炸的同时,带来层层迷雾。我尝试从扩容出发理解其脉路,经过实践探索,整理形成一个入门教程,包括下面四篇文章。



这是第二篇,使用compose部署应用,同样演示都在docker2istio目录。


compose



Compose是一个用于定义和运行多容器Docker应用程序的工具,采用python编写。


部署应用及测试



编写应用部署文件


compose部署应用,采用编写docker-compose.yml


version: '3'
services:
  redis:
    image: redis:4-alpine3.8
    restart: always
  flaskapp:
    depends_on:
      - redis
    build: ./app
    image: flaskapp:0.0.2
    links:
      - redis
  nginx:
    image: nginx:1.15.8-alpine
    depends_on:
      - flaskapp
    volumes:
      - ./nginx:/etc/nginx/conf.d
    restart: always
    ports:
      - "80:80"
    environment:
      - NGINX_PORT=80
    links:
      - flaskapp


这里描述了下面几件事情:


  1. 依次启动redisflaskappnginx 三个服务。服务顺序由depends_on 决定。
  2. 使用build命令,自动编译 flaskapp:0.0.2
  3. 使用links命令,描述服务间依赖。
  4. 使用ports导出端口,使用volumes挂载数据卷。


这一过程,把第一篇中启动容器的过程,语义化,流程更清晰。


启动应用


启动应用,使用docker-compose up 命令:


Creating network "docker2istio_default" with the default driver
Building flaskapp
Step 1/5 : FROM python:3.6-alpine
 ---> 1d981af1e3b4
Step 2/5 : WORKDIR /code
 ---> Using cache
 ---> 7f2b07b16752
Step 3/5 : RUN pip install redis flask
 ---> Using cache
 ---> 79e39b6c2e93
Step 4/5 : ADD . /code
 ---> 4266029c0709
Step 5/5 : CMD ["python", "flaskapp.py"]
 ---> Running in 56e799a2fb61
Removing intermediate container 56e799a2fb61
 ---> 1a61773c4c07
Successfully built 1a61773c4c07
Successfully tagged flaskapp:0.0.2
WARNING: Image for service flaskapp was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating docker2istio_redis_1 ... done
Creating docker2istio_flaskapp_1 ... done
Creating docker2istio_nginx_1    ... done
Attaching to docker2istio_redis_1, docker2istio_flaskapp_1, docker2istio_nginx_1
flaskapp_1  |  * Serving Flask app "flaskapp" (lazy loading)
flaskapp_1  |  * Environment: production
flaskapp_1  |    WARNING: Do not use the development server in a production environment.
flaskapp_1  |    Use a production WSGI server instead.
flaskapp_1  |  * Debug mode: on
redis_1     | 1:C 09 Apr 12:06:15.892 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1     | 1:C 09 Apr 12:06:15.893 # Redis version=4.0.12, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1     | 1:C 09 Apr 12:06:15.893 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
flaskapp_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
flaskapp_1  |  * Restarting with stat
flaskapp_1  |  * Debugger is active!
redis_1     | 1:M 09 Apr 12:06:15.894 * Running mode=standalone, port=6379.
redis_1     | 1:M 09 Apr 12:06:15.894 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1     | 1:M 09 Apr 12:06:15.894 # Server initialized
flaskapp_1  |  * Debugger PIN: 323-612-506
redis_1     | 1:M 09 Apr 12:06:15.894 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1     | 1:M 09 Apr 12:06:15.894 * Ready to accept connections


启动日志中,展示了创建网络,编译镜像,启动容器这几个过程


访问应用


使用 docker-compose ps 检查服务状况:


Name                        Command               State         Ports
-------------------------------------------------------------------------------------
docker2istio_flaskapp_1   python flaskapp.py               Up
docker2istio_nginx_1      nginx -g daemon off;             Up      0.0.0.0:80->80/tcp
docker2istio_redis_1      docker-entrypoint.sh redis ...   Up      6379/tcp


当然,compose也是使用docker,也可以 docker ps


CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                NAMES
c96fd468c415        nginx:1.15.8-alpine   "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   docker2istio_nginx_1
b61d1d0ca201        flaskapp:0.0.2        "python flaskapp.py"     3 minutes ago       Up 3 minutes                             docker2istio_flaskapp_1
73a2359655d2        redis:4-alpine3.8     "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        6379/tcp             docker2istio_redis_1


对比可见 docker-compose ps ,更偏应用层。


然后访问服务:


➜  ~ curl http://127.0.0.1
Hello World by 172.19.0.3 from 172.19.0.1 ! 该页面已被访问 1 次。


应用扩容


使用 docker-compose up --scale flaskapp=2flaskapp进行扩容。


查看扩容的结果:


➜  docker2istio docker-compose ps
         Name                        Command               State         Ports
-------------------------------------------------------------------------------------
docker2istio_flaskapp_1   python flaskapp.py               Up
docker2istio_flaskapp_2   python flaskapp.py               Up
docker2istio_nginx_1      nginx -g daemon off;             Up      0.0.0.0:80->80/tcp
docker2istio_redis_1      docker-entrypoint.sh redis ...   Up      6379/tcp


刷新访问应用


➜  docker2istio curl http://127.0.0.1
Hello World by 172.20.0.4 from 172.20.0.1 ! 该页面已被访问 101 次。
➜  docker2istio curl http://127.0.0.1
Hello World by 172.20.0.3 from 172.20.0.1 ! 该页面已被访问 102 次。


同时观察服务日志输出:


nginx_1     | 172.22.0.1 - - [10/Apr/2019:01:38:02 +0000] "GET / HTTP/1.0" 200 76 "-" "ApacheBench/2.3" "-"
flaskapp_1  | [2019-04-10 01:38:02,140] DEBUG in flaskapp: Hello out 172.22.0.3 172.22.0.1 65:
flaskapp_1  | 172.22.0.5 - - [10/Apr/2019 01:38:02] "GET / HTTP/1.0" 200 -
flaskapp_1  | [2019-04-10 01:38:02,141] DEBUG in flaskapp: Hello out 172.22.0.3 172.22.0.1 63:
flaskapp_2  | [2019-04-10 01:38:02,145] DEBUG in flaskapp: hello in
flaskapp_1  | 172.22.0.5 - - [10/Apr/2019 01:38:02] "GET / HTTP/1.0" 200 -
nginx_1     | 172.22.0.1 - - [10/Apr/2019:01:38:02 +0000] "GET / HTTP/1.0" 200 76 "-" "ApacheBench/2.3" "-"
flaskapp_1  | [2019-04-10 01:38:02,150] DEBUG in flaskapp: hello in
flaskapp_2  | [2019-04-10 01:38:02,151] DEBUG in flaskapp: hello in
nginx_1     | 172.22.0.1 - - [10/Apr/2019:01:38:02 +0000] "GET / HTTP/1.0" 200 76 "-" "ApacheBench/2.3" "-"
flaskapp_2  | [2019-04-10 01:38:02,153] DEBUG in flaskapp: Hello out 172.22.0.4 172.22.0.1 67:
flaskapp_2  | 172.22.0.5 - - [10/Apr/2019 01:38:02] "GET / HTTP/1.0" 200 -
nginx_1     | 172.22.0.1 - - [10/Apr/2019:01:38:02 +0000] "GET / HTTP/1.0" 200 76 "-" "ApacheBench/2.3" "-"
flaskapp_2  | [2019-04-10 01:38:02,156] DEBUG in flaskapp: Hello out 172.22.0.4 172.22.0.1 69:
flaskapp_1  | [2019-04-10 01:38:02,156] DEBUG in flaskapp: hello in
flaskapp_2  | 172.22.0.5 - - [10/Apr/2019 01:38:02] "GET / HTTP/1.0" 200 -
flaskapp_1  | [2019-04-10 01:38:02,159] DEBUG in flaskapp: hello in
flaskapp_2  | [2019-04-10 01:38:02,161] DEBUG in flaskapp: hello in
nginx_1     | 172.22.0.1 - - [10/Apr/2019:01:38:02 +0000] "GET / HTTP/1.0" 200 76 "-" "ApacheBench/2.3" "-"
flaskapp_1  | [2019-04-10 01:38:02,160] DEBUG in flaskapp: Hello out 172.22.0.3 172.22.0.1 70:


对比纯docker的方式,扩容变简单了。


需要注意的是:扩容过程中要重启nginx服务,否则虽然容器扩充成多个,但是服务流量并不会分配到新容器。不过容器启动和创建非常迅速,可以先docker-compose down再行扩容启动。


docker-compose scale Note: This command is deprecated. Use the up command with the --scale flag instead. Beware that using up with --scale flag has some subtle differences with the scale command as it incorporates the behaviour of up command.


清理应用


使用 docker-compose down 一键清理应用


Removing docker2istio_nginx_1    ... done
Removing docker2istio_flaskapp_2 ... done
Removing docker2istio_flaskapp_1 ... done
Removing docker2istio_redis_1    ... done
Removing network docker2istio_default


总结



compose 已经实现了容器扩容自动挡:


  1. 更直观的控制容器启动顺序及依赖。
  2. 使用便捷,扩容方便。


不过compose的自动挡,充其量只是一个摩托版,作为小型/测试应用的部署方案还是不错。如果是大型/正式应用,还有以下缺点:


  1. 扩容不能够无缝,需要重启服务。
  2. 单纯的compose不支持多机互联。


要实现多机部署扩容,就需要使用到 kubernetes的容器编排方案了。从部署到编排,单字面理解,看起来能够维护的容器量都增长了。相比 docker 家的swarm+machine方案, kubernetes 已经是容器编排领域的事实标准,更值得学习了解。


推荐



  1. harbor harbor应用包括多个服务,推荐部署方式就是compose。


  1. gogs-drone-docker 。演示了如何快速使用docker compose 搭建一个ci系统。



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
8天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
59 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
7天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
7天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
9天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
9天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
20 1
|
9天前
|
NoSQL Redis Docker
【赵渝强老师】使用Docker Compose管理容器
Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。
|
3月前
|
运维 Java Devops
阿里云云效操作报错合集之部署docker时遇到报错,该怎么办
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
运维 Kubernetes 前端开发
【云原生】阿里云服务器部署 Docker Swarm集群
阿里云服务器 一键部署 Docker Swarm 集群!
675 0
【云原生】阿里云服务器部署 Docker Swarm集群
|
弹性计算 数据可视化 关系型数据库
使用阿里云部署基于docker的mysql云服务
本篇文章将介绍如何使用阿里云安装docker、部署mysql服务,并远程连接至远端mysql
684 1
使用阿里云部署基于docker的mysql云服务
|
弹性计算 Shell Docker
阿里云一键部署 Docker Datacenter
使用ROS模板在阿里云上一键部署Docker Datacenter
7828 0