使用Docker 1.12.x构建多容器Web应用程序

到目前为止,我使用单个docker容器部署过很多应用程序并开始思考下面的问题:

“如何扩展一个有多个服务的应用的单个服务?”

“不同容器间应用程序如何通信?”

对于这些问题,我认为 Kubernetes是构建和扩展灵活的多服务应用程序的一个不错的选择,但是Docker自身也提供了相应的功能:Docker 1.12添加了swarm和docker-compose模块,使用这些足够在不添加额外工具的情况下构建和扩展多服务应用程序。

所以我开始了构建多服务应用的尝试,以下是我使用的容器:

  • 容器1:基于JAX-RS和Spring Boot的 RESTful应用。
  • 容器2:MongoDB数据库。
  • 容器3:MongoDB的docker容器数据卷。

事实证明,这并不比构建单个容器复杂多少。只需要构建单个容器的Dockerfiles,然后通过配置docker-compose.yml文件将单个容器组合。

下面是各容器的Dockerfile文件:

Spring Boot 容器

FROM java:openjdk-8-alpine
ADD SpringBootAddressBook-0.0.1-SNAPSHOT.jar /opt/SpringBootAddressBook-0.0.1-SNAPSHOT.jar
EXPOSE 8080
ENV MONGODB_DB_NAME addressbook
ENV MONGODB_DB_HOST mongo
ENV MONGODB_DB_PORT 27017
ENTRYPOINT ["java", "-jar", "/opt/SpringBootAddressBook-0.0.1-SNAPSHOT.jar"]

MongoDB容器

MongoDB可以直接使用Docker Hub官方的dockerfiles构建,这里使用一个容器作为mongodb服务器,另一个作为数据容器 - 请参阅下面完整的docker-compose.yml文件。

这是将数据库容器与数据卷容器组合的Docker Compose文件:

version: '2'
services:
    mongodata:
        image: mongo:3.2
        volumes:
        - /data/db
        entrypoint: /bin/bash
    mongo:
        image: mongo:3.2
        depends_on:         depends_on: 
            - mongodata
        volumes_from:
            - mongodata
        ports:
        #kh: only specify internal port, not external, so we can scale with docker-compose scale
            - "27017"
    addressbook:
        image: addressbook
        depends_on: 
            - mongo
        environment:
            - MONGODB_DB_NAME=addressbook
        ports:
            - 8080:8080
        links:
            - mongo

现在,这个容器集群可以作为一个整体运行:

docker-compose up

停止容器集群:

docker-compose down

也可以单独扩展集群中的任意一个容器:

docker-compose scale containername=count

注:其中count是启动容器实例的数量。

那么,如果想添加一个Web前端作为一个容器呢?很简单,这里有一个由nginx提供的AngularJS前端:

    web:
        image: docker-web-angularjs
        ports:
            - "80"

现在,如果我们为提供REST接口的后端应用和Nginx前端应用启动多个容器,我们也需要一个负载均衡应用对吧?实现也很简单,只需在docker-compose.yml中添加haproxy参数设置:

        image: dockercloud/haproxy
        depends_on: 
            - addressbook
        environment:
            - STATS_PORT=1936
            - STATS_AUTH="admin:password"
        links:
            - addressbook
            - web
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        ports:
            - 80:80
            - 1936:1936

我注意到各容器的启动顺序是随机的,有时Spring Boot容器会在MongoDB容器启动之前启动。这个问题可以通过添加depends_on参数来解决。虽然我不确定是否真的添加了有关强制执行特定的启动顺序的所有参数,但是这个方法应该解决了我的问题。我在docker-compose.yml中配置的容器启动顺序是(从第一个到最后一个):

  • mongodata(数据容器)
  • mongo
  • addressbook(提供REST接口的后端应用)
  • web(基于AngularJS前端应用)
  • haproxy

在GitHub上有AddressBook后端应用的完整源代码,其中eploy- *文件夹包含各个dockerfiles。

本文的版权归 hzr 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构师小秘圈

\bdocker容器极简教程

一,小王对于容器的困惑 小王刚开始学习Docker的时候,找资料在网上看到最多的是Docker的好处。比如: 1、Docker 容器的启动可以在秒级实现,这相比...

41650
来自专栏美团技术团队

Docker 入门介绍

Docker简介 ---- Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。2013年3月发布首个版本,当...

35980
来自专栏AI-vell

docker镜像制作commit方式

可以先基于一个已有镜像,通过bash添加自己需要的环境,然后commit一下【虽然官方不建议通过commit方式来创建,如果不担心镜像会越来越大的话,这种方式是...

30860

使用Docker 1.12.x构建多容器Web应用程序

目前为止,我花了很多时间在单个容器中运行程序,并开始思考了一些问题:

250100
来自专栏惨绿少年

Docker 容器入门

1.1 容器简介 1.1.1 什么是 Linux 容器 Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件...

61690
来自专栏北京马哥教育

Docker 从入门到实践

33350
来自专栏康怀帅的专栏

LNMP Docker 安装配置

目标:一条命令建立 LNMP 环境(MySQL、Redis、PHP-fpm、Nginx,etc)。这里只简单列举单容器运行方式。

63810
来自专栏磨磨谈

基于docker部署ceph以及修改docker image

容器和ceph的结合已经在一些生产环境当中做了尝试,容器的好处就是对运行环境的一个封装,传统的方式是集成为ISO,这个需要一定的维护量,而容器的相关操作会简单很...

17420
来自专栏A周立SpringCloud

Docker系列教程12-使用Maven插件构建Docker镜像

我们知道,Maven是一个强大的项目管理与构建工具。如果可以使用Maven构建Docker镜像,那么我们的工作就能得到进一步的简化。 经过调研,以下几款Mave...

50390
来自专栏康怀帅的专栏

Docker Swarm mode 详解

使用 docker swarm Dcoker 内置的集群管理的工具,Docker CE 1.12+。注意与旧的 Docker Swarm 区分开来。 OS: C...

95230

扫码关注云+社区

领取腾讯云代金券