开发者

docker-compose部署Java应用和相关依赖方式

目录
  • docker-compose部署Java应用和相关依赖
    • 1. 下载docker-compose
    • 3. 编写docker-compose启动的yml文件
    • 4. 停止docker-compose启动程序
  • 总结

    docker-compose部署Java应用和相关依赖

    上次用了docker远程部署之后,发现还是有点不方便的地方。2357上传了镜像之后,不会自动启动成容器,而且许多启动时的命令还要重新打。

    换台机器还要从偷装mysql和minio等等。网上看到能通过docker-compose进行一键部署。

    docker-compose部署分为以下几步:

    1. 下载docker-compose
    2. 编写build镜像相关的dockerfile
    3. 编写docker-compose启动的yml文件

    以本Java应用为例,dockerfile已经本地通过IDEA的docker-maven-plugin插件打好了,可以忽略第二步。直接进行1、3。

    1. 下载docker-compose

    curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    

    修改权限为可执行的

    chmod +x /usr/local/bin/docker-compose
    

    查看是否安装成功

    docker-compose --version

    3. 编写docker-compose启动的yml文件

    本地IDEA中编写docker-compose.yml,用于启动web应用启动所需要的依赖:

    version: '3'
    services:
      # 指定服务名称
      mysql:
        # 指定服务使用的镜像
        image: mysql:5.7
        # 指定容器名称
        container_name: mysql
        restart: always
        command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        # 指定服务运行的端口
        ports:
          - 3306:3306
        # 指定容器中需要挂载的文件
        volumes:
          - /mydata/mysql/data/db:/var/lib/mysql #数据文件挂载
          - /mydata/mysql/data/conf:/etc/mysql/conf.d #配置文件挂载
          - /mydata/mysql/log:/var/log/mysql #日志文件挂载
        # 指定容器的环境变量
        environment:
          - MYSQL_ROOT_PASSWORD=root
    
      # 指定服务名称
      minio:
        # 指定服务使用的镜LsABiPM像
        image: minio/minio
    编程客栈    # 指定容器名称
        container_name: minio
        restart: phpalways
        # 指定服务运行的端口
        ports:
          - 9000:9000 # api 端口
          - 9090:9090 # 控制台端口
        # 指定容器中需要挂载的文件
        volumes:
          - /mydata/minio/data:/data               #映射当前目录下的data目录至容器内/data目录
          - /mydata/minio/config:/root/.minio/     #映射配置目录
          - /etc/localtime:/etc/localtime
        # 指定容器的环境变量
        environment:
          MINIO_Access_KEY: minioadmin    #管理LsABiPM后台用户名
          MINIO_SECRET_KEY: minioadmin #管理后台密码,最小8个字符
        command: server -console-address ":9000" --address ":9090" /data  #指定容器中的目录 /data
      
      nginx:
        image: nginx:1.10
        restart: always
        container_name: nginx
        volumes:
          - /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf #配置文件挂载
          - /mydata/nginx/html:/usr/share/nginx/html #静态资源根目录挂载
          - /mydata/nginx/log:/var/log/nginx #日志文件挂载
          - #若用到ssl,可以引入
          - /mydata/nginx/ssl:/etc/nginx/ssl
        ports:
          - 80:80
          - 443:443
    

    docker-compose部署Java应用和相关依赖方式

    启动Java应用的yml:

    version: '3'
    services:
      # 指定服务名称
      mall-tiny-docker-compose:
        # 指定服务使用的镜像
        image: mall-tiny/mall-tiny:1.0.0-SNAPSHOT
        # 指定容器名称
        container_name: mall
        depends_on:
          - minio
          - mysql
        # 指定服务运行的端口
        ports:
          - 8080:8080
        # 指定容器中需要挂载的文件
        volumes:
          - /etc/localtime:/etc/localtime
          - /mydata/app/mall-tiny-docker-javascriptcompose/logs:/var/logs
        external_links:
          - minio:minio #可以用Redis这个域名访问redis服务
          - mysql:mysql #可以用mongo这个域名访问mongo服务

    之所以分开写是因为,启动完mysql还要手动输入sql文件生成数据库,再去跑web应用的Java应用的ym,不然会起不来,报数据库表找不到的error。

    先启动依赖:

    docker-compose -f docker-compose.yml up -d

    然后本地连上mysql导入相关的数据表后,启动web:

    docker-compose -f docker-compose-app.yml up -d

    此时均已按相关参数启动,可通过docker ps查看,也可能调服务验证。

    另外有几个命令参考:

    #停止所有相关容器
    docker-compose stop
    #列出所有容器信息
    docker-compose ps

    后续要想办法把数据库初始化也干了,绝对有方法的,不然一堆集群的话要怎么搞呢。看到一种方法是加启动指令,在但是也要再挂载的目录里把sql提前复制过去。

    这也不是一种很好的方法。也有是直接写脚本,把要打的sql都先放脚本里,到时候一键启动脚本创建目录和sql,再自动运行docker-compose的yml。

    这确实是一种方法,后面机器多了可以试试。

    command: --init-file /docker-entrypoint-initdb.d/init.sql

    4. 停止docker-compose启动程序

    • docker-compose stop:这个命令只会停止docker-compose运行的容器,不会删除容器。
    • docker-compose down:推荐,在停止docker-compose运行容器的同时,删除容器

    不过镜像还是都在的,想要删除镜像只能通过docker image rm的方式

    2022.11.19更新

    看到一种创建数据库容器的时候,也把sql初始化的方法。当Mysql容器首次启动时,会在 /docker-entrypoint-initdb.d目录下扫描 .sh,.sql,.sql.gz类型的文件。

    如果这些类型的文件存在,将执行它们来初始化一个数据库。这些文件会按照字母的顺序执行。

    那么,数据库的docker-compose的部分就能写成这样:

      mysql:
        image: mysql:8.0.30
        restart: always
        container_name: mysql
        volumes:
          - ../volumes/data/mysqldata:/var/lib/mysql
          - ./config/my.cnf:/etc/mysql/conf.d/my.cnf
          #      数据库还原目录 可将需要还原的sql文件放在这里
          - ./init/mysql:/docker-entrypoint-initdb.d
        environment:
          - "MYSQL_ROOT_PASSWORD=lilishop"
          - "MYSQL_DATABASE=lilishop"
          - "TZ=Asia/Shanghai"
        ports:
          - 3306:3306

    初始化就是这句:

    - ./init/mysql:/docker-entrypoint-initdb.d

    上传服务器的时候,把整个文件夹传上去,结构类似这种:

    docker-compose部署Java应用和相关依赖方式

    在当前文件夹运行docker-compose启动指令,即可创建数据库容器的时候,初始化数据库。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜