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,至此,全部組件運行成功,接下來就是將我們的程序代碼放到各自的容器中進行調試即可了。

看懂不如行動,實踐出真理,往往在實踐的過程中出現的問題纔是最大的收穫,快動動你靈活的雙手實操起來吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章