Docker compose使用实践

需求:有个SpringBoot项目,需要部署,依赖了mysql,redis,如果做到一键部署,相关的依赖能够自动安装(安装时,能以挂载的方式进行安装)

  • 以下是我实践后的精炼步骤
  1. 服务器安装docker与docker-compose,可以参考: //www.greatytc.com/p/0e3e8ea35e69
  2. 准备SpringBoot项目jar包,Dockerfile,docker-compose.yml 3个文件,放在服务器上的任意目录,建议放在 /tmp/目录下,例如 /tmp/len
    2-1 jar包,Maven正常打的jar包,该包为单纯可执行的jar包,与docker无关
    2-2 Dockerfile配置说明
# 基础镜像使用Java
FROM openjdk:8
# 作者
MAINTAINER len

COPY springBoot项目.jar springBoot项目.jar

ENTRYPOINT ["java","-jar","springBoot项目.jar"]

# 指定容器需要映射到主机的端口
EXPOSE 8080

2-3 docker-comopse 配置说明

# 指定我们docker-compose的版本
version: "3"
# 指定网络
networks:
  tip-network:
    #网络配置方式
    driver: bridge

# 设置我们的服务
services:

  # 配置nignx服务
  nginx:
    # nginx最新镜像
    image: nginx:latest
    # 定义容器名称
    container_name: nginx-compose
    # 配置nginx环境
    environment:
      - TZ=Asia/Shanghai
    # 配置端口
    ports:
      - "80:80"
    # 配置挂载的文件夹
    volumes:
      # 挂载文件,即docker命令的 -v
      - /home/len/conf/nginx/conf.d/:/etc/nginx/conf.d/
      - /home/len/conf/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /docker-cps/nginx/logs:/var/log/nginx
    # 自动重启
    restart: always
    networks:
      - test-network

  # 配置mysql服务
  mysql:
    image: mysql:8.0.20
    container_name: mysql-compose
    ports:
      - "3306:3306"
    # 配置环境,主要是配置我们的mysql的登陆密码,这些是必填,不填会报错
    environment:
      TZ: Asia/Shanghai
      MYSQL_DATABASE: len-test
      MYSQL_ROOT_PASSWORD: 123456
      # '%' 表示 root账号对所有网络都能登录使用,很关键
      MYSQL_ROOT_HOST: '%'

      # 配置挂载的文件夹
    volumes:
      - /docker-cps/mysql/conf:/etc/mysql
      # 该配置必加,解决 [ERROR] [MY-010095] 问题
      - /docker-cps/mysql/data:/var/lib/mysql-files/
      - /docker-cps/mysql/data:/var/lib/mysql
      - /docker-cps/mysql/logs:/var/log/mysql
      # 初始化数据库,mysql创建好后,可以通过该方式创建库,创建表,无需手动
      - /home/len/init/init_database.sql:/docker-entrypoint-initdb.d/init_database.sql
    # 设置命令
    command:
      [
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_bin',
        # 这行代码解决无法访问的问题
        '--default-authentication-plugin=mysql_native_password'
      ]

    # 自动重启
    restart: always
    # 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
    networks:
      - test-network

  # 配置redis服务
  redis:
    image: redis:latest
    container_name: redis-compose
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "6379:6379"
    # 同上,挂载文件夹
    volumes:
      # 配置文件(需要在宿主机路径上传redis.conf文件)
      - /docker-cps/redis/redis.conf:/etc/redis/redis.conf
      - /docker-cps/redis/data:/data
      - /docker-cps/redis/logs:/var/log/redis
    # 设置命令,通过这儿设置redis密码
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    restart: always
    networks:
      - test-network

  # 配置springboot服务
  springboot:
    # 生成镜像,用.它会自动去当前目录下面去找一个Dockerfile的文件,然后根据里面的配置去生成一个镜像
    build: .
    image: len-project:1.0.0
    container_name: len-project
    ports:
      - "8080:8080"
    working_dir: /
    # 将SpringBoot的项目配置文件外置,可以项目外进行修改
    command:
      - --spring.config.location=/home/biz/conf/application.yml
    volumes:
      - /docker-cps/len/shsd/:/home/shds
      - /home/len/conf:/home/len/conf
    # springboot依赖的服务,依赖的服务会先安装
    depends_on:
      - nginx
      - mysql
      - redis
    restart: always
    networks:
      - tip-network
  1. 创建挂载文件,将需要提前准备的初始化文件,手动修改的配置文件等文件,提前准备好。例如:nginx的配置文件,项目的前端包,SpringBoot的外置配置文件,Mysql的初始化语句等。
  2. 进入步骤2的 /tmp/len 目录,执行docker-compose命令
# 安装启动,1 先pull依赖镜像  2 安装
docker-compose up -d 
# 卸载移除
docker-compose down -v
  • 遇到的问题及解决步骤
  1. 配置有修改,执行down后,再执行up,会发现配置没有变化,是有缓存吗?

实际上是创建的挂载文件未移除,重新up的时候,读取是down之后的路径文件,看起来是缓存了,建议down之后,移除挂载的所有目录。

  1. Dockerfile文件有修改,重新执行up之后,会发现Dockerfile文件未生效,1中删除了,还有缓存吗?

Dockerfile文件的作用,是生成镜像,down只是处理容器,未处理镜像,要让修改的Dockerfile生效,则需要删除已生成的镜像,通过 docker images 查看,或者再执行 docker-compose up 的时候,加上 --build参数

  1. 安装mysql的时候,报错 mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
    2024-05-23T08:40:04.416953Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
    2024-05-23T08:40:04.416964Z 0 [ERROR] [MY-010119] [Server] Aborting

在mysql的compose配置文件中,增加该文件夹的挂载即可,例如: - /docker-cps/mysql/data:/var/lib/mysql-files/

  1. mysql安装之后,一般都需要设置密码,需要创建库,需要初始化项目的表,以及 mysql8 配置的root密码不生效的问题, 如何解决呢?

mysql安装后,有个/docker-entrypoint-initdb.d目录,可以放sql文件,docker安装成功后,会执行该目录下的文件,进行数据库的初始化,compose文件可以这么配置: - /home/len/init/init_database.sql:/docker-entrypoint-initdb.d/init_database.sql , 既然可以执行SQL,那么以上的问题都可以解决,在SQL文件中,加上以下语句即可。

# 修改密码  
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 密码';
# 创建库
CREATE DATABASE len_test CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
# 使用库
use len_test;
# 创建表等语句
...
  1. docker-compose 未设置网络,默认创建的网络,导致ssh连接宿主机网络失效

原因还未知,指定创建网络即可解决

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容