Docker系列-(3) Docker-compose使用与负载均衡

上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡。

Docker-compose介绍

实际开发过程中,在一个项目中,我们常将不同的模块放在单独的docker中,方便维护和扩展。比如我们一个项目可能有MySQL镜像、Nginx镜像、Spring Boot后端镜像,我们在实际部署中可以采用上篇文章介绍的方法,分别打包,分别启动;但是这样太费精力,而且还容易出错。
因此Docker-compose工具应运而生,就是为了解决工程部署中的多个Docker镜像的管理问题。

docker-compose.yaml 文件

类似于build镜像需要Dockerfile一样,使用docker-compose时也需要类似的配置文件,叫做docker-compose.yaml。

下面是一个Docker-file的例子:

一般docker-compose文件中需要注意如下几点:

  • version: ‘3‘: 表示使用第三代语法,每代的语法稍有不同,我们选择最新的就好。
  • services: 表示compose需要启动的服务,一般一个docker镜像就可以作为一个单独的service。
  • container_name: 容器名称
  • environment: 容器环境变量,可以使用这个参数往容器传递一些变量,这个在我们切换不同环境配置时非常有用,不用每次去改变代码中的配置
  • ports: 对外开放的端口
  • restart: always表示如果服务启动不成功一直尝试。
  • volumes: 加载本地目录到容器目标路径,也就是将本地路径共享给容器,方便进行数据交互,也可以利用这个功能,将docker的log输出到本机指定的位置。
  • depends_on:依赖服务,先启动?depends_on?服务。
  • command: mvn clean spring-boot:run : 表示以这个命令来启动项目

上面提到了depends_on,通常用于需要顺序启动不同镜像,比如后台需要等待数据库初始化完毕以后才启动,但是这个depends_on并不能保证前序容器完全初始化,意思是只要前序容器启动了,就会尝试启动当前容器。这样还是会造成前序容器未初始化完成,后续容器启动后出现连接失败等错误。

因此最好的方式是官方(https://docs.docker.com/compose/startup-order/)比较推荐的wait脚本,脚本的详细使用可以看这里 https://github.com/vishnubob/wait-for-it,

wait-for-it.sh host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST       Host or IP under test
-p PORT | --port=PORT       TCP port under test
                            Alternatively, you specify the host and port as host:port
-s | --strict               Only execute subcommand if the test succeeds
-q | --quiet                Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
                            Timeout in seconds, zero for no timeout
-- COMMAND ARGS             Execute command with args after the test finishes

一般也可以在制作镜像的时候指定等待一定时间,在下面的例子中,在运行test.jar之前,会一直等到elasticsearch初始化完成。

FROM openjdk:8
ADD ["target/test-1.0.0.jar", "test.jar"]
ADD ["wait-for-it.sh", "wait-for-it.sh"]
RUN ["chmod", "+x", "wait-for-it.sh"]
EXPOSE 1234
ENTRYPOINT ["./wait-for-it.sh", "elastic:9200", "--", "java", "-jar", "/test.jar"]

关于更多docker-compose文件的详细介绍,可以参考官方的文档 https://docs.docker.com/compose/gettingstarted/

docker-compose的启动/停止

docker-compose的启动与停止非常简单,直接使用docker-compose up启动,docker-compose down关闭工程,同时会删除所有容器。

Docker的网络通信

docker的网络方面是相对较弱的,新手如果不清楚,经常会出现为什么容器A访问不到容器B的问题。

容器间的通信

有个很常见的场景,我们需要在本机同时调试前端和后端程序,通常我们会在localhost某个端口启动前端,比如8080;同时在local的另一端口比如1234启动后端。如果不用容器,前端直接在代码里访问localhost:1234的所有接口都是可以的,没有任何问题。

但是如果前端和后端都封装在不同的容器中,这个时候前端直接访问localhost:1234,会报错,无法访问。原因就是两个容器之间是独立的,无法直接localhost访问。

官方推荐的解决办法就是,先新建一个网络,然后启动前后端容器的时候,分别指定在该网络中运行。

docker network create mynet
docker run --network mynet --name frontend ...
docker run --network mynet --name backend ...

现在前端就可以通过 http://backend:1234 访问后端的接口了。

注意:有些博客指出,可以通过docker inspect [container_name]来获取后端容器的ip,然后直接访问ip加端口就可以了。这个在Linux上也许可行,但是mac下由于容器的实现原理不同,无法直接通过ip访问。

docker-compose下的网络环境

默认情况下,当你利用docker-compose启动多个容器时,docker-compose会自动帮你创建一个网络,并将多个service在这个网络中运行。因此不同容器之间,直接利用容器名+端口就可以访问了。

Docker-compose实现负载均衡

实际生产环境中,肯定会启动多个后端service,同时进行负载均衡以保证服务质量。利用docker-compose我们可以方便的实现这种功能。

下面是一个很简单的docker-compose文件,启动之后可以在本地打开localhost:5000,来访问后端的service;在front容器内部,我们也可以通过backend:5000来访问backend service。

version: "3"

services:
  front:
    image: front:latest
  backend:
    image: "backend:latest"
    ports:
      - "5000:5000"

为了启动多个后端程序以实现负载均衡,docker-compose已经为我们提供--scale参数,利用这个参数可以轻松实现同时启动多个service。
下面是该参数的使用说明。

--scale SERVICE=NUM        Scale SERVICE to NUM instances. Overrides the
                           `scale` setting in the Compose file if present.

在这里,我们直接在启动的时候,指定生成3个后端的service,

docker-compose up --scale backend=3

但是这样会报错,因为本机上的5000端口,只能分配给一个service,如果你想同时在本机上调试,可以将上面的ports改为5000,修改后的docker-compose文件如下:

version: "3"

services:
  front:
    image: front:latest
  backend:
    image: "backend:latest"
    ports:
      - "5000"

这样按照上面同样的指令启动之后,你你可以看到如下的输出结果,有3个不同的本机端口绑定到容器的5000端口,

      Name                      Command                  State                Ports
--------------------------------------------------------------------------------------------
example_backend_1   /usr/bin/dumb-init -- /sbi ...   Up (healthy)   0.0.0.0:32776->5000/tcp
example_backend_2   /usr/bin/dumb-init -- /sbi ...   Up (healthy)   0.0.0.0:32775->5000/tcp
example_backend_3   /usr/bin/dumb-init -- /sbi ...   Up (healthy)   0.0.0.0:32777->5000/tcp

当然,如果你只想从容器内部访问后端的5000端口,你可以去掉port配置,改成如下的配置:

version: "3"

services:
  front:
    image: front:latest
  backend:
    image: "backend:latest"

这样docker-compose up --scale backend=3启动后,我们就只能在容器内部访问http:\\backend:5000来访问后端service,因为我们启动了三个,前端的请求会随机的分配到后端的三个service上,保证了整体的服务质量。

参考链接:



本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处

搜索『后端精进之路』关注公众号,立刻获取最新文章和价值2000元的BATJ精品面试课程

原文地址:https://www.cnblogs.com/way2backend/p/11992664.html

时间: 2024-08-30 15:52:13

Docker系列-(3) Docker-compose使用与负载均衡的相关文章

docker 系列之 docker安装

Docker支持以下的CentOS版本 CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS 仅发行版本中的内核支持 Docker. Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上. Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位.系统内核版本为 2.6.32-431 或者更高版本 1.查看当前系统内核版本 [[email protect

Docker系列之Docker容器

一.介绍 容器是独立运行的一个或一组应用,以及它们的运行态环境.对应的,虚拟机可以理解为模拟运行的一整套操作系统和排在上面的应用. 二.容器 2.1 启动容器 启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将终止状态的容器重新启动. 新建并启动:所需命令主要为 docker run.例如下面启动后输出一个"Hello World",之后终止容器. [email protected]0-15-ubuntu:~# docker run myimage /bin/echo '

如何使用Weave以及Docker搭建Nginx反向代理/负载均衡服务器

Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动发现.它可以让我们更加专注于应用的开发,而不是基础架构.Weave 提供了一个如此棒的环境,仿佛它的所有容器都属于同个网络,不需要端口/映射/连接等的配置.容器中的应用提供的服务在 weave 网络中可以轻易地被外部世界访问,不论你的容器运行在哪里.在这个教程里我们将会使用 weave 快速并且简单

[转]f5负载均衡原理

f5负载均衡原理 一. 负载均衡技术 负载均衡技术在现有网络结构之上提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性. 1. 负载均衡发生的流程图: 1. 客户发出服务请求到VIP 2.BIGIP接收到请求,将数据包中目的IP地址改为选中的后台服务器IP地址,然后将数据包发出到后台选定的服务器 3. 后台服务器收到后,将应答包按照其路由发回到BIGIP 4.BIGIP收到应答包后将其中的源地址改回成VIP的地址,发回客户端

Docker Compose 部署Nginx服务实现负载均衡

Compose简介: Compose是Docker容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose,不再需要使用shell脚本来启动容器.Compose通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用.docker-compose默认的模板文件是 docker-compose.yml,其中定义的每个服务都必须通过image 指令指定镜

docker案例篇之nginx负载均衡

#搭建nginx镜像 docker run -it --privileged --name tmp centos /usr/sbin/init ## 另外打开一个ssh窗口 docker ps docker exec -it tmp /bin/bash ## 使用yum安装nginx rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm yum ins

docker——三剑客之Docker Compose

编排(Orchestration)功能是复杂系统实现灵活可操作性的关键.特别是在Docker应用场景中,编排意味着用户可以灵活的对各种容器资源实现定义和管理. 作为Docker官方编排工具,Compose的重要性不言而喻,它可以让用户通过编写一个简单模板文件,快速地创建和管理基于Docker容器地应用集群. Compose项目是Docker官方的开源项目,负责实现对Docker容器的快速编排.从功能上看,跟OpenStack中的Heat十分相似.Compose定位是"定义和运行多个Docker容

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

原文:8天入门docker系列 -- 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署 这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook 总要和一些数据库打交道吧,比如说mysql,mongodb,redis,通常情况下这些存储设备要么是以容器的方式承载,要么是由DBA在非容器环境下统一管理. 一:webnotebook连接容器redis

Docker系列(十四):Docker Swarm集群

一.Swarm简介 Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm和Kubernetes比较类似,但是更加轻便,具有的功能也较kubernetes更少一些. Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm 是 Do