Docker进阶---使用docker-compose搭建Tomcat+Mysql+ActiveMQ+ServiceMix环境

使用docker-compose搭建Tomcat+Mysql+ActiveMQ+ServiceMix

本文中所用的指令可以参考Docker进阶—初识docker-compose

预期目的

将自己实际应用中的项目运行环境通过compose将容器都编排到一起。

容器分配设计

初步打算将项目运行环境分为4个容器来编排,分别如下:

  1. 容器1:mysql
  2. 容器2:servicemix(JDK、servicemix)
  3. 容器3:tomcat(WebProject、JDK、MAVEN)
  4. 容器4:activeMQ(JDK、activeMQ)

本文采用的镜像构建几乎均为本地构建,因为实际环境中,很有可能服务器是没有外网环境的,所以我都提前准备好了对应的安装包,用自己的指令来构建对应的镜像,编排自己的容器,这样更能加深自己对docker-compose的理解和印象。

创建自定义网络

给容器设置固定IP,主要为了方便项目中代码对给个组件的连接。

docker network create --subnet=192.18.0.0/16 mynetwork

创建工作目录

mkdir -p /apps/compose
mkdir -p /apps/compose/mysql
mkdir -p /apps/compose/tomcat
mkdir -p /apps/compose/servicemix
mkdir -p /apps/compose/activeMQ

上传对应文件到目录下

上传JDK+MAVEN到目录/apps/compose/tomcat下
上传servicemix到目录/apps/compose/servicemix,目录结构如下:
在这里插入图片描述

编写构建activemq镜像的Dockerfile

FROM centos:7

ADD jdk-8u221-linux-x64.tar.gz apache-activemq-5.12.1-bin.tar.gz /usr/local/

ENV JAVA_HOME=/usr/local/jdk1.8.0_221 ACTIVEMQ_HOME=/usr/local/apache-activemq-5.12.1

ENV CLASSPATH=.:${JAVA_HOME}/lib PATH=$PATH:${JAVA_HOME}/bin:$ACTIVEMQ_HOME/bin:

VOLUME ["${ACTIVEMQ_HOME}/data","${ACTIVEMQ_HOME}/conf"]

WORKDIR ${ACTIVEMQ_HOME}

EXPOSE 8161 61616 5672 61613 1883 61614

ENTRYPOINT activemq start && tail -f ./data/activemq.log

LABEL version=0.1 author=monk email=[email protected]

编写构建tomcat镜像的Dockerfile

FROM tomcat:8.5

ADD apache-maven-3.6.1-bin.tar.gz /usr/local/

ENV MAVEN_HOME=/usr/local/apache-maven-3.6.1
ENV PATH $PATH:${MAVEN_HOME}/bin: 

EXPOSE 8080 8009
VOLUME ["${CATALINA_HOME}/webapps","$CATALINA_HOME/logs"]

LABEL version=0.1 author=monk email=[email protected]

编写构建servicemix镜像的Dockerfile

FROM centos:7

ADD jdk-7u79-linux-x64.tar.gz /usr/local
COPY apache-servicemix-6.1.0.zip /usr/local
RUN yum install -y unzip
WORKDIR /usr/local
RUN unzip apache-servicemix-6.1.0.zip
ENV JAVA_HOME=/usr/local/jdk1.7.0_79 SERVICEMIX_HOME=/usr/local/apache-servicemix-6.1.0
ENV CLASSPATH=.:${JAVA_HOME}/lib
ENV PATH $PATH:${JAVA_HOME}/bin:$SERVICEMIX_HOME/bin

EXPOSE 8101 8181

WORKDIR $SERVICEMIX_HOME

VOLUME ["$SERVICEMIX_HOME/deploy","$SERVICEMIX_HOME/etc"]
CMD ["servicemix"]
LABEL version=0.1 author=monk email=[email protected]

编写docker-compose文件

  1. 创建docker-compose.yml文件
cd /apps/compose
vim docker-compose.yml
  1. 填充内容到docker-compose.yml
version: "3"

services:
    mysql:
        container_name: mysql
        image: mysql:5.7
        restart: always
        volumes:
            - ./mysql/data:/usr/local/mysql/data
#            - ./mysql/conf/mysqld.conf:/usr/local/mysql/mysql.conf.d/mysqld.cnf
        ports:
            - 3306:3306
        environment:
            MYSQL_ROOT_PASSWORD: AAaa1234
            TZ: Asia/Shanghai
            LANG: C.UTF-8
        networks:
            mynet:
                ipv4_address: 192.18.0.66
    servicemix:
        container_name: servicemix
        build: ./serviceMix
        restart: always
        volumes: 
            - ./serviceMix/deploy:/usr/local/apache-servicemix-6.1.0/deploy
#            - ./serviceMix/etc:/usr/local/apache-servicemix-6.1.0/etc
        ports: 
            - 1099:1099
            - 8101:8101
            - 8181:8181
        networks: 
            mynet:
                ipv4_address: 192.18.0.67
    activemq:
        container_name: activeMQ
        build: ./activeMQ
        restart: always
        volumes: 
            - ./activeMQ/data:/usr/local/apache-activemq-5.12.1/data
#            - ./activeMQ/conf:/usr/local/apache-activemq-5.12.1/conf
        ports: 
            - 8161:8161
            - 61616:61616
            - 5672:5672
            - 61613:61613
            - 1883:1883
            - 61614:61614
        environment:
            - ACTIVEMQ_ADMIN_LOGIN=admin
            - ACTIVEMQ_ADMIN_PASSWORD=admin
            - ACTIVEMQ_CONFIG_MINMEMORY=512
            - ACTIVEMQ_CONFIG_MAXMEMORY=2048
            - TZ=Asia/Shanghai
        networks: 
            mynet:
                ipv4_address: 192.18.0.68
    tomcat:
        container_name: ESBConsole
        build: ./tomcat
        restart: always
        volumes: 
            - ./tomcat/webapps:/usr/local/tomcat/webapps
            - ./tomcat/logs:/usr/local/tomcat/logs
#            - ./activeMQ/conf:/usr/local/apache-activemq-5.12.1/conf
        ports: 
            - 8080:8080
            - 8009:8009
        environment: 
            LC_ALL: zh_CN.UTF-8
        networks: 
            mynet:
                ipv4_address: 192.18.0.69
        depends_on: 
            - mysql
            - servicemix 
            - activemq

networks:
    mynet:
        external:
            name: mynetwork
  1. 项目各个组件的关键目录均已映射出来,现在就是将代码中的连接地址改成当前环境的地址、项目的代码copy到对应的目录下即可
  2. 使用指令启动项目,启动指令 (PS:耐心等待下,第一次启动它需要先构建对应的镜像,然后再将镜像跑成容器)
docker-compose up –d 

问题总结:

实际上,在编排的过程中,按照上面的步骤是可以编排成功的。但是实际编排service的过程中,出现了问题,activemq和servicemix一直在重启,tomcat和mysql是可以起来的,单独跑docker-compose构建成的镜像又是正常的。

解决方案:

注释掉docker-compose的volumes挂载目录中的conf目录原因:

此字段会将宿主机的目录挂载到容器上,如果是宿主机中不存在的目录,将会新建目录,这个时候新建的目录是空的,就会覆盖容器内部的conf目录,从而导致activemq启动失败。而data目录可以是因为data目录下的数据文件是在mq启动之后生成的文件,故不影响。同理tomcat目录下的conf目录也一样,不建议挂载出来,如果非要挂载,请先准备好对应conf目录下的配置文件。

建议:

起初将conf目录放出来的目的是为了方便修改mq的配置文件,但是这样对应的也提高了风险,违背了docker的原则之一:安全,所以要修改配置文件还是建议去容器内部修改,不要将配置文件放出来,特别是影响到程序运行的组件配置文件,代码的配置文件还好,只是影响到代码运行不起来,不会导致组件运行不起来。
。同理,取消servicemix的etc目录挂载、tomcat的conf目录挂载,重新构建下镜像docker-compose build –no-cache,然后使用指令docker-compose restar指令t重启docker-compse下的全部service,至此,全部组件运行成功,接下来就是将我们的程序代码放到各自的容器中进行调试即可了。

看懂不如行动,实践出真理,往往在实践的过程中出现的问题才是最大的收获,快动动你灵活的双手实操起来吧。

发布了69 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Min_Monk/article/details/103914301