Docker部署之使用docker-compose部署(全新的干净的服务器,从0开始搭建)

发布时间 2023-07-26 13:52:57作者: 不爱学习的摆烂王

部署环境准备

安装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各个属性的意义,这是一些常用的三个中间件的信息,其余的自己百度一下。

 

 

 

 

 

在这里重点理解一下数据卷持久化的意义:

  1. 如果我有一个镜像,该镜像是一个MySQL5.7的镜像,将它启动为一个容器后,发现这个镜像里的MySQL使用的字符集是utf8,现在我想将数据库使用的字符集更改为utf8mb4,怎么办?

 

  1. 如果是在物理机安装的MySQL,遇到上述问题,我们通常的做法是在MySQL的主配置文件 my.cnf 文件中指定使用哪个字符集并重启MySQL服务使之生效即可,对于docker容器,当然也可以使用这种方法,进入容器-->找到配置文件-->修改文件并保存-->重启容器内的服务(很多容器并没有安装vivim这些文本编辑器,还需要自己手动安装~~~!!!),可是如果一会又有了别的需求,比如,容器运行的MySQL服务缓慢,需要排查什么原因,这个时候怎么办呢?  还是重复上面的步骤  进入容器-->找到日志文件-->排查原因-->找到原因后修复问题?毫无疑问,这样是低效的方法。正是由于这些原因,docker提出了volume这个概念。

 

  1. 如果,能将容器内的所需要经常修改或者监控的文件放在宿主机并与容器内所在的原文件同步,那么这些痛点是不是就不是痛点了呢(也就是相互映射)?答案是肯定的,dockervolume就是互相映射宿主机和容器的文件的(比如将容器内的文件 A映射到了宿主机的家目录下,也就是家目录也有一个A文件,在容器内修改A文件,在宿主机家目录下的A文件也同时改变,同理,宿主机的A改变了,容器的A文件也改变 了,这样的情况,我们就称之为映射)。实现volume的前提是宿主机和容器可以互相的双向通信哦。(共享)

 

  1. 在制作docker-compose.yml文件时,遇到类似的问题可以按照这个方向对着百度找答案。

 

 

遇到的问题:

1. Mysql容器创建失败:

我遇到的原因是因为我进行数据卷持久化的文件mydata文件里面有内容

 

导致创建的时候不成功,没有发现这个问题的原因

我没有使用ls命令查看到底有没有内容,而是一直看findshell的可视化页面,导致一直没有发现。这个地方应该记住使用命令,有些东西属于隐藏文件,而命令可以看到。

忘记查看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; 不写会报错。