基于docker compose 快速构建单机版本公共组件
1.编写docker-compose-base.yaml文件
#新建目录
mkdir -p /usr/local/base
cd /usr/local/basel
新建docker-compose-base.yaml文档,编辑以下内容
#指定compose版本
version: "3.5"
#定义启动服务
services:
#tomcat服务
tomcat:
#指定下载镜像
image: tomcat:8.5.79-jre8-temurin-focal
#设置容器名称,相当于 docker run --name 容器名
container_name: tomcat
#设置主机名
hostname: tomcat
#指定容器中运行应用的用户名
# user: root
#指定容器退出后的重启策略为始终重启
restart: always
#允许容器中运行一些特权命令
privileged: true
#指定对外映射端口,相当于 docker run -p 主机端口:容器端口
ports:
- "8080:8080"
#挂载目录,相当于 docker run -v 主机目录:容器目录
volumes:
- "/home/data/tomcat/webapps:/usr/local/tomcat/webapps"
environment:
TZ: "Asia/Shanghai"
#使用网桥,相当于 docker run --network 网桥名
networks:
- mynet
#redis服务
redis:
#指定下载镜像
image: redis:6.0.16
#设置容器名称,相当于 docker run --name 容器名
container_name: redis
#设置主机名
hostname: redis
#指定容器中运行应用的用户名
# user: root
#指定容器退出后的重启策略为始终重启
restart: always
#允许容器中运行一些特权命令
privileged: true
#声明容器端口
expose:
- "6379"
#指定对外映射端口,相当于 docker run -p 主机端口:容器端口
ports:
- "6379:6379"
#挂载目录,相当于 docker run -v 主机目录:容器目录
volumes:
# - redisdata:/data
- "/home/data/redis/data:/data"
- "/home/data/redis/redis.conf:/etc/redis/redis.conf"
#使用网桥,相当于 docker run --network 网桥名
networks:
- mynet
#启动容器执行命令,相当于docker run [镜像:tag] [命令], 登录redis: redis-cli -h 192.168.0.80 -p 6379 -a Dszn@2020
command: "redis-server /etc/redis/redis.conf"
#mysql数据库
mysql:
image: mysql:5.7.31
container_name: mysql
#设置主机名
hostname: mysql
restart: always
privileged: true
command: mysqld --character-set-server=utf8mb4 --lower_case_table_names=1 --collation-server=utf8mb4_unicode_ci --skip-name-resolve
#声明容器端口
expose:
- "3306"
ports:
- "3306:3306"
volumes:
#- mysqldata:/var/lib/mysql
#- mysqlconf:/etc/mysql
- "/home/data/mysql/data:/var/lib/mysql"
- "/home/data/mysql/conf.d:/etc/mysql/conf.d"
#指定环境变量,相当于docker run -e 参数, 登录mysql: mysql -h192.168.0.80 -P3306 -uroot -pDs20Pwd@
environment:
- MYSQL_ROOT_PASSWORD=moon123
- MYSQL_DATABASE=daison_cloud
networks:
- mynet
#rabbitmq消息队列
rabbitmq:
image: rabbitmq:3.8.27-management
container_name: rabbitmq
#设置主机名
hostname: rabbitmq
restart: always
privileged: true
#声明容器端口
expose:
- "5672"
- "15672"
ports:
- "5672:5672"
- "15672:15672"
#挂载目录,相当于 docker run -v 主机目录:容器目录
volumes:
#- rabbitmqdata:/var/log/rabbitmq
#- rabbitmqlogs:/var/lib/rabbitmq
- "/home/data/rabbitmq/data:/var/lib/rabbitmq"
#指定环境变量,相当于docker run -e 参数
environment:
- RABBITMQ_DEFAULT_USER=moon
- RABBITMQ_DEFAULT_PASS=123456
networks:
- mynet
#nacos服务管理
nacos:
image: nacos/nacos-server:v2.0.4-slim
container_name: nacos
#设置主机名
hostname: nacos
#user: root
restart: always
privileged: true
#声明容器端口
expose:
- "8848"
ports:
- "8848:8848"
#挂载目录,相当于 docker run -v 主机目录:容器目录
volumes:
#- nacosdata:/home/nacos/logs
- "/home/data/nacos/init.d:/home/nacos/init.d"
- "/home/data/nacos/logs:/home/nacos/logs"
#指定环境变量,相当于docker run -e 参数
environment:
- MODE=standalone
- PREFER_HOST_MODE=hostname
- mynet
#指定依赖
depends_on:
- mysql
#nginx服务
nginx:
#指定下载镜像
image: nginx:latest
#设置容器名称,相当于 docker run --name 容器名
container_name: nginx
#设置主机名
hostname: nginx
#指定容器中运行应用的用户名
# user: root
#指定容器退出后的重启策略为始终重启
restart: always
#允许容器中运行一些特权命令
privileged: true
#声明容器端口
expose:
- "80"
#指定对外映射端口,相当于 docker run -p 主机端口:容器端口
ports:
- "8000:80"
#挂载目录,相当于 docker run -v 主机目录:容器目录
volumes:
# - nginxdata:/data
- "/home/data/nginx/www:/usr/share/nginx/html"
- "/home/data/nginx/nginx.conf:/etc/nginx/nginx.conf"
- "/home/data/nginx/conf:/etc/nginx/conf"
- "/home/data/nginx/logs:/var/log/nginx"
#使用网桥,相当于 docker run --network 网桥名
networks:
- mynet
#mongo服务
mongo:
image: mongo:4.4.10
container_name: mongo
restart: always
volumes:
- /home/data/mongo/db:/data/db # 挂载数据目录
- /home/data/mongo/log:/var/log/mongodb # 挂载日志目录
- /home/data/mongo/config:/etc/mongo # 挂载配置目录
- /etc/localtime:/etc/localtime
ports:
- 27018:27017
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=root
command: mongod --port 27017
#zookeeper
zookeeper:
image: zookeeper:3.6.2
container_name: zookeeper
restart: always
hostname: zookeeper
ports:
- 2182:2181
volumes:
- /home/data/zookeeper/data:/data
- /home/data/zookeeper/conf:/conf
#kafka
kafka:
image: wurstmeister/kafka
container_name: kafka
restart: always
hostname: kafka
ports:
- 9092:9092
volumes:
- /etc/localtime:/etc/localtime
- ./docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
external_links:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_NUM_PARTITIONS: 3
#声明网桥
networks:
#定义服务网桥名称
mynet:
#false-统自动创建网桥名,格式为: 目录名_网桥名,默认为false; true-使用外部创建的网桥,需要自己手动创建
external: false
#挂载目录,声明服务使用的创建卷名
volumes:
redisdata:
#false-系统自动创建的卷名,格式为: 目录名_卷名,默认为false; true-使用外部创建的卷面,需要自己手动创建
external: false
mysqldata:
mysqlconf:
rabbitmqdata:
rabbitmqlogs:
#声明网桥
networks:
#定义服务网桥名称
mynet:
#false-统自动创建网桥名,格式为: 目录名_网桥名,默认为false; true-使用外部创建的网桥,需要自己手动创建
external: false
#挂载目录,声明服务使用的创建卷名
volumes:
redisdata:
#false-系统自动创建的卷名,格式为: 目录名_卷名,默认为false; true-使用外部创建的卷面,需要自己手动创建
external: false
mysqldata:
mysqlconf:
rabbitmqdata:
rabbitmqlogs:
在services:下维护了各个公共组件的服务,在公共组件配置文档一般提供了比较全的组件配置文件,若该次服务不用部署某一个或几个服务,则按照要求取公共服务组件即可。 例如 考虑到前端统一部署,需要将nginx 分离部署,去掉服务中的nginx即可,或者全量部署,服务启动后将nginx服务停用。
若存储部分mysql 需要分离,则公共环境去掉mysql,另一个存储环境只保留mysql服务即可。
docker 常用批量操作命令
#启动所有镜像
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
#停止所有镜像
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
# 删除所有容器
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
#删除所有镜像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
假如服务没有安装docker及docker-compse 可以参照docker及docker-compose安装
下载挂载卷 上传到服务器 /usr/local/base
cd /usr/local/base
链接:https://pan.baidu.com/s/1YMKv2pPm_s3f_ac-8KlHQw
提取码:0jr9
--来自百度网盘超级会员V5的分享
2.将公共镜像目录下data上传到服务器/home目录下。
3.将baseServer.tar 上传到服务器 并在该路径下执行(若无网络离线安装,有网可以不需要,利用联网下载)
mv data /home/data
docker load -i baseServer.tar
授权 启动:
chmod 777 -R /home/data
docker-compose -f docker-compose-base.yml up -d
查看端口及容器启动情况
docker ps -a
#查看启动端口
netstat -ntlp
基础的组件服务已经安装完毕;
开启外网访问端口
mysql端口:3306
rabbitmq端口:5672
、15672
redis端口:6379
nacos端口:8848
nginx端口:80
zk端口:2181
kafka端口:9092
mongdb端口:27017
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 5672 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 15672 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8848 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
公共环境测试:
- nacos 测试: http://ip:8848/nacos 账号:
nacos
密码:nacos
- mysql 测试 采用工具(Navicat)连接3306 账号:
root
密码:moon123
- rabbitmq测试: http://ip:15672 账号:
moon
密码:123456
- 其他组件都可以用命令或者客户端工具进行测试