本文中所用的指令可以参考Docker进阶—初识docker-compose
将自己实际应用中的项目运行环境通过compose将容器都编排到一起。
初步打算将项目运行环境分为4个容器来编排,分别如下:
本文采用的镜像构建几乎均为本地构建,因为实际环境中,很有可能服务器是没有外网环境的,所以我都提前准备好了对应的安装包,用自己的指令来构建对应的镜像,编排自己的容器,这样更能加深自己对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,目录结构如下:
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]
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]
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]
cd /apps/compose
vim 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
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,至此,全部组件运行成功,接下来就是将我们的程序代码放到各自的容器中进行调试即可了。
看懂不如行动,实践出真理,往往在实践的过程中出现的问题才是最大的收获,快动动你灵活的双手实操起来吧。