一、简单介绍
需求:通过界面按钮 来控制 实例的创建、修改、删除。
由于Web应用采用多服务方式开发,每个服务都可以单独访问(单独占用一个端口)。以前部署服务器,采用的Nginx监听端口 转发。但是这样就会在new整个应用的时候,就需要暴露很多端口(每个服务都可以单独访问)、很多容器(每个服务一个容器)管理起来不方便。
对部署进行调整:所有服务打成war包形式,统一部署到tomcat上,对外只需暴露出tomcat端口+服务名就可访问对应服务。
二、环境准备:Docker镜像
- Tomcat:8
- Mysql:5.7.30
- webcenter/activemq:latest
- redis:5.0.7
- 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
- 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 进行编排即可
目前没有对Mysql、Activemq、Redis 进行暴露端口,因为 都是容器内部访问,不需要外部访问。
Tomcat 对外暴露端口、及挂载路径是动态的,所以每次new 新实例 需针对这两部分进行单独替换。
3、单独安装环境
- 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
- 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
- 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
elasticsearch 为 单独启动的容器
2、把war包放入tomcat挂载目录
3、访问IP+tomcat端口+服务名称
五、通过Java代码执行命令 修改配置文件以及控制创建新实例
代码案例
五、其他常用命令及问题
1、命令
- 进入容器内部
docker exec -it 容器ID /bin/bash
- 停止所有容器
docker stop $(docker ps -a -q)
- 删除所有容器
docker rm $(docker ps -a -q)
- 查看容器详细信息
docker inspect 容器ID
- 查看容器日志
docker logs -f 容器ID
- 容器提交镜像
docker commit -a 创建者 -m 介绍 容器ID 镜像名:版本
- 镜像下载到本地
docker save -o xxx.tar 镜像ID
- 加载镜像到docker中
docker load -i xxx.tar
2、问题解决
- 进入容器内部时,经常找不到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
- Mysql容器打成镜像
应用初始化时,Mysql中会有一些初始化数据。需要针对Mysql容器打包为镜像。在打包后重新启动容器时,发现数据都没有了。
需要进入Mysql容器内部,修改 /etc/mysql/mysql.conf.d/mysqld.cnf 把Mysql存储数据的路径 改为自定义路径。
datadir=自定义路径