使用docker-compose搭建Tomcat+Mysql+ActiveMQ+ServiceMix
本文中所用的指令可以參考Docker進階—初識docker-compose
預期目的
將自己實際應用中的項目運行環境通過compose將容器都編排到一起。
容器分配設計
初步打算將項目運行環境分爲4個容器來編排,分別如下:
- 容器1:mysql
- 容器2:servicemix(JDK、servicemix)
- 容器3:tomcat(WebProject、JDK、MAVEN)
- 容器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文件
- 創建docker-compose.yml文件
cd /apps/compose
vim docker-compose.yml
- 填充內容到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
- 項目各個組件的關鍵目錄均已映射出來,現在就是將代碼中的連接地址改成當前環境的地址、項目的代碼copy到對應的目錄下即可
- 使用指令啓動項目,啓動指令 (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,至此,全部組件運行成功,接下來就是將我們的程序代碼放到各自的容器中進行調試即可了。
看懂不如行動,實踐出真理,往往在實踐的過程中出現的問題纔是最大的收穫,快動動你靈活的雙手實操起來吧。