实用干货分享(4)- 分布式金融PaaS容器化部署实战
编辑
一、学习链接
http://www.itmuch.com/docker/00-docker-lession-index/
二、安装步骤
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --enable docker-ce-edge # 启用edge仓库
sudo yum-config-manager --enable docker-ce-test # 启用test仓库
sudo yum makecache fast
sudo yum install docker-ce
sudo systemctl start docker
sudo docker run hello-world
三、常用操作指令
下载镜像
镜像下载地址:hub.docker.com
或者使用docker search filebeat (搜索镜像)
编辑
容器重启
docker restart nginx (容器的name)
打包及启动指令
docker build -t dap/mq_server:v1
docker run --name mq_server \
--restart=always \
-p 8899:8899 \
-v /root/mq/mq/application.properties:/opt/mq/application.properties \
-d dap/mq_server:v1 \
查看容器日志
docker logs -f nginx (容器的name)
显示所有的容器(包括未运行的)
docker ps -a
进入容器内部的bash窗口
docker exec -it nginx /bin/bash
查看容器元数据,可看到挂载信息
docker inspect mysql (容器的name)
生成和加载docker镜像tar包
docker save youimages > name
docker load < yourimages
镜像重命名
docker image tag [镜像id] 新名称
查询CentOS的bash路径
[root@deploy dap-skywalking]# docker run -it centos:7.7.1908 whereis bash
bash: /usr/bin/bash
编辑
挂载本地时间
/ect/localtime -- 挂载本地的时间到docker容器中解决日志打印的时间格式问题
四、常见问题
运行docker容器
iptables: No chain/target/match by that name
编辑
执行一下 :systemctl restart docker
编辑
https://blog.csdn.net/u013948858/article/details/83115388
安装docker客户端遇到的问题
编辑
https://www.cnblogs.com/maodot/p/7654918.html
redis 启动权限问题
更改redis 路径下的权限,也可以使用第5个问题的解决思路
chown 1000:1000
chmod 1777
https://blog.csdn.net/luozhonghua2014/article/details/80369469
文件创建权限问题
/opt/app/skywalking-apm-bin/logs/skywalking-oap-server.log
编辑
在启动指令中增加 :--privileged=true (不推荐)
推荐方法:直接在Dockerfile中添加 RUN chmod -R 777 /opt/app/ 命令来修改该文件夹下的所有权限
编辑
ADD与COPY的区别
对于需要在外部单独修改的配置文件,推荐使用COPY指令,而不是ADD指令。
ADD指令只针对于tar包文件,指令本身有解压的功能。
五、DockerFile
mysql服务搭建
docker run --name mysql --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.20
CREATE DATABASE IF NOT EXISTS config_server DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
CREATE DATABASE IF NOT EXISTS mq_console_new DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
使用docker命令登录容器内的mysql:
docker exec -it mysql /bin/bash
mysql -u root -p 123456
Dockerfile:自定义MySQL容器,添加自定义配置:
FROM mysql:5.7.20
RUN echo "[mysqld]" >> /etc/mysql/mysql.cnf \
&& echo "lower_case_table_names=1" >> /etc/mysql/mysql.cnf \
&& echo "character_set_server=utf8" >> /etc/mysql/mysql.cnf \
&& echo "init_connect='SET NAMES utf8'" >> /etc/mysql/mysql.cnf \
&& echo "sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" >> /etc/mysql/mysql.cnf \
&& echo "[client]" >> /etc/mysql/mysql.cnf \
&& echo "default-character-set=utf8" >> /etc/mysql/mysql.cnf
直接使用java命令启动
FROM centos:7.7.1908
MAINTAINER zhaikai
WORKDIR /usr/local
ADD jdk-8u251-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_251
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
ENV LANG C.UTF-8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
WORKDIR /opt/config
ADD dap-boot-starter-config-server-1.0-SNAPSHOT.jar /opt/config/app.jar
#VOLUME application-config.yml -- 写法有些问题,还需要一些其他工作
COPY application-config.yml /opt/config/application-config.yml
#EXPOSE 8087
ENTRYPOINT ["java","-jar","/opt/config/app.jar","--spring.config.location=/opt/config/application-config.yml"]
使用启动脚本启动
FROM centos:7.7.1908
MAINTAINER zhaikai
WORKDIR /usr/local
ADD jdk-8u201-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_201
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
ENV LANG C.UTF-8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
WORKDIR /opt/app
ADD batch-web.tar.gz /opt/app/
RUN chmod -R 777 /opt/app/
ENTRYPOINT ["/usr/bin/bash","-c","/opt/app/batch-web/bin/start.sh"]
下载中文语言包
日志模块需要额外下载中文语言包,用以解决配置文件中的中文无法在页面正常显示的问题。
FROM centos:7.7.1908
MAINTAINER zhaikai
WORKDIR /usr/local
ADD jdk-8u201-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_201
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
RUN yum install kde-l10n-Chinese -y
RUN yum install glibc-common -y
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#RUN export.UTF-8
#RUN echo "export.UTF-8" >> /etc/locale.conf
#ENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8
#RUN yum -y install kde-l10n-Chinese --nogpgcheck
#RUN yum reinstall -y glibc-common --nogpgcheck
#RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
#RUN yum -y groupinstall chinese-support
ENV.UTF-8
WORKDIR /opt/app
ADD logger-deploy.tar.gz /opt/app/
RUN chmod -R 777 /opt/app/
ENTRYPOINT ["/usr/bin/bash","-c","/opt/app/logger-deploy/startup.sh"]
Nginx前端代理
FROM nginx:latest
MAINTAINER zhoulei
ENV LANG C.UTF-8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ADD config-web.tar.gz /usr/share/nginx/html
打包以及启动指令:
docker build -t dap/console:v1 .
docker run -itd \
--privileged=true \
-p 8888:80 \
--restart=always \
--name nginx \
-v /home/docker/dap-web/nginx.conf:/etc/nginx/nginx.conf \
-v /var/log/nginx/logs:/var/log/nginx \
-d dap/console:v1 \
使用域名进行动态加载
DNS配置:
containers 同一级下进行配置:
hostAliases:
- hostnames: ['域名']
ip: IP地址
编辑
nginx配置文件
127.0.0.1 配置域名
编辑
六、Skywalking
SkyWalking服务
需要配置端口映射:8090(前端)、11800(RPC)、11800(HTTP)
注意一下一定要执行SkyWalking的初始化脚本(oapServiceInit.sh),里面包含了创建ES索引的各种操作。
三个Demo
有几个关键步骤:
1、将agent包放入demo路径下
2、修改启动脚本,将IP和端口设为负载均衡的IP端口
编辑
3、修改jar包中zk的地址
编辑
4、eCas-order启动后,需要将配置文件中的8107端口进行负载均衡的配置
5、eCas-order启动后,需要该应用将日志路径挂载到filebeat指定的节点机器中的指定路径中,以便日志系统进行采集
七、容器化总结
在进行容器化部署时,可能会出现如下问题:
1. 中文语言包
由于容器中没有安装中文包,所以日志模块部署上去后,原本是中文的某些显示项,会变成乱码。解决方法见【DockerFile】章节中的【下载中文语言包】
2. 尽量保证一个容器运行一个应用
容器是docker运行的一个最小单元,往往推荐只运行一个应用。如果运行多个应用,一旦遇到问题,很难通过容器平台对错误进行定位。因为日志是多个应用杂乱无章的显示;多个应用之间的启动、以及调用可能也会出现相应的问题;容器的重新打包也会相应的变得复杂起来。所以最好的部署方式是一个容器运行一个应用。
3. nohup尽量不要使用
因为docker logs获取的是标准控制台的日志打印。nohup会影响日志的查看,影响我们对容器的启动情况进行排查。
4. VOLUME尽量不要使用
DockerFile中如果需要添加配置文件,尽量不要使用VOLUME 进行挂载。使用COPY命令即可,如果没有搞清楚文件夹和文件之间的关系,抑或没有提前处理好权限问题的话,使用VOLUME会出现很多问题。
5. 容器不断重启
如果容器不断重启,或者无法直接启动。而控制台的日志并没有给出一个明确的打印。会给异常排错带来很大的困难。解决方案就是将容器中的应用日志挂载到宿主机的指定路径下,当容器发生启动异常或者不断重启的问题时,可以在宿主机中进行日志查看。
实用干货分享(4)- 分布式金融PaaS容器化部署实战的更多相关文章
- 逆向实用干货分享,Hook技术第一讲,之Hook Windows API
逆向实用干货分享,Hook技术第一讲,之Hook Windows API 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) ...
- 逆向实用干货分享,Hook技术第二讲,之虚表HOOK
逆向实用干货分享,Hook技术第二讲,之虚表HOOK 正好昨天讲到认识C++中虚表指针,以及虚表位置在反汇编中的表达方式,这里就说一下我们的新技术,虚表HOOK 昨天的博客链接: http://www ...
- 浅谈surging服务引擎中的rabbitmq组件和容器化部署
1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...
- 谈谈surging引擎的tcp、http、ws协议和如何容器化部署
1.前言 分布式已经成为了当前最热门的话题,分布式框架也百花齐放,群雄逐鹿.从中心化服务治理框架,到去中心化分布式服务框架,再到分布式微服务引擎,这都是通过技术不断积累改进而形成的结果.esb,网关, ...
- Jaeger容器化部署
概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...
- elk 7.9.3 版本容器化部署
ELK-V7.9.3 部署 为什么用到ELK? 平时我们需要进行日志分析的时候,可以直接在日志文件中 grep.awk 就可以过滤出自己想要的信息及关键字,但规模较大的场景中,此方法极大的减低了效率, ...
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
- 1. 容器化部署一套云服务 第一讲 Jenkins(Docker + Jenkins + Yii2 + 云服务器))
容器化部署一套云服务系列 1. 容器化部署一套云服务之Jenkins 一.购买服务器 服务器
- angular应用容器化部署
angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...
- Flask容器化部署原理与实现
本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...
随机推荐
- kali系统安装和CVE-2017-12615测试
1 安装kali系统 1.1 下载VMware压缩包 kali-linux-2022.1 默认的用户和密码是kali 1.2 初始化系统 sudo apt update -y #kali sudo a ...
- PHP面试,拼团
如何设计数据库模型来支持拼团功能? 答案:拼团功能涉及到多个用户参与同一团的情况,可以设计以下表结构: Product 表: 存储商品信息,包括商品ID.名称.价格等字段. Group 表: 存储拼团 ...
- Windows应急响应-QQ巨盗病毒
目录 病毒背景 样本分析 开启监控 感染病毒 分析病毒行为 C盘文件监控 D盘文件监控 进程监控排查 服务排查 启动项排查 查杀 1.杀掉进程 2.异常服务 3.映像劫持处理 4.hosts文件处理 ...
- 深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式
来源 卷积: 输入尺寸 ,卷积核的大小为 * ,输出的尺寸大小为 参数量 (1)不考虑bias:(2)考虑bias: FLOPs (1)不考虑bias 解释:先计算输出的中一个元素需要的计算量, ...
- iOS键盘通知弹框使用小结
项目开发中文本框输入的时候经常会用到键盘弹框遮挡的问题.解决办法就是根据底部键盘弹出的高度动态的改变对应view的位置.这里以多行文本框输入为例,效果图如下. //第一步,注册监听键盘通知 [[NSN ...
- 简述 JavaScript脚本的执行原理?
js 是一种动态 . 弱类型 . 基于原型的语言 ,通过浏览器可以直接执行: 当浏览器遇到 <script></script>标记时 , 会执行标记之间的js 代码:然后js ...
- DirectoryOpus插件:“照得标管理器”-海量照片分类管理好帮手!
照得标管理器 前言 名词解释:"照得标管理器",即:照片得到标签管理器,后文统一简称"照得标管理器"或"照得标". 注:请不要和抖 ...
- 云原生周刊: 使用 Kubectl 执行 100 个 Kubernetes 诊断命令 | 2023.10.23
开源项目推荐 Stern Stern 是一个针对 Kubernetes 的多 pod 和容器日志跟踪工具.可以跟踪 Kubernetes 上的多个 pod 和 pod 中的多个容器.每个结果都用颜色编 ...
- 在 Kubernetes 中实现微服务应用监控
张坚,科大讯飞开发工程师,云原生爱好者. 本篇文章我们基于 Prometheus 和 Grafana 实现微服务应用监控. KubeSphere 平台本身提供了监控功能,包括节点状态.集群资源使用率. ...
- go: 在proto中使用oneof类型
在proto中,可以使用OneOf类型,使用一个字段存储不同类型的数据.类似go中的interface. 假设有proto如下,Val是一个OneOf数据类型,它可以为double/int/str.. ...