一、概述
docker-compose 是一个很好用的容器编排工作,使用docker 直接部署应用的话过程过于繁琐,也不利于维护。本文将介绍怎么使用docker-compose 去部署应用,前期需要先部署docker-compose 可参考 centOS7 安装docker-compos 这篇博文。
二、配置过程
2.1 基础配置
services:
容器的基础配置,在这里需要先定义好容器的名称,引入的基础镜像,挂载卷和端口等。
version: "3.1"
services:
XXXXXXX: #定义容器,可自定义命名(一般与容器名称相同)。
container_name: xxxxxxx #容器名称,如是java 项目 可以直接命名为应用名称
image: XXXXXX # 需要导入的镜像,如果是java 应用,则jdk 是必要的,所以需要导入jdk的镜像
working_dir: /root/xxxx #工作区间
volumes: # 磁盘挂载,就是将容器中的 文件路径 挂载映射至宿主机
# 格式: - 容器文件路径:宿主机路径 ./ 表示当前路径
- ./:/opt # 例如 容器启动的当前路径 挂载到 宿主机的 /opt 目录下
ports: #端口
# 格式: -容器内端口:宿主机端口
- 8080:8080
2.2 程序启动配置
在配置完基础信息以后,接下来就是需要配置,我们启动java 程序的指令参数,这部分配置在 command: 下
command: [
"java",
"-Djava.security.egd=file:/dev/./urandom",
"-Dfile.encoding=UTF-8",
"-Duser.timezone=GMT+08",
"-Duser.dir=/opt/xxxxx",
"-Djava.library.path=/opt/xxxx",
"-XX:+UseContainerSupport",
"-XX:MaxRAMPercentage=50",
"-XX:+UseG1GC",
"-XX:MaxGCPauseMillis=100",
"-XX:ParallelGCThreads=8",
"-XX:ConcGCThreads=4",
"-XX:+TieredCompilation",
"-XX:+UseStringDeduplication",
"-XX:+OptimizeStringConcat",
"-XX:+HeapDumpOnOutOfMemoryError",
"-XX:HeapDumpPath=/opt/xxxxxx/heapdump",
"-jar","-javaagent:/opt/application/skywalking-agent/skywalking-agent.jar",
"-jar","/xxx/xxxx/xxxxx.jar",
"--user.dir=/opt",
"--spring.profiles.active= xxx",
"--server.port=8080"
]
上面配置为jvm启动参数和程序所需的配置参数。
2.3 环境变量配置
为了方便配置管理,做到环境的配置与代码的隔绝,有时候我们需要将一些中间件客户端配置写在环境变量中,方便其启动时根据不同环境获取不同的配置参数。如nacos 这样子 需要在配置文件中配置对应的环境变量,想这些配置参数我们会统一放在 environment: 下。
environment:
TZ: Asia/Shanghai
NACOS_ADDR: "xxx.xxxx.xxxx.xxxx:8848"
NACOS_USERNAME: "xxxxx"
NACOS_PASSWORD: "xxxxx"
NACOS_NAMESPACE: "xxxx"
LOGBACK_ROLLINGPOLICY_MAX_HISTORY: "7"
LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE: "50MB"
2.4 容器参数配置
最后就要开始配置一些容器的参数配置了,比如 操作,系统资源,网络等。
restart: "yes" #是否重启,该参数配置以后,当应用或者容器下线时,会自动重启
mem_limit: 2g #容器等内存限制
cpus: 2 #容器等cpu限制
logging:
options:
max-size: 512m #设置容器日志 最大为512m
networks: #网络配置
default:
external:
name: weave # 当前使用的是 weave 网络管理,也可以自行组建子网,或者自己 桥接至宿主机网络
配置完以上参数以后,就可以开始启动应用,只需要使用docker-compones up -d 命令即可启动。
三、问题原因排查
在新手使用时,更多遇到的是 网络问题,容器网络互动配置。当服务无法访问时,应该先检查当前服务端口是否有开放,可以进去一个容器中去访问另一个应用。理论上,只要容器间在同一个子网内,网络访问就不会有问题。
还有一个问题就是jvm 问题,这个可以看看我的另一篇文章:容器环境下 jvm问题排查