一键式 new 多个相同的实例(通过界面按钮 来控制 应用的创建、修改、删除,使用Docker Compose 编排应用所需环境)

一、简单介绍

需求:通过界面按钮 来控制 实例的创建、修改、删除。

由于Web应用采用多服务方式开发,每个服务都可以单独访问(单独占用一个端口)。以前部署服务器,采用的Nginx监听端口 转发。但是这样就会在new整个应用的时候,就需要暴露很多端口(每个服务都可以单独访问)、很多容器(每个服务一个容器)管理起来不方便。
对部署进行调整:所有服务打成war包形式,统一部署到tomcat上,对外只需暴露出tomcat端口+服务名就可访问对应服务。

二、环境准备:Docker镜像

  1. Tomcat:8
  2. Mysql:5.7.30
  3. webcenter/activemq:latest
  4. redis:5.0.7
  5. elasticsearch:7.7.0

注意:因elasticsearch 占用内存较大,这里所有的应用共享一个elasticsearch。其他中间件则每次new新实例,都会进行重新创建

三、安装

Docker 在创建容器时,为每个容器分配一个ip,如果不指定network则默认容器连接到docker0的虚拟网桥。
由于elasticsearch 是所有容器共享的,但是在使用Docker Compose编排时,每个Compose Docker 都会分配一个network,导致 Compose内容器与elasticsearch 不在一个网段中,Tomcat会连接不上elasticsearch
解决方案: 在创建elasticsearch 时,为elasticsearch 单独创建一个network(如果不单独创建,采用默认的network,Compose中容器会连接不上 Docker默认的network),因所有服务打成war包,部署在Tomcat上,所以Tomcat容器需连接 。也可不创建 但是 每次new完新实例就需单独使用命令(使不同网段容器间互联)

docker network connect 
0f7725a561c1(elasticsearch 所在networkID) 
7fcc20626a4e`(Tomcat容器ID)

Docker Compose 一个service下 容器访问可直接使用服务名称(jdbc:mysql://mysql:3306),如果容器是Compose 外部,则需容器互连之后,也可以采用容器名称访问

1、elasticsearch

为elasticsearch 创建network

docker network create -d bridge elasticsearch
  1. Docker创建elasticsearch 容器
docker run --name elasticsearch --network elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 3ff142212faf(imgeId)

这里采用初始elasticsearch 即可,线上使用自定义elasticsearch 镜像(设置访问密码等操作)

2、其他环境 采用Docker Compose 进行编排即可

一键式 new 多个相同的实例(通过界面按钮 来控制 应用的创建、修改、删除,使用Docker Compose 编排应用所需环境)_第1张图片

目前没有对Mysql、Activemq、Redis 进行暴露端口,因为 都是容器内部访问,不需要外部访问。
Tomcat 对外暴露端口、及挂载路径是动态的,所以每次new 新实例 需针对这两部分进行单独替换。

3、单独安装环境

  1. activemq
docker run --name=activemq \
-itd \
-p 8161:8161 \
-p 61616:61616 \
-e ACTIVEMQ_ADMIN_LOGIN=admin \
-e ACTIVEMQ_ADMIN_PASSWORD=123456 \
--restart=always \
-v /usr/local/activemq-docker:/data/activemq \
-v /usr/local/activemq-docker/log:/var/log/activemq \
webcenter/activemq:latest
  1. redis
docker run -d --name redis -p 6389:6379 \
7eed8df88d3b redis-server --appendonly yes \
--requirepass 123456 --bind 0.0.0.0 \
--protected-mode no --daemonize no
  1. Mysql
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 \
 --name  mysql 9cfcce23593a

四、测试

1、执行Docker Compose

当使用 Compose 创建多个实例的时候,service名称都会相同,所以在启动的时候 需要指定每个Compose的项目名称 进行隔离

docker-compose -f compose.yml -p 项目名称 up -d

一键式 new 多个相同的实例(通过界面按钮 来控制 应用的创建、修改、删除,使用Docker Compose 编排应用所需环境)_第2张图片
elasticsearch 为 单独启动的容器

2、把war包放入tomcat挂载目录

3、访问IP+tomcat端口+服务名称

在这里插入图片描述

五、通过Java代码执行命令 修改配置文件以及控制创建新实例

代码案例

五、其他常用命令及问题

1、命令

  1. 进入容器内部
docker exec -it 容器ID /bin/bash
  1. 停止所有容器
docker stop $(docker ps -a -q)
  1. 删除所有容器
docker rm $(docker ps -a -q)
  1. 查看容器详细信息
docker inspect 容器ID
  1. 查看容器日志
docker logs -f 容器ID
  1. 容器提交镜像
docker commit -a  创建者 -m 介绍 容器ID 镜像名:版本
  1. 镜像下载到本地
docker save -o xxx.tar 镜像ID
  1. 加载镜像到docker中
docker load -i xxx.tar

2、问题解决

  1. 进入容器内部时,经常找不到vim、ping、telnet等命令 需使用apt-get install下载,但是 下载的特别慢:
# 1. 清空/etc/apt/sources.list文件
 echo > /etc/apt/sources.list

# 2. 重新输出到文件
echo -e "deb http://mirrors.aliyun.com/debian/ stretch main non-free contrib \
ndeb-src http://mirrors.aliyun.com/debian/ stretch main non-free contrib \
ndeb http://mirrors.aliyun.com/debian-security stretch/updates main \ndeb-src http://mirrors.aliyun.com/debian-security stretch/updates main \
ndeb http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib \
ndeb-src http://mirrors.aliyun.com/debian/ stretch-updates main non-free contrib \
ndeb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib \
ndeb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" > /etc/apt/sources.list

# 3. 更新
apt-get update

# 4. 下载对应依赖即可
# 下载vim时可能会报错 依赖库版本过低导致,先安装依赖
apt-get install -y libtinfo5 --allow-remove-essential
apt-get install -y vim

# 安装telnet
apt-get install telnet
  1. Mysql容器打成镜像
    应用初始化时,Mysql中会有一些初始化数据。需要针对Mysql容器打包为镜像。在打包后重新启动容器时,发现数据都没有了。
需要进入Mysql容器内部,修改 /etc/mysql/mysql.conf.d/mysqld.cnf 把Mysql存储数据的路径 改为自定义路径。
datadir=自定义路径

你可能感兴趣的:(Docker,docker,elasticsearch,容器)