测试环境部署踩坑系列
数据库创建
在安装好pgsql之后,使用 escloud_database_init.sh初始化数据库
liunx环境执行
sh ./escloud_database_init.sh en 172.16.6.181 5432 postgres password
参数1: 脚本语言(cn中文/en英文)
参数2: 数据库host
参数3: 数据库端口
参数4: 数据库用户名
参数5: 数据库密码
此脚本会对参数的数据库进行库和表的建立(注意:会覆盖以往的数据库数据),建立如下数据库
- CLOUD_CONFIG: 云综能平台依赖的数据库脚本,matterhorn服务(modelservice,dbcloud,notice等)依赖数据库
- CLOUD_AUTH: auth-service权限服务依赖的数据
- txlcn:txlcn分布式事务依赖的数据库
- model_pool:model-management-service模型升级管理服务依赖的数据库
- CLOUD_HISTORY:模型服务依赖数据,模型类型为 timeseries的表将建立在此数据库
云综能数据库环境建立如上
异常1:shell脚本无法连接数据库
FATAL: no pg_hba.conf entry for host
PostgreSQ数据库为了安全,它不会监听除本地以外的所有连接请求,当用户通过JDBC访问是,会报一些如下的异常:
org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host
要解决这个问题,只需要在PostgreSQL数据库的安装目录下找到/data/pg_hba.conf,找到“# IPv4 local connections:”
IPv4 local connections:
#host all all 127.0.0.1/32 md5
host all all 172.16.6.40/32 trust
然后 pgsql\bin 下 使用 pg_ctl restart -D F:\pgsql\data(数据库data路径)
docker服务部署
docker和docker-compose软件部署
在安装好centos之后,
修改 /etc/selinux 下config文件SELINUX=disabled 重启服务器(不设置docker-compose 启动会 permission denied )
使用 escloud_docker_service_init.sh初始化docker 服务
将文件上传到服务器 /home/setup,escloud_docker_service_init.sh 要在 /home/setup目录下
要在escloud_docker_service_init.sh 目录中的config文件中上传一些自定义配置
- docker-compose.yml #docker 容器设置,定义本服务器部署的服务
- daemon.json # docker配置,配置私库地址 和 网桥配置,【可以看下文ip冲突中的使用】
- env #
脚本首先进行 文件夹创建和文件复制
创建服务所需的目录
/etc/CET/Common 建库脚本
/etc/CET/docker docker-compose.yml和docker 前端容器映射的文件,nginx 文件
/etc/CET/images 上传的镜像压缩包
/etc/CET/peccore peccore
/etc/CET/template 文件导入导出template
/etc/CET/upload 平台文件上传文件夹 (头像 icon 合同文件等等)
/home/cet/model 模型服务建库初始化脚本
/home/cet/model/upload 模型升级文件目录
/home/cet/mysql nacos 和 mysql依赖的数据库
/home/docker_soft docker软件目录
/etc/docker 文件夹下 daemon.json , key.json (docker配置文件)
linux(Centos7)指令大全
查看系统及内核版本
[root@yzn docker]# uname
Linux
[root@yzn docker]# uname -srm
Linux 3.10.0-1127.el7.x86_64 x86_64
[root@edge images]# hostnamectl
Static hostname: edge
Icon name: computer-desktop
Chassis: desktop
Machine ID: 18696d7290cc4a6d86e7ce4dae03cce6
Boot ID: edc3f0d0359f476b800395ee33e744f0
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-862.el7.x86_64
Architecture: x86-64
查看端口占用
查看 4119端口服务启动了没,kill端口
[root@edge images]$ netstat -nap | grep 4119
tcp 0 0 0.0.0.0:4119 0.0.0.0:* LISTEN 25551/ConfigServer.
[root@edge images]taskkill /pid 25551 -t -f
设置可执行文件
chmod +x /usr/local/bin/cluster_entrypoint.sh
查看可执行文件目录
[root@yzn docker]# which docker
/usr/bin/docker
查看本地ip网卡信息
[root@yzn docker]# ifconfig
br-d3f5bc92e248: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.255.0 broadcast 172.19.0.255
inet6 fe80::42:5aff:fec4:c3fe prefixlen 64 scopeid 0x20<link>
ether 02:42:5a:c4:c3:fe txqueuelen 0 (Ethernet)
RX packets 2077896 bytes 331879635 (316.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1579205 bytes 1507196771 (1.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
ether 02:42:76:bc:ca:ca txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
压缩和解压
[root@edge setup]# tar -czvf db.tar ./db-script/ #压缩db-script文件夹为 db.tar
[root@edge setup]# tar -tzvf db.tar #显示压缩包内部文件
[root@edge setup]# cd db-script-bak/
[root@edge db-script-bak]# tar -xzvf ../db.tar #解压 db.tar
重启docker
sudo systemctl daemon-reload #daemon.json修改之后,加载配置文件
sudo systemctl start docker #启动docker
sudo systemctl enable docker #开机自启docker
sudo systemctl restart docker #重启docker
docker 打包和加载镜像
# dockerfile 目录执行此命令
docker build -t 191.0.0.158/escloud/escloud-resource-service:v2.0.02 .
docker save 191.0.0.158/escloud/escloud-resource-service:v2.0.02 > escloud-resource-service.v2.0.02.tar
docker load --input escloud-resource-service.v2.0.02.tar
docker pull & push
docker pull 172.16.7.3/matterhorn/model-service:v2.0.8
docker tag 172.16.7.3/matterhorn/model-service:v2.0.8 172.17.6.38/matterhorn/model-service:v2.0.8 #镜像改名
docker login -u dev -p Dev12345 172.17.6.38 #登录私库
docker push 172.17.6.38/matterhorn/model-service:v2.0.8
防火墙设置
systemctl status firewalld # 防火墙状态
systemctl stop firewalld # 防火墙暂时关闭
systemctl disable firewalld # 防火墙永久关闭
systemctl enable firewalld # 防火墙重启
防火墙墙对外暴露端口
方式一 修改/etc/firewalld/zones/ 下的 public.xml文件
/etc/firewalld/zones/public.xml
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="5432"/><!--pgsql-->
<port protocol="tcp" port="4111"/>
<port protocol="tcp" port="4113"/>
<port protocol="tcp" port="4115"/>
<port protocol="tcp" port="4116"/>
<port protocol="tcp" port="4118"/><!--deviceservice-->
<port protocol="tcp" port="4119"/><!--configservice-->
<port protocol="tcp" port="4500"/>
<port protocol="tcp" port="9999"/>
<port protocol="tcp" port="8848"/><!--nacos-->
<port protocol="tcp" port="8070"/><!--txlcn-->
<port protocol="tcp" port="12006"/><!--auth-service-->
<port protocol="tcp" port="18080"/><!--dbcloud-service-->
<port protocol="tcp" port="5090"/><!--platform-service-->
</zone>
方式二 命令行操作
firewall-cmd --zone=public --add-port=3000/tcp --permanent # 开放 3000端口
firewall-cmd --zone=public --add-port=80-90/tcp --permanent # 开放 80 到 90间的多个端口
检查防火墙设置是否成功
firewall-cmd --list-ports #查看防火墙开放的端口信息
4111/tcp 4113/tcp 4115/tcp 4116/tcp 4118/tcp 4500/tcp 5432/tcp 9999/tcp 8428/tcp 8430/tcp 8080/tcp 4119/tcp 8000/tcp 6000/tcp 15672/tcp 9998/tcp 4120/tcp 4117/tcp 9273/tcp 8070/tcp 4002/tcp
firewall-cmd --list-all #查看防火墙所有信息
# 返回结果如下
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 4111/tcp 4113/tcp 4115/tcp 4116/tcp 4118/tcp 4500/tcp 5432/tcp 9999/tcp 8428/tcp 8430/tcp 8080/tcp 4119/tcp 8000/tcp 6000/tcp 15672/tcp 9998/tcp 4120/tcp 4117/tcp 9273/tcp 8070/tcp 4002/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
docker-compose 构建镜像服务
docker-compose up -d
docker 镜像操作
[root@edge db-script-bak]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
172.17.6.38/ibcloud/energy-efficiency-service v0.0.5 89366ea27e4a 5 hours ago 211MB
172.17.6.38/enerecosys-cloud/main-web v0.0.117 62b4d8dc0f2c 6 hours ago 161MB
[root@edge db-script-bak]# docker rmi e0a #镜像id 只需要id前几位就可以定位镜像
Untagged: 191.0.0.158/escloud/escloud-resource-service:v1.2.06
Deleted: sha256:e0a490aca313ad3a47f443ab9cd354e1549109f4cc88d4b8a3f1ee8215a18bae
Deleted: sha256:b1d6032d3a8081c7feb6ce3b4aa4a71d06365eedbf61b9b6cc665c98b0d5b103
docker 容器操作
[root@edge db-script-bak]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54a0c0ae483c 172.17.6.38/ibcloud/energy-efficiency-service:v0.0.5 "sh -c 'java $JAVA_O…" 4 hours ago
[root@edge docker]# docker ps -a #查看所有容器
[root@edge docker]# docker-compose ps # docker-compose 构建的容器
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------------------------------
battery-service sh -c java $JAVA_OPTS -Dja ... Up 0.0.0.0:8042->8042/tcp
[root@edge docker]# docker logs -f 54a0c0ae4 --tail 200 #查看容器日志
[root@edge docker]# docker inspect 54a0c0ae4 #查看容器运行环境变量
[root@edge docker]# docker exec -it 54a0c0ae4 sh #进入容器内部,输入 exit 退出
[root@edge docker]# docker start 54a0c0ae4 #启动容器
[root@edge docker]# docker stop 54a0c0ae4 #停止容器
[root@edge docker]# docker restart 54a0c0ae4 #重启容器
子码掩网
子网掩码是用来判断任意两台计算机的ip地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的ip地址与子网掩码进行and运算后,得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。
docker net 网络
docker network ls //查看docker 网络列表
docker network rm docker_nacos-net //删除docker网络,只有这个指令 能将docker创建的网卡彻底删除
docker network inspect docker_nacos-net //查看docker-net 设置
登录报时间戳差别太大
测试服务器没有外网,可能导致时间戳不准确,可以联网更新时间,也可以手动设置。注意 时间戳与时区无关,所有时区都拥有相同的时间戳;
timedatectl #查看服务器时间信息
[root@yzn ~]# timedatectl
Local time: 二 2022-03-08 17:57:02 PST # 本地时间
Universal time: 三 2022-03-09 01:57:02 UTC #
RTC time: 三 2022-03-09 01:57:02 #硬件时间
timedatectl set-time “2022-03-08 17:53:15”
hwclock --systohc # 将硬件时间和本地时间设置为同一个值
查看容器内部的时间
[root@yzn ~]# docker exec -it 93c43 sh
/ # date
Wed Mar 9 02:06:55 UTC 2022
#UTC时间 是国际标准时间,比北京时间慢8小时
[root@yzn ~]# docker exec -it 89fdd sh
# date
Tue Mar 8 18:07:51 PST 2022
#PST时间 是太平洋标准时间,
#CST时间
切换用户
部署踩坑
docker ip冲突解决
docker启动时桥接网络,会占用172.17.x.x等ip,导致部分内网服务ip ping不通,此时要修改 docker配置文件daemon.json
docker 自身占 docker0网卡
docker-compose文件里面的 nacos-net 配置会产生一个 br-xxx的网卡
ifconfig
br-5ffc8302bb77: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:98:82:9a:91 txqueuelen 0 (Ethernet)
RX packets 37661423 bytes 3665781535 (3.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9842642 bytes 1809093631 (1.6 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
ether 02:42:fe:88:2f:99 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker 启动配置文件 daemon.json
如果要修改两网卡对应的ip
daemon.json 配置
{
"registry-mirrors":[
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"insecure-registries":[
"172.16.6.243:5000",
"191.0.0.158",
"172.17.6.38"
],//私库ip
"bip":"192.168.100.1/24", # docker0
"default-address-pools":[ # docker-nacos-net
{
"base":"172.19.0.1/16",
"size":24
}
]
}
bip 修改 docker0 ip
default-address-pools 定义br-***网卡对应的可用ip池
修改daemon.json重启之后,docker0的ip会立刻改变,但是br-*** 的ip不会变,且通过停用和删除网卡也不生效
此时需要
docker network ls // 查看docker网络列表
NETWORK ID NAME DRIVER SCOPE
633fd38f53f4 bridge bridge local
d3f5bc92e248 docker_nacos-net bridge local
eb221043e2f7 host host local
e916b12924b8 none null local
docker network inspect bridge // bridge 或者 633fd38f53f4 都可以,可以通过IPAM的config确实是谁占用了ip
“IPAM”: {
“Driver”: “default”,
“Options”: null,
“Config”: [
{
“Subnet”: “192.168.100.1/24”,
“Gateway”: “192.168.100.1”
}
]
},
docker network rm docker_nacos-net // name h和 networkid 都可以,删除docker已经建立的ip
重启docker,default-address-pools 的配置才会生效,docker新建 br-*** 网卡,ip占用解除
docker-compose up -d 报permission denied 错误
docker-compose up -d
ERROR: for docker_service-monitor_1 Cannot start service service-monitor: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"write /proc/self/attr/keycreate: permission denied\"": unknown
Creating docker_basic-web-h5_1 ... error
ERROR: for node-exporter Cannot start service node-exporter: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"write /proc/self/attr/keycreate: permission denied\"": unknown
Creating redis-exporter ... error
Creating mysql ... error
eycreate: permission denied\"": unknown
修改 /etc/selinux 下config文件SELINUX=disabled 重启服务器
docker-compose容器的配置优先级问题
nacos:
image: nacos/nacos-server:1.4.1
container_name: nacos-server
privileged: true
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
- "7098:7098"
- "7099:7099"
depends_on:
- mysql
restart: always
networks:
nacos-net:
aliases:
- nacos
env_file:
# mysql数据库的连接配置
- ./env/nacos-standlone-mysql.env
environment:
JVM_XMS: 256M
JVM_XMX: 256M
JVM_XMN: 90M
cloud-auth-service:
image: 172.17.6.38/matterhorn/cloud-auth-service-yzn:v2.0.68
container_name: cloud-auth-service
restart: always
ports:
- 12006:12004
depends_on:
- nacos
- sentinel
- rabbitmq
networks:
nacos-net:
# ipv4_address: 172.18.0.201
aliases:
- auth1
environment:
TZ: Asia/Shanghai
SERVER_PORT: 12004
JAVA_OPTS: -Xmx256m -Xms256m
nacos_server-addr: nacos:8848
nacos_namespace: prod
SPRING_CLOUD_NACOS_CONFIG_ENABLED: 'true'
SPRING_CLOUD_NACOS_DISCOVERY_ENABLED: 'true'
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
SPRING_REDIS_PASSWORD: ${RedisPwd}
tx-lcn.client.enableTxlcn: 'true'
tx-lcn.client.manager-address: 172.16.6.40:8070
-
cloud-auth-service服务依赖nacos,在auth节点 depends_on 配置nacos,dcoker-compose会先构建nacos镜像容器,再构建自身
-
docker-compose的environment节点,可以覆盖项目application.yml和 bootstrap.yml中的配置,但是会被项目依赖的nacos的相同配置覆盖,优先级是nacos > docker-compose environment > application.yml和 bootstrap.yml ,如果dockercompose修改配置不生效,考虑是不是被nacos配置。
-
nacos_server-addr: nacos:8848 , nacos的host是使用的 nacos-net 注册服务为我们分配的,可以通过 docker network inspect docker_nacos-net 查看这些nacos对应点ip
"Containers": { "13c8234722d024b1d522456ed46f3fffba8c3f79fd6abf447c3a7672c9b27f94": { "Name": "mysql", "EndpointID": "ead1950951b547b3b6c8e6f0b67c953eddcecbc60acc2a45ab7541627f7324a7", "MacAddress": "02:42:ac:13:00:0d", "IPv4Address": "172.19.0.13/16", "IPv6Address": "" }, "1575272562d54cbb53ca903b4b3d43d95153f439184153ebf5ef661b83d7e1bf": { "Name": "docker_notice-service_1", "EndpointID": "886e4f7ae9c1176005b86bd8a291174a21f3e77d911a725386ecc7948ba0480e", "MacAddress": "02:42:ac:13:00:1c", "IPv4Address": "172.19.0.28/16", "IPv6Address": "" }
model-service-cloud连接未知数据源
model-service-cloud连接 127.0.0.1:5432 ,且修改docker-compose environment 数据源地址配置无效,model-service-cloud使用的dbcloud服务接口返回的数据源配置,取 db_datasource 表的默认数据源配置,要手动修改,再重启model-service-cloud
RabbitMQ启动失败,可执行权限
#rabitmq
rabbitmq:
image: 191.0.0.158/base/rabbitmq:3.8.2-management
networks:
nacos-net:
aliases:
- rabbitmq
restart: always
ports:
- 15673:15672
- 5673:5672
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
volumes:
- /usr/share/zoneinfo/Asia:/usr/share/zoneinfo/Asia
- ./config/rabbitmq/scripts/cluster_entrypoint.sh:/usr/local/bin/cluster_entrypoint.sh
- ./config/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
command:
- /bin/sh
- -c
- |
chmod +x /usr/local/bin/cluster_entrypoint.sh #给自定义脚本分配权限,否则报错
entrypoint: "/usr/local/bin/cluster_entrypoint.sh" #通过自定义脚本来启动rabbitmq
environment:
TZ: Asia/Shanghai
command:
- /bin/sh
- -c
- |
chmod +x /usr/local/bin/cluster_entrypoint.sh #给自定义脚本分配权限,否则报错
rabbitMQ要给cluster_entrypoint.sh可执行权限
volumes:
- /usr/share/zoneinfo/Asia:/usr/share/zoneinfo/Asia
- ./config/rabbitmq/scripts/cluster_entrypoint.sh:/usr/local/bin/cluster_entrypoint.sh
- ./config/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
volumes 是docker的文件映射配置, : 号的左边 为服务器的文件地址 : 号右边为容器的文件地址 ,容器实际上要执行外部的sh文件,故./config/rabbitmq/scripts/cluster_entrypoint.sh要配置未可执行文件
服务nacos配置中心配置不生效
nacos_server-addr: nacos:8848
nacos_namespace: nacos
配置nacos地址,但是启动配置获取不到。nacos SERVER-ADDR 无法连接时 项目会启动不了,nacos_namespace 配置错误时,或者 namespace在nacos中不存在时,会优先使用本地的配置,不配置namespace时 默认使用pulic可能不会报错,此时要确认namespace在nacos中是否存在,如果存在 看看是不是配置错了 namespace 对应 nacos 命名空间 - 命名空间ID
nacos配置可以直接在挂你后台导入和导出 搬运配置
docker服务间互相访问不通
看上文 防火墙墙对外暴露端口 的配置
txlcn 存在不健康的集群
txlcn启动之后 权限服务出现如下报文 TM cluster’s size: 2 认为txlcn 有集群,多了 172.16.6.40:8070 服务,txlcn存在自动集群,172.16.6.40是因为我配置错误产生的,此服务是无法正常运行的,但是 重启docker还是存在此异常的服务
将 txlcn依赖redis中 tm.instances的缓存清除,才集群消失
txlcn 报不存在的groupId,接口访问直接报此错误
Caused by: com.codingapi.txlcn.common.exception.TransactionException: com.codingapi.txlcn.common.exception.LcnBusinessException: com.codingapi.txlcn.common.exception.TxManagerException: attempts to join the non-existent transaction group
redis 缓存了一个不存在的groupid,清除 tm.machine.id.gen 缓存
docker网络通信
搬运配置
docker服务间互相访问不通
看上文 防火墙墙对外暴露端口 的配置
txlcn 存在不健康的集群
txlcn启动之后 权限服务出现如下报文 TM cluster’s size: 2 认为txlcn 有集群,多了 172.16.6.40:8070 服务,txlcn存在自动集群,172.16.6.40是因为我配置错误产生的,此服务是无法正常运行的,但是 重启docker还是存在此异常的服务
将 txlcn依赖redis中 tm.instances的缓存清除,才集群消失
txlcn 报不存在的groupId,接口访问直接报此错误
Caused by: com.codingapi.txlcn.common.exception.TransactionException: com.codingapi.txlcn.common.exception.LcnBusinessException: com.codingapi.txlcn.common.exception.TxManagerException: attempts to join the non-existent transaction group
redis 缓存了一个不存在的groupid,清除 tm.machine.id.gen 缓存
docker网络通信
dockerfile 构建镜像
平台服务镜像的dockerfile,docker build -t 191.0.0.158/escloud/escloud-resource-service:v2.0.02 .
build指令会在命令执行目录,按照 dockerfile 去构建一个docker镜像;
如下的dockerfile可以简单理解为将使用当前目录下的 ./target/escloud-resource-service-2.0.06.war 构建一个191.0.0.158/escloud/escloud-resource-service:v2.0.06 的镜像。191.0.0.158是镜像私库地址,/escloud 是私库中镜像分组(类似与文件夹分类镜像),escloud-resource-service 镜像名称,v2.0.06 镜像版本。
# FROM 指定基础镜像,注意 第一条指令一定是 FROM, 拉取一个已经有java运行环境的镜像作为基础镜像
# FROM <imageName>:<imageVersion>,imageVersion可为空,为空时默认拉取最新版本的镜像
FROM 191.0.0.158/base/openjdk-with-fontconfig:8-jdk-dbg-alpine
#VOLUME 用于指定持久化目录,在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。及时容器被删除也会保留在宿主机上
VOLUME /tmp
#ARG 定义参数,此处时将Maven 配置文件对应参数拼接到war包名称中,用maven插件打包可以这么弄,不适用maven插件则服务解析会报错
ARG artifactId
ARG VERSION
# ADD (复制并解压文件,支持自动解压缩)将系统目录的文件 复制到 容器目录,将打包的war文件复制到镜像中
ADD ./target/${artifactId}-${VERSION}.war /${artifactId}.jar # maven打包时,会定义成如下的效果。不使用maven则写死不要用${}取变量
# ADD http://example.com/foobar /data #也可以访问网络资源,类似wget,但来自远程URL 的资源不会被解压缩
#ADD ./target/escloud-resource-service-2.0.06.war /escloud-resource-service.jar
#ENV 设置环境变量
ENV JAVA_OPTS=""
ENV JAR_FILE_NAME= "escloud-resource-service"
#ENTRYPOINT 设置容器的入口程序,功能类似于CMD,配置容器启动后执行的命令及参数
#Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效
#Djava.security.egd 这个是用来防止 springboot 项目 tomcat 启动慢的问题(具体可搜索:随机数数与熵池策略)
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 /escloud-resource-service.jar" ]
# CMD (用来指定启动容器时默认执行的一个命令,build镜像时不会执行,容器启动时会执行) 执行 java -jar ***.jar的指令,运行jar。springboot jar包自带了Tomcat,此命令就将web项目运行在 tomcat容器中
# 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
# 启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令
CMD java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /escloud-resource-service.jar
docker-compose 管理容器
镜像image 和 容器container,镜像是一个静态概念,可以理解为我们的编译后的代码文件包,镜像时无法运行和启动的,并不是一个能够执行的程序。
镜像 -》 容器,是将镜像变为可以执行的程序,我们最终启动的是容器,容器才是可以启动和关停的程序。
docker 镜像 -> 容器 的指令如下
#指令一
docker create imageName:imageVersion # 只从镜像构建为容器,
docker start -a 容器id ##启动容器, -a == attach,不使用-a则没有容器运行日志显示
#指令二
docker run imageName:imageVersion # 镜像构建为容器并启动的指令
docker-compose是一个容器管理的工具,他能解决很多痛点
1.项目镜像很多,一个一个上传费时,容易少传或者版本不对,服务器镜像数量和版本也管理复杂。docker-compose文件记录的项目使用的镜像和版本,很直观的看到项目依赖的镜像,构建容器时,docker-compose也能自动从私库拉取对应版本的镜像;
2.镜像到容器,需要docker run,docker-compose能直接将镜像构建成容器,并按用户自定义的顺序启动各个容器;
3.废弃容器的删除,docker ps -a 会看到很多已经不在运行的容器,随着服务器镜像版本迭代,会有很多不再运行的容器,docker-compose会删除未运行的容器
4.项目环境变量配置,结合docker-compose中的environment,我们可以很轻易的覆盖项目配置,而不需为了修改配置,重新构建镜像。当docker-compose中修改了对应容器的配置 或者镜像版本时,docker-compose也能监测到修改,重启时只重新构建有修改的容器。
平台服务镜像的docke-compose配置
escloud-resource-service:
image: 172.17.6.38/escloud/escloud-resource-service:v2.0.06
container_name: escloud-resource-service
restart: always
ports:
- 5090:5090
#depends_on:
# - nacos
# - rabbitmq
# - txlcn
#links:
#- redis
networks:
nacos-net:
aliases:
- resource1
environment:
TZ: America/Los_Angeles
SERVER_PORT: 5090
JAVA_OPTS: -Xmx256m -Xms256m
nacos_server-addr: 172.16.6.40:8848
nacos_namespace: prod
SPRING_CLOUD_NACOS_CONFIG_ENABLED: 'true'
SPRING_CLOUD_NACOS_DISCOVERY_ENABLED: 'true'
spring_cloud_nacos_discovery_register-enabled: 'true'
server_max-http-form-post-size: -1
server_max-http-header-size: 1024000
CET_FILE-UPLOAD_PATH: /etc/CET/upload
# Redis配置
SPRING_REDIS_HOST: 172.16.6.40
SPRING_REDIS_PORT: 6379
SPRING_REDIS_PASSWORD: ${RedisPwd}
SPRING_REDIS_DATABASE: 4
SPRING_PROFILES_ACTIVE: 40e
#SPRING_CLOUD_NACOS_DISCOVERY_IP: 172.16.6.119
# 是否开启 RABBITMQ
SPRING_RABBITMQ_ENABLED: 'true'
# 连接配置项
SPRING_RABBITMQ_ADDRESSES: 172.16.6.40:5673
SPRING_RABBITMQ_USERNAME: 'admin'
SPRING_RABBITMQ_PASSWORD: 'Q2wdgT8k'
SPRING_CLOUD_NACOS_CONFIG_SERVER-ADDR: 172.16.6.40:8848 #${DataBaseUrl}:8848
SPRING_CLOUD_NACOS_DISCOVERY_SERVER-ADDR: 172.16.6.40:8848 #${DataBaseUrl}:8848
cet_base-service_model-service_url: 172.16.6.40:8086
cet_base-service_cloud-auth-service_url: ''
cet_base-service_db-cloud-service_url: 172.16.6.40:18080
cet_base-service_escloud-service_url: 172.16.6.40:8041
cet_base-service_notice-service_url: 172.16.6.181:15070
cet_base-service_capacity-service_url: 172.16.6.40:8042
cet_base-service_model-management-service_url: 172.16.6.40:8090
cet_base-service_device-data-service_url: 172.16.6.40:4118
cet_base-service_pec-node-service_url: 172.16.6.40:4119
tx-lcn.client.enableTxlcn: 'true'
tx-lcn.client.manager-address: 172.16.6.40:8070
scheduled_enable: 'false'
CET_FILE-MODEL-META_PATH: /home/cet/model/
CET_file-model-upload_PATH: /home/cet/model/upload/
SPRING_APPLICATION_NAME: escloud-resource-service-tttare
volumes:
- /etc/CET/upload/:/etc/CET/upload/
- /home/cet/model/upload/:/home/cet/model/upload/
- /home/cet/model/:/home/cet/model/