上一篇文章介绍了docker镜像的制做与发布,本文主要介绍实际docker工程部署中常常用到的docker-compose工具,以及docker的网络配置和负载均衡。前端
实际开发过程当中,在一个项目中,咱们常将不一样的模块放在单独的docker中,方便维护和扩展。好比咱们一个项目可能有MySQL镜像、Nginx镜像、Spring Boot后端镜像,咱们在实际部署中能够采用上篇文章介绍的方法,分别打包,分别启动;可是这样太费精力,并且还容易出错。 所以Docker-compose工具应运而生,就是为了解决工程部署中的多个Docker镜像的管理问题。java
相似于build镜像须要Dockerfile同样,使用docker-compose时也须要相似的配置文件,叫作docker-compose.yaml。git
下面是一个Docker-file的例子:github
通常docker-compose文件中须要注意以下几点:面试
上面提到了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 up
启动,docker-compose down
关闭工程,同时会删除全部容器。bash
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会自动帮你建立一个网络,并将多个service在这个网络中运行。所以不一样容器之间,直接利用容器名+端口就能够访问了。
实际生产环境中,确定会启动多个后端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精品面试课程。