Skip to content

IDEA将项目部署在群晖Docker中

1. 业务需求

  1. 本地开发的项目, 需要远程连接群晖docker, 并将镜像发布
  2. 在群晖docker中运行项目

2. 在群晖中安装Docker套件

  1. 打开群晖的套件中心

  2. 搜索Container Manager套件进行安装

  3. 设置镜像仓库地址, 打开镜像仓库, 点击设置, 添加镜像仓库, 并点击使用

    http
    ### 新增镜像仓库, 设定名称如: 毫秒, 添加如下URL
    https://docker.1ms.run
  4. 可下载一些常用的镜像如: jre17等

  5. 创建共享文件夹docker, 给予http群组读写权限

3. 远程连接群晖Docker

  1. 控制面板中开启终端机, 启用SSH功能

  2. 使用xshell等工具连接群晖终端

  3. /var/packages/ContainerManager/etc/dockerd.json文件中添加属性

    bash
    #进入/var/packages/ContainerManager/etc文件夹, 编辑dockerd.json
    sudo -i
    cd /var/packages/ContainerManager/etc
    ls
    vi dockerd.json
    # 添加属性: "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
    # 注意多属性之间用逗号隔开
    # 使用sudo模式下进行编辑

4. 打开idea, 进行配置连接

  1. Idea-->设置(setting)-->构建(building)-->docker
  2. 添加连接
  3. 使用TCP连接, 键入URL: tcp://ip:2375, ip为群晖ip
  4. 应用即可

5. 项目中编写Dockerfile文件

  1. Dockerfile指令, 每条指令创建一个新的镜像层, 并对镜像进行提交, 能少则少原则

    dockerfile
    # 基础镜像, 当前新镜像是基于哪个镜像的
    FROM 
    # 镜像维护者的姓名, 不推荐用这个, 更推荐使用LABEL
    MAINTAINER
    # LABEL 镜像元数据, 应该是不算指令不会增加层数
    LABEL maintainer=$AUTHOR
    # RUN构建容器时运行的命令
    RUN
    # 当前容器对外保留出的端口
    EXPOSE
    # 指定在创建容器后终端默认登录进来的工作目录
    WORKDIR
    # 环境变量
    ENV
    # 将宿主机目录下的文件拷贝进容器, 并且会自动处理URL和解压tar压缩包
    ADD
    # 只进行拷贝
    COPY
    # 容器数据卷, 用于数据保存和持久化工作
    VOLUME
    # 指定一个容器启动时需要运行的命令, 可以有多个cmd命令, 但只生效最后一个
    CMD
    # 和cmd一样
    ENTRYPOINT
    # 当构建一个被继承的Dockerfile时运行此命令, 父镜像在被子镜像继承后, 父镜像的ONBUILD触发
    ONBUILD
    # 综上: FROM, COPY, EXPOSE, WORKDIR, ENTRYPOINT指令基本是必须的
    # ENV, VOLUME, 为了直观也需要
    # ARG: 仅用于构建时的环境变量
  2. 示例Dockerfile

    dockerfile
    # 声明基础镜像=>实际部署时,根据具体环境调整;默认是公网镜像
    FROM docker.1ms.run/joengenduvel/jre17:latest
    ## 声明变量:应用运行模式, 默认为prod, 启动时可以通过-e参数传入
    #ENV RUN_MODE="prod"
    # 声明变量:应用名称
    ARG APP_NAME=wenbot
    # 声明变量:应用开放端口
    ARG SERVER_PORT=9200
    # 声明变量: 容器工作目录
    ARG WORKDIR=/$APP_NAME
    # 声明变量: 作者
    ARG AUTHOR=zhangch
    # 声明变量: 应用target
    ARG TARGET_DIR=./wenbot-starter/target
    ## 系统编码
    #ENV LANG C.UTF-8
    ## 设置时区
    #ENV TZ Asia/Shanghai
    # 一行ENV
    ENV LANG=C.UTF-8 TZ=Asia/Shanghai RUN_MODE="prod"
    # 声明应用发布者、来源
    LABEL maintainer=$AUTHOR
    # 声明工作目录
    WORKDIR $WORKDIR
    # 设置容器时间和宿主机时间一致
    #RUN echo "Asia/Shanghai" > /etc/timezone
    #RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # 挂载配置文件目录和日志文件目录,
    VOLUME ["${WORKDIR}/logs","${WORKDIR}/config", "${WORKDIR}/.env"]
    # 声明端口,可设置多个,仅声明
    EXPOSE $SERVER_PORT
    # 声明变量:应用版本
    ARG APP_VERSION=0.0.1
    # 添加执行应用jar
    COPY ${TARGET_DIR}/${APP_NAME}-starter-${APP_VERSION}.jar app.jar
    # 添加外部配置文件目录到工作目录下的config文件夹, 挂载空目录会将配置目录覆盖为空, 解决不了就不需要这步
    #COPY ./robot-qq-boot/target/classes/config $WORKDIR/config
    # 容器运行后默认启动的命令
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar", "--spring.profiles.active=${RUN_MODE}"]
    1. 构建镜像, 但不要运行容器

    2. 打开群晖Container Manager, 点开映像列表, 查看构建好的镜像

    3. 运行

      • 可以选择镜像直接运行
      • 使用项目(docker-compose)运行

      推荐使用第二种

      1. docker文件夹下创建一个新的项目文件夹

      2. 创建好需要挂载的文件夹(可在镜像中查看其存储空间)

      3. ContainerManager中点击项目, 新增, 设定名称和路径

      4. 可上传docker-compose.yml, 或新建

        dockerfile
        services:
          wenbot:
            image: wenbot:0.0.1
            container_name: wenbot
            ports:
              - "9200:9200"
            # 挂载目录 挂载到宿主机的/volume1/docker/`项目名称`文件夹下
            volumes:
              - ./wenbot/logs:/wenbot/logs
              - ./wenbot/config:/wenbot/config
              - ./wenbot/.env:/wenbot/.env
              - ./wenbot/plugins:/wenbot/plugins
            # 设置网络, #若为默认的bridge, 有关服务间通讯的ip使用容器名即可
            network_mode: host
            restart: always

      好处:

      1. 当镜像有变动, 可停止项目进行构建, 会自动重新构建容器(老方法是停止容器, 删除旧容器, 创建新容器)

      2. 支持一个项目中构建多个容器, 使其处于同一环境下

6. 项目更新

  1. mvnw clean package
  2. 执行Dockerfile(仅构建镜像, 不运行容器)
  3. 群晖项目-->停止-->操作-->构建即可, 若有yaml修改则停止后修改

7. 常见问题

  1. 执行构建镜像后, 若已存在相同镜像, 则会将旧镜像的名称及标签设为none, 此为悬空镜像
  2. 只有在构建前删掉旧镜像才不会产生悬空镜像, 可设置定时清理计划
  3. 在8常用命令中查看处理方法

8. docker常用命令

bash
# 查看所有镜像
docker images
docker image ls
# 查看所有运行中的容器 -q:仅显示容器ID
docker ps
# 查看所有容器(包含未运行的)
docker ps -a
# 列出匿名卷
docker volume ps 
#删除`悬空`匿名卷(创建容器时未指定挂载空间导致产生匿名卷), 可加入定期清理计划, --force: 跳过确认提示
docker volume prune --force
# 查看镜像历史层, 示例: docker history nginx:latest
docker history image_name_or_id
# docker logs -f --tail 100 my_app, -f实时跟踪, --tail 100:显示最后一百行
docker logs -f --tail 100 my_app
# 查看容器资源占用 示例: docker stats --no-stream      # 仅显示当前状态
docker stats container_id_or_name
# 查看悬空镜像
docker images -f "dangling=true"
# 删除所有悬空镜像 -a: 删除所有未被使用的镜像(容器引用) --force:跳过确认
docker image prune
# 若需保留镜像,可为其添加标签:docker tag <image_id> my-image:keep
docker tag <image_id> my-image:keep

建议添加定时清理任务, 清理运行时产生的匿名卷和构建时产生的悬空镜像

上次更新于:

本站已运行: