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

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

“如果你有一个有多服务的程序,并且可能需要扩展几个独立的服务,那么怎么做呢?”以及

“如何让一个容器中的应用程序如何与另一个容器(中的程序)进行通信?”

Kubernetes的一个特性是从多个容器中构建应用程序并进行可操作的扩展,但是我现在还没有准备好一下子去完全实现这个想法。况且,Docker 1.12添加了“swarm模式”以及docker-compose工具,看起来Docker已经拥有了帮助构建和扩展多容器应用的大部分工具,我们并不需要去找额外的工具来做这些事情。

所以这里是我开始着手的地方:

  • 容器1:使用了JAX-RS RESTful的Spring Boot程序。
  • 容器2:MongoDB数据库。
  • 容器3:用来存储MongoDB数据的容器。

事实证明,为每一个容器编写一个单独的dockerfile后重新在docker-compose.yml进行连接并不会麻烦很多。

从每个容器开始,下面是每个简单的Docker文件:

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运行,使用一个容器作为服务容器,另一个作为数据容器 - 请参阅下面的完整docker-compose文件。

把它们放在一起,这里是Docker Compose文件,将容器联在一起:

version: '2'
services:
    mongodata:
        image: mongo:3.2
        volumes:
        - /data/db
        entrypoint: /bin/bash
    mongo:
        image: mongo:3.2
        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前端启动多个容器,我们还缺一个负载平衡器,对不对?同样也很简单,只需添加haproxy:

lb:
    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

AddressBook后端的完整源代码托管在GitHub。deploy- *文件夹包含各个dockerfiles。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏容器云生态

如何优雅的编写Dockerfile

在生产环境中一般我们会对基本的环境进行自构建,从而利用images的分层特性去层层构建上层的业务镜像。 1.默认情况下我们会首先构建一个基本的base镜像,这...

1.2K80
来自专栏惨绿少年

Docker 容器入门

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

60490
来自专栏杨建荣的学习笔记

对分区表导入导出的水平,垂直切分(r2第22天)

在工作中有时候碰到一些分区表,业务数据量很大,可能几百G,上T的规模,而且做数据的导入导出的时候,会感觉到exp/expdp的时候生成的dump文件太大了,做导...

30160
来自专栏磨磨谈

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

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

16620
来自专栏美团技术团队

Docker 入门介绍

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

35780
来自专栏技术翻译

使用Java完成对Docker的指南入门,第2部分

该应用程序仍在运行。它在一个名为eloquent_varaham的容器中运行 。

12200
来自专栏A周立SpringCloud

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

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

49390
来自专栏北京马哥教育

Docker 入门教程

几个月以前,红帽(Red Hat)宣布了在 Docker 技术上和 dotCloud 建立合作关系。在那时候,我并没有时间去学习关于 Docker 的知识,所以...

38270
来自专栏云计算

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

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

29560
来自专栏Java架构沉思录

微服务不得不了解的Docker入门与实践

Docker 是一个能让程序跑在一个它无法感知的、用于隔绝外界环境里的容器的工具。

9210

扫码关注云+社区

领取腾讯云代金券