Docker部署之使用docker-compose部署(全新的干净的服务器,从0开始搭建)
部署环境准备
安装yum
# 安装yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 --skip-broken 安装dcoker
# 设置docker镜像源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's/download.docker.com/mirrors.aliyun.com/docker-ce/g' /etc/yum.repos.d/docker-ce.repo yum makecache fast #安装docker社区版 yum install -y docker-ce 启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙! # 关闭 systemctl stop firewalld # 禁止开机启动防火墙 systemctl disable firewalld # 启动docker服务 systemctl start docker # 停止docker服务 systemctl stop docker # 重启docker服务 systemctl restart docker #开机自启 systemctl enable docker # 查看docker docker -v 安装docker-compose
# 安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # 修改文件权限 chmod +x /usr/local/bin/docker-compose # 查看docker-compose docker-compose -v 安装小皮面板
# 安装小皮面板 yum install -y wget && wget -O install.sh https://notdocker.xp.cn/install.sh && sh install.sh
Dockerfile文件(可复制下来改改直接用)
# 编写Dockerfile # 基础镜像,当前新镜像是基于哪个镜像 FROM openjdk:8-oracle # RUN:容器构建时需要运行的命令 ENV TZ = "Asia/Shanghai" # ADD:将宿主机目录下的文件拷贝到镜像且 ADD 命令会自动处理 URL 和解压 tar 压缩包 WORKDIR / ADD ./donger-mom-mes-3.0-executor.jar mes.jar # 利用 chmod 可以藉以控制文件如何被他人所调用。 RUN chmod +x mes.jar # EXPOSE:当前容器对外暴露的端口 EXPOSE 9000 # CMD:指定一个容器启动时要运行的命令。Dockerfile 中可以有多个 CMD 命令, # 但只有最后一个生效,CMD 会被 docker run 之后的参数替换 CMD ["java", "—Xmx1024m", "—Xms1024m", "-jar", "mes.jar", "--spring.config.location=/etc/mes/config/application.yml"]
docker-compose.yml文件(可复制下来改改用)
version: '3'
services:
mes:
image: mes
build:
context: ./mes-api
dockerfile: Dockerfile
ports:
- 9000:9000
volumes:
- ./mes-api/config:/etc/mes/config
restart: always
depends_on:
- mysql
- redis
- minio
container_name: mes
hostname: "mes"
wms:
image: wms
build:
context: ./wms-api
dockerfile: Dockerfile
ports:
- 9002:9002
volumes:
- ./wms-api/config:/etc/wms/config
restart: always
depends_on:
- mysql
- redis
- minio
container_name: wms
hostname: "wms"
pln:
image: pln
build:
context: ./pln-api
dockerfile: Dockerfile
ports:
- 9004:9004
volumes:
- ./pln-api/config:/etc/pln/config
restart: always
depends_on:
- mysql
- redis
- minio
container_name: pln
hostname: "pln"
mysql:
image: mysql:5.7 # 原镜像`mysql:5.7`
environment:
MYSQL_ROOT_PASSWORD: cloudmes
MYSQL_ROOT_HOST: '%'
TZ: Asia/Shanghai
restart: always
container_name: mysql
command:
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--innodb_buffer_pool_size=2048M
--sql-mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIO
--init-file /docker-entrypoint-initdb.d/init.sql
ports:
- "4306:3306"
volumes:
- ./db/init/init.sql:/docker-entrypoint-initdb.d/init.sql
- ./db/my.cnf:/etc/mysql/my.cnf
- ./db/mydata:/var/lib/mysql
- /etc/timezone:/etc/timezone
- /etc/localtime:/etc/localtime
hostname: mysql
# 缓存
redis:
image: redis
environment:
TZ: Asia/Shanghaii
ports:
- "7379:6379"
restart: always
container_name: redis
hostname: redis
command: ["redis-server", "--appendonly", "yes", "--requirepass","cloudmes"]
# minio
minio:
image: minio/minio:RELEASE.2022-06-30T20-58-09Z.fips
container_name: minio
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: cloudmes
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: cloudmes
command: server --console-address ':9011' /data
volumes:
- /opt/minio/data:/data
- /opt/minio/config:/root/.minio/
- /etc/localtime:/etc/localtime
ports:
- "9010:9010"
- "9011:9011"
restart: always
hostname: minio
运行容器
############### 运行容器 # 编写docker-compose.yml # 关闭docker容器 docker-compose down # 删除修改过的镜像服务,镜像对应上面标黄的部分,可以通过docker images查看一下镜像 docker rmi 镜像 # 运行容器 docker-compose up -d # 查看容器 docker ps # 查看日志 docker logs -f mes
包目录结构:
分析docker-compose.yml各个属性的意义,这是一些常用的三个中间件的信息,其余的自己百度一下。
在这里重点理解一下数据卷持久化的意义:
- 如果我有一个镜像,该镜像是一个MySQL5.7的镜像,将它启动为一个容器后,发现这个镜像里的MySQL使用的字符集是utf8,现在我想将数据库使用的字符集更改为utf8mb4,怎么办?
- 如果是在物理机安装的MySQL,遇到上述问题,我们通常的做法是在MySQL的主配置文件 my.cnf 文件中指定使用哪个字符集并重启MySQL服务使之生效即可,对于docker容器,当然也可以使用这种方法,进入容器-->找到配置文件-->修改文件并保存-->重启容器内的服务(很多容器并没有安装vi,vim这些文本编辑器,还需要自己手动安装~!~~!!!),可是如果一会又有了别的需求,比如,容器运行的MySQL服务缓慢,需要排查什么原因,这个时候怎么办呢? 还是重复上面的步骤 进入容器-->找到日志文件-->排查原因-->找到原因后修复问题?毫无疑问,这样是低效的方法。正是由于这些原因,docker提出了volume这个概念。
- 如果,能将容器内的所需要经常修改或者监控的文件放在宿主机并与容器内所在的原文件同步,那么这些痛点是不是就不是痛点了呢(也就是相互映射)?答案是肯定的,docker的volume就是互相映射宿主机和容器的文件的(比如将容器内的文件 A映射到了宿主机的家目录下,也就是家目录也有一个A文件,在容器内修改A文件,在宿主机家目录下的A文件也同时改变,同理,宿主机的A改变了,容器的A文件也改变 了,这样的情况,我们就称之为映射)。实现volume的前提是宿主机和容器可以互相的双向通信哦。(共享)
- 在制作docker-compose.yml文件时,遇到类似的问题可以按照这个方向对着百度找答案。
遇到的问题:
1. Mysql容器创建失败:
我遇到的原因是因为我进行数据卷持久化的文件mydata文件里面有内容,
导致创建的时候不成功,没有发现这个问题的原因
l 我没有使用ls命令查看到底有没有内容,而是一直看findshell的可视化页面,导致一直没有发现。这个地方应该记住使用命令,有些东西属于隐藏文件,而命令可以看到。
l 忘记查看mysql 的运行日志docker logs mysql ,对命令不够熟悉。
2. 运行sql文件时发生错误,并报错[ERR] 1153 - Got a packet bigger than 'max_allowed_packet' bytes:
① 我初步判断是因为字符序列不对应,或者是存在转义的问题(背景是我从阿里的
数据库转储的sql文件,然后放在腾讯云服务器上)显然不对。
② MySQL导入数据出现错误:Got a packet bigger than 'max_allowed_packet' bytes
原因是导入的数据大于系统的限制的最大包大小。
这里的话就看我的docker-compose是怎么写的
或者是进行数据卷持久化在my.cnf里面进行设置,
3. 部署前端报错,但是打包什么的配置都改好了,想不到什么地方有遗漏。
可以去看nginx.conf配置文件,不管是小皮还是镜像,都认真看,仿照着别的有些东西可能不知道什么意思,但是也要写上没因为可能没有什么作用,如果是不可缺少的部分,页面也会报奇奇怪怪的错误,比如 try_files $uri $uri/ /index.html; 不写会报错。
Docker部署之使用docker-compose部署(全新的干净的服务器,从0开始搭建)的更多相关文章
- Sentry 监控 - 私有 Docker Compose 部署与故障排除详解
内容整理自官方开发文档 系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Map ...
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
- Docker Compose 部署前后端分离应用
部署前后端分离应用 容器化 Abp 应用 关于 Abp 应用的容器化,其实和普通的 ASP.NET Core 应用差不多,大家可以参考我此前的文章. 唯一需要注意的是:因为 Abp 解决方案中有多个项 ...
- Docker - 使用Swarm和compose部署服务(containers)
前言 在之前使用Docker的过程中,一直是用 Docker run 命令单独启动container后再加入Overlay网络的方式实现部署工作的. 这种方式看似直接,但是随着服务所包含的contai ...
- 容器基础(七): 使用docker compose部署程序
配置 在上一节的基础上, 增加如下的docker-compose.yml文件, 然后用docker-compose up命令启动容器进行部署: version: " services: s ...
- Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 在Windows Server 2019通过Docker Compose部署Asp.Net Core
一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...
- 使用Docker Compose 部署Nexus后初次登录账号密码不正确,并且在nexus-data下没有admin,password
场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...
- Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
随机推荐
- Vue+SpringBoot+ElementUI实战学生管理系统-1.项目介绍
1.项目介绍 前段时间有位老铁问老徐有没有Vue+SpringBoot+ElementUI前后分离的项目想学习下,抱歉前端时间有点忙.千呼万唤始出来,做得不是很到位,需要的朋友可以拿去自己定制.:) ...
- Layui项目实战干货总结(精品)
写代码时遇到的知识点拿出来分享. 1.layer弹出层显示在top顶层 // 监听工具条 table.on('tool(tb-book)', function (obj) { var data = o ...
- Java序列化(Serializable)与反序列化详解
什么是序列化? Java序列化是在JDK 1.1中引入的,是Java内核的重要特性之一. Java序列化API允许我们将一个对象转换为流,并通过网络发送,或将其存入文件或数据库以便未来使用, 反序列化 ...
- helloShell
初识SHELL 变量 常规的变量赋值不必多说,shell脚本还可以从命令输出中提取信息,赋值给变量 反引号字符 testing= `date` $( )格式 testing=$(date) #!/bi ...
- Hi3516开发笔记(七):Hi3516虚拟机交叉开发环境搭建之交叉编译Qt
海思开发专栏 上一篇:<Hi3516开发笔记(六):通过HiTools使用USB/串口将uboot.kernel.rootfs和userdata按照分区表烧写镜像>下一篇:<Hi35 ...
- django中信号
# 信号的理解 在某个行为进行的某个阶段给这个行为添加一个附带的行为 # 相关api ## 数据表 pre_init # django的model执行其构造方法前,自动触发 post_init # d ...
- 【LeetCode贪心#04】跳跃游戏I + II
跳跃游戏 力扣题目链接(opens new window) 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示 ...
- DataGear 制作全国和省级地图联动的数据可视化看板
DataGear看板的图表联动功能,使您可以轻松制作支持图表联动的全国地图.省级地图数据可视化看板. 首先,新建两个数据集. 第一个是各省指标数据集,将用于绘制全国指标图表,它的SQL语句如下所示: ...
- 苏宁基于 AI 和图技术的智能监控体系的建设
汤泳,苏宁科技集团智能监控与运维产研中心总监,中国商业联合会智库顾问,致力于海量数据分析.基于深度学习的时间序列分析与预测.自然语言处理和图神经网络的研究.在应用实践中,通过基于 AI 的方式不断完善 ...
- 如何提取html中的token?
通过正则表达式提取(适用于提取文本结果): Re.seach()提取一个值,通过下标取值 Re.findall()提取多个值,通过下标取值 Resp= reques.get(url);print(re ...