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

docker.png

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

Docker-compose介绍

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

docker-compose.yaml 文件

相似于build镜像须要Dockerfile同样,使用docker-compose时也须要相似的配置文件,叫作docker-compose.yaml。git

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

通常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并不能保证前序容器彻底初始化,意思是只要前序容器启动了,就会尝试启动当前容器。这样仍是会形成前序容器未初始化完成,后续容器启动后出现链接失败等错误。spring

所以最好的方式是官方(docs.docker.com/compose/sta…)比较推荐的wait脚本,脚本的详细使用能够看这里 github.com/vishnubob/w…,docker

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文件的详细介绍,能够参考官方的文档 docs.docker.com/compose/get…后端

docker-compose的启动/中止

docker-compose的启动与中止很是简单,直接使用docker-compose up启动,docker-compose down关闭工程,同时会删除全部容器。bash

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上,保证了总体的服务质量。

参考连接:


搜索『后端精进之路』并关注,马上获取最新文章和价值2000元的BATJ精品面试课程

后端精进之路.png
相关文章
相关标签/搜索